📝

DynamoDB Streams で AWS Lambda を使用するチュートリアルを AWS CLI でやってみた

に公開

チュートリアル: Amazon DynamoDB Streams で AWS Lambda を使用する - AWS Lambda
上記チュートリアルを AWS CLI でやってみました。

01. 実行ロール作成

以下の AWS CLI コマンドで作成しました。

$ aws iam create-role \
--role-name lambda-dynamodb-role \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}'

$ aws iam attach-role-policy \
--role-name lambda-dynamodb-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole

02. 関数作成

今回は JavaScript のコードを使用しました。

example.js
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
    console.log(JSON.stringify(event, null, 2));
    event.Records.forEach(record => {
        logDynamoDBRecord(record);
    });
};

const logDynamoDBRecord = (record) => {
    console.log(record.eventID);
    console.log(record.eventName);
    console.log(`DynamoDB Record: ${JSON.stringify(record.dynamodb)}`);
};

上記コードを example.js というファイルに記載して zip 化します。

$ zip function.zip example.js

以下の AWS CLI コマンドで関数を作成します。
アカウント ID は自身のアカウント ID に置換します。

$ aws lambda create-function --function-name ProcessDynamoDBRecords \
--zip-file fileb://function.zip --handler example.handler --runtime nodejs18.x \
--role arn:aws:iam::012345678901:role/lambda-dynamodb-role

03. 関数単体での動作確認

以下の内容で input.txt を作成します。

input.txt
{
   "Records":[
      {
         "eventID":"1",
         "eventName":"INSERT",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"111",
            "SizeBytes":26,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"2",
         "eventName":"MODIFY",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"222",
            "SizeBytes":59,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"3",
         "eventName":"REMOVE",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"333",
            "SizeBytes":38,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      }
   ]
}

以下の AWS CLI コマンドを実行します。

$ aws lambda invoke --function-name ProcessDynamoDBRecords \
--cli-binary-format raw-in-base64-out \
--payload file://input.txt outputfile.txt

# レスポンス
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

CloudWatch Logs から確認できる Lambda の実行ログでも問題なく実行できていることを確認できました。

04. DynamoDB テーブルを作成する

以下の AWS CLI コマンドで DynamoDB テーブルの作成およびストリームを有効化しました。

$ aws dynamodb create-table \
--table-name lambda-dynamodb-stream \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST

$ aws dynamodb update-table \
--table-name lambda-dynamodb-stream \
--stream-specification StreamEnabled=true,StreamViewType=KEYS_ONLY

05. Lambda でイベントソースを追加する

以下の AWS CLI コマンドで 追加しました。
DynamoDB-stream-arn は上述の update-table コマンドのレスポンスまたは DynamoDB のコンソールから確認できます。

aws lambda create-event-source-mapping --function-name ProcessDynamoDBRecords \
--batch-size 100 \
--starting-position LATEST \
--event-source DynamoDB-stream-arn

06. 動作確認

以下の AWS CLI コマンドでテストしました。

# データ追加
$ aws dynamodb put-item \
--table-name lambda-dynamodb-stream \
--item '{"id": {"S": "item1"}, "data": {"S": "This is item 1"}}'

# データ更新
$ aws dynamodb update-item \
--table-name lambda-dynamodb-stream \
--key '{"id": {"S": "item1"}}' \
--update-expression "SET #data = :newdata" \
--expression-attribute-names '{"#data": "data"}' \
--expression-attribute-values '{":newdata": {"S": "This is updated item 1"}}'

# データ削除
$ aws dynamodb delete-item \
--table-name lambda-dynamodb-stream \
--key '{"id": {"S": "item1"}}'

各コマンド実行後に Lambda の実行ログには以下のような記録が残っていました。

データ追加
{
    "Records": [
        {
            "eventID": "02e4e7166010ed274c95b7013c8abba8",
            "eventName": "INSERT",
            "eventVersion": "1.1",
            "eventSource": "aws:dynamodb",
            "awsRegion": "ap-northeast-1",
            "dynamodb": {
                "ApproximateCreationDateTime": 1747722841,
                "Keys": {
                    "id": {
                        "S": "item1"
                    }
                },
                "SequenceNumber": "22000000050914444837134",
                "SizeBytes": 7,
                "StreamViewType": "KEYS_ONLY"
            },
            "eventSourceARN": "arn:aws:dynamodb:ap-northeast-1:012345678901:table/lambda-dynamodb-stream/stream/2025-05-20T06:28:08.316"
        }
    ]
}
データ更新
{
    "Records": [
        {
            "eventID": "cb9d58c2b3cf1905d59db175505c002b",
            "eventName": "MODIFY",
            "eventVersion": "1.1",
            "eventSource": "aws:dynamodb",
            "awsRegion": "ap-northeast-1",
            "dynamodb": {
                "ApproximateCreationDateTime": 1747722985,
                "Keys": {
                    "id": {
                        "S": "item1"
                    }
                },
                "SequenceNumber": "30100003582026551344369",
                "SizeBytes": 7,
                "StreamViewType": "KEYS_ONLY"
            },
            "eventSourceARN": "arn:aws:dynamodb:ap-northeast-1:012345678901:table/lambda-dynamodb-stream/stream/2025-05-20T06:28:08.316"
        }
    ]
}
データ削除
{
    "Records": [
        {
            "eventID": "cfd3fffa45ad6d5631221b627e1a91a0",
            "eventName": "REMOVE",
            "eventVersion": "1.1",
            "eventSource": "aws:dynamodb",
            "awsRegion": "ap-northeast-1",
            "dynamodb": {
                "ApproximateCreationDateTime": 1747723044,
                "Keys": {
                    "id": {
                        "S": "item1"
                    }
                },
                "SequenceNumber": "33300003656151034256086",
                "SizeBytes": 7,
                "StreamViewType": "KEYS_ONLY"
            },
            "eventSourceARN": "arn:aws:dynamodb:ap-northeast-1:012345678901:table/lambda-dynamodb-stream/stream/2025-05-20T06:28:08.316"
        }
    ]
}

まとめ

今回は DynamoDB Streams で AWS Lambda を使用するチュートリアルを AWS CLI でやってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion