😎

【Serverless Framework】 DynamoDB Stream を設定して Lambda関数を呼び出す

2023/09/17に公開

thumbnail

はじめに

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

01



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

02



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