😎
【Serverless Framework】 DynamoDB Stream を設定して Lambda関数を呼び出す
はじめに
ServerlessFramework
を利用してDynamoDB Stream
を設定し、Lambda関数
を呼び出せるようにする方法を備忘録として投稿させていただきます。
環境
ServerlessFramework
NodeJS:18
01. DynamoDB Stream の有効化
serverless.ymlでDynamoDB Streamを有効化する。
serverless.yml
Resources:
DDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: xxxxx
# 略
# DynamoDB Stream を 有効化する
StreamSpecification:
# 表示タイプ
# キーのみ:KEYS_ONLY
# 新しいイメージ:NEW_IMAGE
# 古いイメージ:OLD_IMAGE
# 新旧イメージ:NEW_AND_OLD_IMAGES
StreamViewType: NEW_AND_OLD_IMAGES
02. Lambda関数のトリガー設定
serverless.ymlでLambda関数のトリガーにDynamoDB Streamを指定する。
serverless.yml
functions:
xxxxx:
runtime: nodejs18.x
handler: app/xxxxx.handler
timeout: 15
memorySize: 128
events:
# トリガーに DynamoDB Stream を指定する
- stream:
type: dynamodb
arn:
Fn::GetAtt:
- DDBTable
- StreamArn
03. DynamoDBで項目の登録・更新・削除が発生
DynamoDBで項目が登録・更新・削除されるとLambda関数が呼び出される。
- 項目が追加された場合、
eventName: 'INSERT'
として通知される - 項目が変更された場合、
eventName: 'MODIFY'
として通知される - 項目が削除された場合、
eventName: 'REMOVE'
として通知される
Lambda関数(JS)
exports.handler = function (event) {
// event.Recordsに配列形式でDynamoDBの登録・更新・削除情報が通知される
event.Records.map((record) => {
// #=> record: 項目が追加された場合
// {
// eventID: 'xxxxx',
// eventName: 'INSERT',
// eventVersion: '1.1',
// eventSource: 'aws:dynamodb',
// awsRegion: 'xxxxx',
// dynamodb: {
// ApproximateCreationDateTime: xxxxx,
// Keys: { xxxxx: { S: 'xxxxx' }, ID: { S: 'xxxxx' } },
// NewImage: {
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' }
// },
// SequenceNumber: 'xxxxx',
// SizeBytes: xxxxx,
// StreamViewType: 'NEW_AND_OLD_IMAGES'
// },
// eventSourceARN: 'xxxxx'
// }
//
// #=> record: 項目が変更された場合
// {
// eventID: 'xxxxx',
// eventName: 'MODIFY',
// eventVersion: '1.1',
// eventSource: 'aws:dynamodb',
// awsRegion: 'xxxxx',
// dynamodb: {
// ApproximateCreationDateTime: xxxxx,
// Keys: { xxxxx: { S: 'xxxxx' }, xxxxx: { S: 'xxxxx' } },
// NewImage: {
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' }
// },
// OldImage: {
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' }
// },
// SequenceNumber: 'xxxxx',
// SizeBytes: xxxxx,
// StreamViewType: 'NEW_AND_OLD_IMAGES'
// },
// eventSourceARN: 'xxxxx'
// }
//
// #=> record: 項目が削除された場合
// {
// eventID: 'xxxxx',
// eventName: 'REMOVE',
// eventVersion: '1.1',
// eventSource: 'aws:dynamodb',
// awsRegion: 'xxxxx',
// dynamodb: {
// ApproximateCreationDateTime: xxxxx,
// Keys: { xxxxx: { S: 'xxxxx' }, xxxxx: { S: 'xxxxx' } },
// OldImage: {
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' },
// xxxxx: { S: 'xxxxx' }
// },
// SequenceNumber: 'xxxxx',
// SizeBytes: xxxxx,
// StreamViewType: 'NEW_AND_OLD_IMAGES'
// },
// eventSourceARN: 'xxxxx'
// }
});
};
Discussion