AWS で動く Slack の echo bot を CDK で作った。
AWS の CDK を勉強したいと思ってるときに Slack の bot を作りたいと思ったので CDK の勉強を兼ねて Slack のメンションを bot に飛ばすとメンションを返す echo bot を作ってみた。
全体像
利用する AWS のサービス
一応、無料枠の範囲で。
Slack echo bot の動かし方
Slack アプリの作成
https://api.slack.com/apps から Slack echo bot のアプリを作る。
Slack echo bot は以下の OAuth scopes を付与しておく。
app_mentions:read
chat:write
この時点ではまだ Slack echo bot を AWS にデプロイしていないのでイベントのサブスクリプションはしないでおく。
Slack echo bot のデプロイ
cdk deploy
コマンドを実行して Slack echo bot を AWS にデプロイする。
SLACK_BOT_USER_ACCESS_TOKEN
は https://api.slack.com/apps/your-app-id/general
の Bot User OAuth Access Token
を入力して SLACK_SIGNING_SECRET
は https://api.slack.com/apps/your-app-id/oauth
の Signing Secret
を入力。
cdk deploy
コマンドの出力の Outputs
の SlackEchoBotStack.slackbotendpointEndpointxxxxxxxx
の URL は Slack echo bot アプリのイベントサブスクリプションの設定で使うのでメモしておく。
$ cdk deploy --context SLACK_BOT_USER_ACCESS_TOKEN=your-app-access-token --context SLACK_SIGNING_SECRET=your-app-signing-secret Outputs: SlackEchoBotStack.slackbotendpointEndpointxxxxxxxx = https://xxxxxxxxxx.execute-api.any-region.amazonaws.com/prod/
Slack アプリのイベントサブスクリプション
https://api.slack.com/apps/your-app-id/event-subscriptions
を表示して Enable Events
を On
にしてさきほどメモしておいた Outputs
の URL を Request URL
に入力する。
Verified
が表示すれば OK.
あと Subscribe to bot events
のとこで app_mention
をサブスクライブしておく。
動作確認
Slack で bot にメンションを飛ばして bot がメンションを返してきたら成功。
bot がメンションを返してこないときは https://api.slack.com/apps/your-app-id/event-subscriptions
を表示して bot がイベントをサブスクリプションできているかとか、API Gateway とか Lambda のログを CloudWatch Logs で確認して問題ありそうなとこを見つけていく。
作ってるときのこと
Slack アプリがサブスクライブしてるイベントが発生すると Slack から Slack アプリにリクエストが飛ぶ。
このときアプリは 3秒以内にレスポンスを返す 必要があるのだけど bot を Lambda 上に構築するとレスポンスが3秒以内に収まらないことがちょいちょいあるようだったので、Lambda 関数は API Gateway から起動するやつ (長いので Lambda-1 としておく) と API Gateway から起動する Lambda から起動するやつ (長いので Lambda-2 としておく) の2つを使うようにした。
Lambda-1 は Lambda-2 を非同期で起動と API Gateway に 200
を返してて、Lambda-2 は処理本体 (echo するだけなんだけど) をやってる。
あと Slack echo bot はリクエストが本当に Slack からのものかを確認するためにリクエスト署名を使ってる。 Slack の Slash Command をサーバーレスで実装 がすごく参考にさせていただいた。
あと最後になってしまうけど Slack x API Gateway x Lambda(Python) x RDSでChatOpsをしてみた は思いっきり参考にさせていただいた。こちらのページを見てなかったらそもそも Slack の bot を作ろうって気にならなかったかも。
注意しておきたいこととか
Slack echo bot は CDK の勉強で実験的に作ってみたやつなので、bot を実際に運用するときは bot ユーザーの OAuth Access Token や署名に使う Signing Secret は AWS Secrets Manager を利用するか KMS で暗号化することを強く推奨。