📝
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