12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

エムティーアイAdvent Calendar 2016

Day 15

ServerlessでDynamoDBの更新イベントをトリガーとしてLambdaを実行する

Last updated at Posted at 2016-12-14

##はじめに
個人的に開発しているアプリ(WrestleGO)を開発する際に使おうとして結局ボツったのですが、DynamoDBの変更イベントをトリガーにしてLambdaを実行させるということをやったので紹介します。Serverless Frameworkを使用して開発しました。

##動作時のバージョン

name version
ServerlessFW 1.3.0
node 4.6.0
npm 2.15.9

##事前準備
DynamoDBのテーブルでstreamを有効にしておく必要があるので設定します。
まずは、管理コンソールのDynamoDBから対象のテーブルを選択すると概要タブに"ストリームの管理"ボタンがあるのでこれを押下します。
SnapCrab_NoName_2016-12-14_10-21-40_No-00.png

すると以下のダイアログが表示されます。
テーブル変更イベントが来た際に得られる情報を選択します。処理に必要な情報を選択して有効化を押下します。
SnapCrab_NoName_2016-12-14_10-21-50_No-00.png

するとストリームが有効になります。ここで表示されるARNは後ほど使用します。
SnapCrab_NoName_2016-12-14_10-38-20_No-00.png

##設定ファイル
次に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)にするかです。

serverless.yml
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のテーブルを割り出します。

handler.js
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という構成で作られています。

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?