Cloud Functions + Slack Event API を利用したBotの作成(Verificationまで)
Slack で投稿されたメッセージに応じた処理を行いたくなったので、Slack の Event API を利用した Bot について調査と簡単な Echo Bot を作成してみようと思います。今回は Event API を利用するための認証を通すところまで。
App の作成
ひとまず Slack App を作成してトークンなどを取得する必要があります。こちらの記事を参考に SlackApp の設定を行いました。
Slack App の作り方を丁寧に残す【Bot と Event API の設定編】
どうやら Verification にも対応しないと行けないようです。いずれにしても Web でレスポンスしないといけないみたいなので実装を進めます。
Cloud Functions を利用
イベントドリブンに呼び出される API を構築できれば良いので、AWS Lambda などいろいろと選択肢はあると思いますが、今回は GCP の環境を利用したかったため Cloud Functions を利用してみます。GCP はほとんど利用したことがないのでセットアップから行いました。セットアップはこちらの記事を参考にしました。
Google Cloud Platform で SlackBot 開発【Slack App 認証編】 - こうりんのブログ
Cloud SDK のインストール
Cloud SDK のインストール | Google Cloud から必要なファイルをダウンロードして、展開します。google-cloud-sdk
というディレクトリがあるのでひとまずホームディレクトリ配下に設置しました。その後インストールスクリプトを実行します。
$ cd ~/Downloads
$ tar xf ./google-cloud-sdk-370.0.0-darwin-x86_64.tar.gz
$ mv google-cloud-sdk ~
$ cd
$ ./google-cloud-sdk/install.sh
インストール時の注意点
インストールスクリプトの最後の方で gcloud
コマンドへのパスを追加することができます。この gcloud
コマンドは展開されたディレクトリに存在するため、あらかじめホームディレクトリ配下に移動しておきました。
また Python3.7 をインストールしてくれます。既存のランタイムを利用できる設定があるようですが、面倒だったのでお任せにしました。結果 /usr/local/bin/python3
の参照先が 3.7
に切り替わってしまいました。
GCP 利用のための初期設定
gcloud
コマンドのための初期設定を行います。認可のためブラウザでログインしたりするステップがありますが、特に難しい点はありませんでした。
$ ./google-cloud-sdk/bin/gcloud init
Verification 用の実装
ランタイムは Python を利用するつもりだったのですが、Python のスクリプトがあったこちらを参考にしました。
Slack と Cloud Functions による業務効率化| Dentsu Digital Tech Blog | note
といっても CloudFunctions のお作法がわからなかったので、ひとまずチュートリアルを参考にしたりしながら実装を進めました。
- Python クイックスタート | Google Cloud Functions に関するドキュメント
- HTTP のチュートリアル | Google Cloud Functions に関するドキュメント
チュートリアルなどを一通りこなしてなんとなく以下のように理解できました。
- Cloud Build API も有効にする必要がある
- ひとまず
main.py
とrequirements.txt
が必要 functions_framework
で Cloud Functions のハンドラが受け取るイベント情報をよしなにやってくれる
スクリプトの内容
以下の main.py
をひとまずデプロイします。
import functions_framework
import json
@functions_framework.http
def verify(request):
headers = {"Content-Type": "application/json"}
body = request.get_json()
if body.get("type") == "url_verification":
res = json.dumps({"challenge": body["challenge"]})
return (res, 200, headers)
return ("{}", 400, headers)
requirements.txt
はこんな感じです。
functions-framework==3.0.0
この二つのファイルをデプロイします。
$ gcloud functions deploy echo-bot --entry-point verify \
--runtime python39 \
--trigger-http --allow-unauthenticated
実行結果に生成された URL が出てくるので、それを Slack の方に設定しました。入力して数秒後には Verified
と表示されました。
ひとまず今回はここまでです。作業内容は kawaken/slack-echo-bot に上げました。