LoginSignup
10
5

More than 5 years have passed since last update.

LambdaでSlackBot作って学んだこと

Posted at

AWS LambdaでSlackBot作ってみました。
詰まったことやその対処法を共有します。

0.記事の要約3行で

・Lambdaは処理を複数回実行する場合がある
・だから、Lambdaを使う場合は冪等性を考慮した設計を行う
・Slackメッセージを処理する場合は、event_idでチェックする

1.作ったもの

SlackからJIRAに課題投稿するBotを作りました。
JIRA-PON.jpg

Botにメンションメッセージを送ると、
メッセージを分解して、タイトルと説明文をJIRAに投稿してくれます。
メール内容をぱっと課題登録したいときとかに便利です。

仕組は以下です。
JIRA-PON概要図.jpg

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に登録して処理継続するようにしました。
JIRA-PON概要図2.jpg

DynamoDBは、NoSQLのDBでAWSからボタン数クリックでテーブルが作れて便利ですね。LambdaからAPI経由でデータ登録/参照も容易です。

4.おわりに

今回はBotKitを使わずに、Lambdaで実装しました。
サーバレスなので無料(月100万回コールまで)+サーバ準備手間不要なのが魅力的ですね。
次に作るときはSQSを使ってみようと思います。
使ってみてわかった問題もあるのでどんどん共有していきます!
より良い実装方法などいろいろ教えてくださると幸いです^^

10
5
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
10
5