🐍

Bolt for Pythonの落とし穴

2024/12/06に公開

環境情報

Docker Composeで作成しています。

Docker Composeで登録していた環境変数

以下のように設定していました。

.env
SLACK_CLIENT_ID=xxxxxxxxxxxxx.xxxxxxxxxxxxx
SLACK_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SLACK_SIGNING_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SLACK_BOT_TOKEN=xoxb-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx

アプリケーション構成

  • Python: 3.12.8
  • fastapi: 0.110.0
  • slack_bolt: 1.21.3
  • slack_sdk: 3.33.5
  • uvicorn: 0.27.1

ソースコード

app.py
from os import environ
from fastapi import FastAPI, Request
from slack_bolt import App
from slack_bolt.adapter.fastapi import SlackRequestHandler


bolt_app = App(
    token=environ.get("SLACK_BOT_TOKEN"),
    signing_secret=environ.get("SLACK_SIGNING_SECRET"),
    installation_store=None,
    authorize=None
)

# for debug.
print("Bolt App Token:", bolt_app._token)
print("Bolt App Signing Secret:", bolt_app._signing_secret)


app_handler = SlackRequestHandler(bolt_app)
fast_api = FastAPI()


@fast_api.post("/slack/commands")
async def slack_events_endpoint(request: Request):
    return await app_handler.handle(request)

@bolt_app.command("/test")
def handle_test_command(ack, body, say):
    ack()
    say(f"Hello, <@{body['user_id']}>! Your command works!")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app="app:fast_api", host="0.0.0.0", port=3040, reload=True)

発生した問題

アプリ起動後、Slack上でコマンドを実行すると以下のようなレスポンスがあった。

DeepL翻訳曰く、「申し訳ございませんが、原因不明の理由により、このアプリをインストールすることができなくなりました。 このアプリをワークスペースに再インストールしてください。」とのこと。

エラーログ確認

ログを確認したところ下記の状態になっていた。

root@xxxxxxxxxxxx:/app# /usr/local/bin/python /app/app.py
As installation_store or authorize has been used, token (or SLACK_BOT_TOKEN env variable) will be ignored.
INFO:     Will watch for changes in these directories: ['/app']
INFO:     Uvicorn running on http://0.0.0.0:3040 (Press CTRL+C to quit)
INFO:     Started reloader process [7487] using WatchFiles
As installation_store or authorize has been used, token (or SLACK_BOT_TOKEN env variable) will be ignored.
As installation_store or authorize has been used, token (or SLACK_BOT_TOKEN env variable) will be ignored.
INFO:     Started server process [7494]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

原因分析

上記のエラーメッセージ「As installation_store or authorize has been used, token (or SLACK_BOT_TOKEN env variable) will be ignored.」が原因である可能性が高いため、
これに関連する情報を調査すると、Stack Over Flowに以下の記事が見つかった。
https://stackoverflow.com/questions/74716129/slack-bolt-python-although-the-app-should-be-installed-into-this-workspace-th

解決策

SLACK_CLIENT_IDSLACK_CLIENT_SECRETを削除したところ正常に動作しました。

まとめ

boltのAppは初期化時に環境変数のSLACK_CLIENT_IDSLACK_CLIENT_SECRETを読み込み起動するため、SLACK_BOT_TOKENが使用されなかった。

  1. 環境変数名に以下を使用せず独自の変数名で登録し、os.environ等で呼び出す。

    • SLACK_CLIENT_ID
    • SLACK_CLIENT_SECRET
    • SLACK_SIGNING_SECRET
    • SLACK_BOT_TOKEN

  2. 環境変数にSLACK_BOT_TOKENSLACK_SIGNING_SECRETのみを登録する。

GitHubで編集を提案

Discussion