はじめに
RDBMSを使っていると、allとかで全件取得出来て特に気にする必要がないのですが、DynamoDBでは1MBまでのデータ量の件数のみしか取得が出来ないので、知っていないとあれ全件取得出来ていない...みたいなことになり私のように痛い目にあってしまうので、自分への戒めの意味も込めて残しておきます。
情報ソース:DynamoDB でのスキャンの使用
環境
- Nodejs
 
実装
const AWS = require('aws-sdk');
const DynamoDB = new AWS.DynamoDB.DocumentClient({region: "ap-northeast-1"});
const tableName = 'hoges';
module.exports.hello = async (event, context) => {
    try {
        // scan用のパラメーターをセット
        const params = {
            TableName: tableName
        }
        // scanで取得したデータを格納する空の配列を定義しておく
        let items = []
        const scan = async () => {
            const result = await DynamoDB.scan(params).promise()
            items.push(...result.Items)
            // scanリクエストを行なった時にLastEvaluatedKeyがあれば、再帰的にリクエストを繰り返す
            if (result.LastEvaluatedKey){
                params.ExclusiveStartKey = result.LastEvaluatedKey
                await scan()
            }
        }
        await scan()
        const count = items.length
        for (let i = 0; i < count; i++){
            console.log(`id: ${items[i]['id']}`)
        }
        console.log(`Execution result: ${count}`)
    } catch (err) {
        console.error(`[Error]: ${JSON.stringify(err)}`)
        return err
    }
}