share facebook facebook2 twitter menu hatena pocket slack

2015.12.14 MON

DynamoDB Triggers (DynamoDB Streams + Lambda)のPythonでの練習

鈴木 宏康

WRITTEN BY鈴木 宏康

DynamoDB Triggers (DynamoDB Streams + Lambda)とは、
DynamoDBのテーブルへの操作を下図の用にDynamoDB StreamsでLambdaに送り
Lambdaのロジックで、その操作やデータに対して処理を行う仕組みです。

Untitled%289%29

詳しくは、こちらを参照です。

とりあえず練習なので、今回はDynamoDBに対しては、ノータッチです。
その代わり、Lambdaは便利なことにDynamoDBのサンプルEventを使って
テストすることが可能なので、この機能を使って練習します。

サンプルEventの設定

DynamoDB StreamsからのEventのテンプレートがあるので、それを指定します。

2015-10-13_03-31-40

2015-10-13_03-32-49

具体的なイベントは、こんな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

テスト

テストも簡単です。

2015-10-13_03-43-34

2015-10-13_03-37-21

無事、DynamoDBに関する情報(実際のテーブルのデータ)を取得することができました。

{
  "Message": {
    "S": "New item!"
  },
  "Id": {
    "N": "101"
  }
}

あとはPythonで煮るなり焼くなりって感じでです。

元記事はこちら

DynamoDB Triggers (DynamoDB Streams + Lambda)のPythonでの練習

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。