##はじめに
個人的に開発しているアプリ(WrestleGO)を開発する際に使おうとして結局ボツったのですが、DynamoDBの変更イベントをトリガーにしてLambdaを実行させるということをやったので紹介します。Serverless Frameworkを使用して開発しました。
##動作時のバージョン
name | version |
---|---|
ServerlessFW | 1.3.0 |
node | 4.6.0 |
npm | 2.15.9 |
##事前準備
DynamoDBのテーブルでstreamを有効にしておく必要があるので設定します。
まずは、管理コンソールのDynamoDBから対象のテーブルを選択すると概要タブに"ストリームの管理"ボタンがあるのでこれを押下します。
すると以下のダイアログが表示されます。
テーブル変更イベントが来た際に得られる情報を選択します。処理に必要な情報を選択して有効化を押下します。
するとストリームが有効になります。ここで表示されるARNは後ほど使用します。
##設定ファイル
次にServerless側の準備です。serveless.yml
の編集を行います。functions
にトリガー対象となるDynamoDBテーブルを定義します。
arn
には事前準備で有効にしたストリームのARNを指定します。batchSize
というのはこのLambda関数一回のコールでどれだけ処理するかの数です。1件ずつなら1を設定します。最大は10000です。複数のレコードをいっぺんに処理するならLambda関数の中でループ処理が必要になります。startingPosition
というのは読み取りを開始する位置です。最新のものから順番に読み取る(LATEST
)か、読み取りされていないものを古い順から読み取る(TRIM_HORIZON
)かの2種類があります。時間順にデータを処理するならTRIM_HORIZON
、最新のデータを使用する設計ならLATEST
を設定します。enabled
はLambda関数に設定したこのトリガを有効(true
)にするか無効(false
)にするかです。
functions:
dynamotrigger:
handler: handler.dynamotrigger
events:
- stream:
arn: arn:arn:aws:dynamodb:us-east-1:XXXXXXXXXXXX:table/event_sample_table1/stream/2016-12-14T01:37:13.667
batchSize: 100
startingPosition: TRIM_HORIZON
enabled: true
- stream:
arn: arn:aws:dynamodb:us-east-1: XXXXXXXXXXXX:table/event_sample_table2/stream/2016-12-14T01:37:13.667
batchSize: 100
startingPosition: TRIM_HORIZON
enabled: true
##Lambda関数での処理
イベントトリガかどうかを判定してパラメータのトリガ元のARNから対象のDynamoDBのテーブルを割り出します。
module.exports.dynamotrigger = (event, context, callback) => {
if('Records' in event && event.Records.length != 0) {
// イベントトリガの場合
var source = event.Records[0].eventSourceARN;
// どのテーブルからのイベントか?arnの文字列からテーブル名を検索して判定
if(source.indexOf('/event_sample_table1/') != -1) {
// event_sample_table1テーブルからのトリガを受けて行う処理
}
else if(source.indexOf('/event_sample_table2/') != -1) {
// event_sample_table2テーブルからのトリガを受けて行う処理
}
else {
// 未知のイベント発火時処理
}
}
else {
// DynamoDBイベントトリガー以外の場合の処理(APIでも実行させたいとかあれば)
}
};
##まとめ
いかがでしたでしょうか?簡単すぎてびびってたじろぎますね。実際WrestleGOを開発するにあたり開発着手に踏み切ったのもServerless Frameworkを触ってその簡単さに驚愕し、「これならできる!」と思わせてくれたからです。現在もかなりのスピードでバージョンアップされているので今後もさらに期待が持てます。
※WrestleGOはアプリをXamarin.Formsで、APIをServerlessFrameworkを用いてAWSのAPI Gateway + Lambda + DynamoDBという構成で作られています。