DynamoDBの変更を検知してLambda関数を実行する

最近IoT機器を活用した業務改善を行っており、その過程でDynamoDBやLambda関連の知見が得られたので共有します。

背景

DynamoDBに保存されているデータをリアルタイムで監視し、データが変更された際にLambda関数を実行する必要がありました。DynamoDBに保存されているデータの値に応じて、IoTデバイスへ信号を送信し、機器の動作を制御するためです。

DynamoDBを監視する方法として、DynamoDB Streamを利用することにしました。

DynamoDB Stream

DynamoDB Streamは、DynamoDBテーブルに対する変更をリアルタイムでキャプチャする機能です。DynamoDBテーブルに対するPut、Update、Deleteなどの操作が行われた際に、LambdaをはじめとしたいくつかのAWSサービスイベントを送信します。

DynamoDB StreamはDynamoDBのダッシュボードで有効にします。

Lambda関数

DynamoDB Streamを有効にしたあと、連携したいLambda関数のトリガーにDynamoDBを指定し、DynamoDB Streamからのイベントを受け取るように設定します。

トリガーに設定後、DynamoDBテーブルに対する変更があった際にLambda関数が実行されます。

イベントの形式

DynamoDB Streamからのイベントは、下記のようなJSON形式でlambda_handler()のevent引数に渡されます。

 1{
 2  "event": {
 3    "Records": [
 4      {
 5        "eventID": "xxxxxxxxxxxx",
 6        "eventName": "MODIFY",
 7        "eventVersion": "1.1",
 8        "eventSource": "aws:dynamodb",
 9        "awsRegion": "ap-northeast-1",
10        "dynamodb": {
11          "ApproximateCreationDateTime": 1719483746,
12          "Keys": {
13            "username": { "S": "hodanov" } },
14          "NewImage": {
15            "status": { "S": "離席" },
16            "stamp": { "N": "1719451927" },
17            "username": { "S": "hodanov" }
18          },
19          "OldImage": {
20            "status": { "S": "通話中" },
21            "stamp": { "N": "1719451927" },
22            "username": { "S": "hodanov" }
23          },
24          "SequenceNumber": "xxxxxxxxxxxxxxxx",
25          "SizeBytes": 130,
26          "StreamViewType": "NEW_AND_OLD_IMAGES"
27        },
28        "eventSourceARN": "arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/hoge/stream/2016-11-16T06:00:00.000"
29      }
30    ]
31  }
32}
  • eventName: イベントの種類 (INSERT, MODIFY, REMOVE)
  • dynamodb.NewImage: 変更後のデータ
  • dynamodb.OldImage: 変更前のデータ

変更後のデータのみ取得したり、eventNameの種類によってトリガーを絞ることも可能です。

まとめ

DynamoDBの変更をリアルタイムで検知して、他のAWSサービスと連携できるDynamoDB Streamという機能を利用しました。

DynamoDB周りはAWS公式のチュートリアルも充実しているので、詳細な設定方法や利用方法は公式ドキュメントを参照されると良いでしょう。