DynamoDB Triggers (DynamoDB Streams + Lambda)とは、
DynamoDBのテーブルへの操作を下図の用にDynamoDB StreamsでLambdaに送り
Lambdaのロジックで、その操作やデータに対して処理を行う仕組みです。
詳しくは、こちらを参照です。
とりあえず練習なので、今回はDynamoDBに対しては、ノータッチです。
その代わり、Lambdaは便利なことにDynamoDBのサンプルEventを使って
テストすることが可能なので、この機能を使って練習します。
サンプルEventの設定
DynamoDB StreamsからのEventのテンプレートがあるので、それを指定します。
具体的なイベントは、こんなJSONです。
{ "Records": [ { "eventID": "1", "eventVersion": "1.0", "dynamodb": { "Keys": { "Id": { "N": "101" } }, "NewImage": { "Message": { "S": "New item!" }, "Id": { "N": "101" } }, "StreamViewType": "NEW_AND_OLD_IMAGES", "SequenceNumber": "111", "SizeBytes": 26 }, "awsRegion": "us-west-2", "eventName": "INSERT", "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "eventSource": "aws:dynamodb" }, { "eventID": "2", "eventVersion": "1.0", "dynamodb": { "OldImage": { "Message": { "S": "New item!" }, "Id": { "N": "101" } }, "SequenceNumber": "222", "Keys": { "Id": { "N": "101" } }, "SizeBytes": 59, "NewImage": { "Message": { "S": "This item has changed" }, "Id": { "N": "101" } }, "StreamViewType": "NEW_AND_OLD_IMAGES" }, "awsRegion": "us-west-2", "eventName": "MODIFY", "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "eventSource": "aws:dynamodb" }, { "eventID": "3", "eventVersion": "1.0", "dynamodb": { "Keys": { "Id": { "N": "101" } }, "SizeBytes": 38, "SequenceNumber": "333", "OldImage": { "Message": { "S": "This item has changed" }, "Id": { "N": "101" } }, "StreamViewType": "NEW_AND_OLD_IMAGES" }, "awsRegion": "us-west-2", "eventName": "REMOVE", "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", "eventSource": "aws:dynamodb" } ] }
Lambda(Python)のコード
こんな、お手軽コードです。
import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): try: logger.info(event) response = event['Records'][0]['dynamodb']['NewImage'] logger.info(response) return response except Exception as e: logger.error(e) raise e
テスト
テストも簡単です。
無事、DynamoDBに関する情報(実際のテーブルのデータ)を取得することができました。
{ "Message": { "S": "New item!" }, "Id": { "N": "101" } }
あとはPythonで煮るなり焼くなりって感じでです。