What is the recommended way to delete a large number of items from DynamoDB?

前端 未结 7 2159
情歌与酒
情歌与酒 2020-11-29 21:51

I\'m writing a simple logging service in DynamoDB.

I have a logs table that is keyed by a user_id hash and a timestamp (Unix epoch int) range.

When a user of

7条回答
  •  执念已碎
    2020-11-29 22:38

    I'm dropping this again.

    Here's a lambda I did in nodeJS. It will perform a full scan on the table, then batch delete every 25 items per request.

    Remember to change TABLE_NAME.

    const AWS = require('aws-sdk');
    
    const docClient = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });
    
    //const { TABLE_NAME } = process.env;
    TABLE_NAME = "CHANGE ME PLEASE"
    
    exports.handler = async (event) => {
        let params = {
            TableName: TABLE_NAME,
        };
    
        let items = [];
        let data = await docClient.scan(params).promise();
        items = [...items, ...data.Items];
    
        while (typeof data.LastEvaluatedKey != 'undefined') {
            params.ExclusiveStartKey = data.LastEvaluatedKey;
    
            data = await docClient.scan(params).promise();
            items = [...items, ...data.Items];
        }
    
        let leftItems = items.length;
        let group = [];
        let groupNumber = 0;
    
        console.log('Total items to be deleted', leftItems);
    
        for (const i of items) {
            const deleteReq = {
                DeleteRequest: {
                    Key: {
                        id: i.id,
                    },
                },
            };
    
            group.push(deleteReq);
            leftItems--;
    
            if (group.length === 25 || leftItems < 1) {
                groupNumber++;
    
                console.log(`Batch ${groupNumber} to be deleted.`);
    
                const params = {
                    RequestItems: {
                        [TABLE_NAME]: group,
                    },
                };
    
                await docClient.batchWrite(params).promise();
    
                console.log(
                    `Batch ${groupNumber} processed. Left items: ${leftItems}`
                );
    
                // reset
                group = [];
            }
        }
    
        const response = {
            statusCode: 200,
            //  Uncomment below to enable CORS requests
            //  headers: {
            //      "Access-Control-Allow-Origin": "*"
            //  },
            body: JSON.stringify('Hello from Lambda!'),
        };
        return response;
    };
    
    

提交回复
热议问题