2015年10月13日火曜日

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


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


詳しくは、こちらを参照です。
Amazon DynamoDB のトリガー

とりあえず練習なので、今回は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で煮るなり焼くなりって感じでです。

0 コメント: