AWS LambdaでSlackBot作ってみました。
詰まったことやその対処法を共有します。
0.記事の要約3行で
・Lambdaは処理を複数回実行する場合がある
・だから、Lambdaを使う場合は冪等性を考慮した設計を行う
・Slackメッセージを処理する場合は、event_idでチェックする
1.作ったもの
Botにメンションメッセージを送ると、
メッセージを分解して、タイトルと説明文をJIRAに投稿してくれます。
メール内容をぱっと課題登録したいときとかに便利です。
Lambdaでメッセージを受けたら、そのままJIRA APIをコールして、
JIRAに課題を投稿します。
完了したらSlackAPIでメッセージを返します。
2.詰まったこと
たまにBotが同じ課題を2つ登録することがありました。
調べてみると1回のSlackメッセージを2回処理していました。
どうやらLambdaはたまに内部で処理エラーを起こして、再度処理を実行する仕組みのようです。
以下の記事がとても参考になりました。
https://dev.classmethod.jp/cloud/aws/lambda-idempotency/
Lambdaを使う際は「再処理されても同じ結果になる実装」すなわち「冪等性」の考慮が重要とのこと!
3.解決方法
Slackメッセージ固有のID(event_id)をチェックする仕組みを導入。
DynamoDBにIDを保存して、LambdaではまずIDをDynamoDBのデータと突合せチェックして、同じIDじゃなければDyanamoDBに登録して処理継続するようにしました。
DynamoDBは、NoSQLのDBでAWSからボタン数クリックでテーブルが作れて便利ですね。LambdaからAPI経由でデータ登録/参照も容易です。
4.おわりに
今回はBotKitを使わずに、Lambdaで実装しました。
サーバレスなので無料(月100万回コールまで)+サーバ準備手間不要なのが魅力的ですね。
次に作るときはSQSを使ってみようと思います。
使ってみてわかった問題もあるのでどんどん共有していきます!
より良い実装方法などいろいろ教えてくださると幸いです^^