はじめに
Azure Bot Service を試す場合、Bot Framweork SDK を使ったチュートリアルとしては下記が提供されています。
この記事では、以下の Echo Bot がサンプルコードとして提供されている。
この記事自体は、Bot Framework Emulator を利用して Bot の動作確認をするところまでが紹介されており、そこまでは問題なく動作する。
ただし、記事にリンクされた App Service へのデプロイで上記サンプルをそのままデプロイすると、App Service 上では、正しく起動できず、Web Chat をはじめ Botのバックエンドが動作しない状態となります。
発生しうるエラー
App Service 上で、アプリが起動できず、.azurewebsites.net には 504.0 GatewayTimeout 応答が返されることになります。
Bot Service からのエンドポイントに指定してある アプリ名.azurewebsites.net/api/messages も応答を得られない状態となります。
その結果、Web Chat をはじめ、Bot が何の応答も返さないという状態となります。
Bot Service のポータルからは以下のような表示となります。
App Service 側の起動ログは以下のような内容で再起動が繰り返されることになります。
App Service のログについては以下の記事を参考
回避策
スタートアップコマンドに以下を追記することで正常にアプリケーションが起動できます。
gunicorn --bind 0.0.0.0 --worker-class aiohttp.worker.GunicornWebWorker --timeout 600 app:APP
解説
最初のチュートリアルでローカル起動させる際は、python app.py
でプログラムをスタートさせていました。
一方 App Service では、下記の記事にあるとおり、Python アプリ用のスタートアップコマンドが自動で生成されるものとなります。
サンプルの EchoBot は Flask プロジェクトではありませんが、app.pyが含まれるため、以下の起動スクリプトがデフォルトで適用されます。
gunicorn --bind=0.0.0.0 --timeout 600 app:app
一方で app.py
の中身は以下の通り、APP
という名前で aiohttp
のサーバーを提供しています。
APP = web.Application(middlewares=[aiohttp_error_middleware])
APP.router.add_post("/api/messages", messages)
if __name__ == "__main__":
try:
web.run_app(APP, host="localhost", port=CONFIG.PORT)
except Exception as error:
raise error
そのため、app.py
を gunicorn
から起動できるようにするためには、前述のカスタムスタートアップコマンドが必要となります。
Oryx
によるスタートアップコマンドとカスタムコマンドについては下記記事も参考にしてください。