全力で怠けたい

怠けるために全力を尽くしたいブログ。

AWS で動く Slack の echo bot を CDK で作った。

f:id:ebc_2in2crc:20200510200243p:plain:w400

AWS の CDK を勉強したいと思ってるときに Slack の bot を作りたいと思ったので CDK の勉強を兼ねて Slack のメンションを bot に飛ばすとメンションを返す echo bot を作ってみた。

=> Slack echo bot

全体像

f:id:ebc_2in2crc:20200510192956j:plain

利用する 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 botAWS にデプロイしていないのでイベントのサブスクリプションはしないでおく。

Slack echo bot のデプロイ

cdk deploy コマンドを実行して Slack echo botAWS にデプロイする。

SLACK_BOT_USER_ACCESS_TOKENhttps://api.slack.com/apps/your-app-id/generalBot User OAuth Access Token を入力して SLACK_SIGNING_SECREThttps://api.slack.com/apps/your-app-id/oauthSigning Secret を入力。

cdk deploy コマンドの出力の OutputsSlackEchoBotStack.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 EventsOn にしてさきほどメモしておいた 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 で確認して問題ありそうなとこを見つけていく。

f:id:ebc_2in2crc:20200510200243p:plain:w400

作ってるときのこと

Slack アプリがサブスクライブしてるイベントが発生すると Slack から Slack アプリにリクエストが飛ぶ。 このときアプリは 3秒以内にレスポンスを返す 必要があるのだけど bot を Lambda 上に構築するとレスポンスが3秒以内に収まらないことがちょいちょいあるようだったので、Lambda 関数は API Gateway から起動するやつ (長いので Lambda-1 としておく) と API Gateway から起動する Lambda から起動するやつ (長いので Lambda-2 としておく) の2つを使うようにした。 Lambda-1 は Lambda-2 を非同期で起動と API Gateway200 を返してて、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 で暗号化することを強く推奨。

参考サイト