Cloud Functions + Slack Event API を利用したBotの作成(Verificationまで)

2022-04-02  /  SlackGCPPython

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 のお作法がわからなかったので、ひとまずチュートリアルを参考にしたりしながら実装を進めました。

チュートリアルなどを一通りこなしてなんとなく以下のように理解できました。

スクリプトの内容

以下の 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 に上げました。