はじめに
今回もDynamoDBのチュートリアルを実施しました。
最後はLambdaでのトリガー作成です。
(バックナンバー)
1.DynamoDB テーブル作成
2.IAMポリシー/ロール作成
3.SNSトピック作成
4.Lambda関数作成/テスト
5.1 トリガー作成用ARN情報取得
今回はDynamoDBのレコードに新しい項目が追加された場合にSNSトピックを発行するようにしたいので、LambdaのイベントソースとなるDynamoDBのトリガーを作成する必要があります。
まずはそれに必要なDynamoDBのARNを取得します。
aws dynamodb describe-table --table-name BarkTable
--table-name
- 書式 : --table-name
(value)
情報を表示するテーブル名。
出力結果
コマンドを実行すると最後の方にARNが出力されます。
...
},
"LatestStreamLabel": "2020-01-28T17:05:04.444",
"LatestStreamArn": "arn:aws:dynamodb:region:xxxxxxxxxxxx:table/BarkTable/stream/2020-01-28T17:05:04.444"
}
}
5.2 トリガー作成
aws lambda create-event-source-mapping \
--region us-east-1 \
--function-name publishNewBark \
--event-source streamARN \
--batch-size 1 \
--starting-position TRIM_HORIZON
※Lambda作成時と同じオプションの説明は省略します
※--regionは例によって自分の環境に置き換えましょう
--event-source
- 書式 : --event-source
(value)
イベントソースのARNを指定。
公式リファレンスでは--event-source-arn
となっていますが、両方試したところこれはどちらでも実行可能のようです。
--batch-size
- 書式 : --batch-size
(value)
単一のバッチで取得するアイテムの最大数。
今回の場合で言うと、DynamoDBへの書き込み→SNS実行を最大でまとめていくつ実行するかの設定。
通常は負荷テストをしながら適切な値を設定する(でないとスループットが死ぬ)のですが、今回はチュートリアルで且つ手動書き込みなので1件で十分です。
--starting-position
- 書式 : --starting-position TRIM_HORIZON or LATEST or AT_TIMESTAMP
読み取りを開始するストリーム内の位置。(DynamoDB Streamsかkinesisのみ使用可能)
各オプションの効果については下記の通り。
- TRIM_HORIZON : 読み取りされていないものを古い順から読み取る。先入れ先出し(FIFO)
- LATEST : 最新のものから順番に読み取る。後入れ先出し(LIFO)
- AT_TIMESTAMP : 指定時刻以降のものを読み取る(--starting-position-timestampで開始時刻を指定。kinesis専用)
5.3 トリガーのテスト
テストとして、DynamoDBにアイテムを追加してみます。
(実行してメールが飛んでくれば成功)
aws dynamodb put-item \
--table-name BarkTable \
--item Username={S="Jane Doe"},Timestamp={S="2016-11-18:14:32:17"},Message={S="Testing...1...2...3"}
--table-name
- 書式 : --table-name
(value)
追加するアイテムを格納するテーブル名。
--item
- 書式 : --table-name
(attribute)
={(datatype)
(value)
} or JSON
追加するアイテムを格納するテーブル名。データ型(datatype)の「S」は文字列の意味。
また、JSON形式で書いたファイルをfile://item.json
のように指定する方法もある。
(当然ながら)主キーは必ず含めないといけないので注意。
終わりに
亀のごときスピードでしたが、これにてDynamoDBのチュートリアルは終わりました。
感想としては、基本的なところがまだまだ全然把握できていないな、というところでした。
他のチュートリアルもやろうかと思っていますが、どこまで記事にするかはちょっと考え中です(マンネリ化しそうなので)