LoginSignup
1
0

Azure App ServiceでFastAPIが起動しない場合の対処方法 / Deploy FastAPI on Azure app service

Last updated at Posted at 2023-10-21

Azure App ServiceでFastAPIが起動しない場合の対処方法

GitHubのAzure-SamplesにあるFastAPIをAzure App Serviceで起動させたところ、正しく起動しない現象が発生しました。

ローカル環境では以下のコマンドでFastAPIの起動が確認できたのですが。。。

python -m venv .venv
.\.venv\Scripts\activate.bat
pip install uvicorn
pip install gunicorn
pip install -r requirements.txt

uvicorn main:app --reload

Azure App Serviceで起動すると以下のような画面が表示されて正常にFastAPIが起動していない現象になりました。

image.png

ログを確認するとFrameworkが見つからないメッセージが見つかりました。

image.png

No framework detected; using default app from /opt/defaultsite

Startup Commandで起動スクリプトを直接設定する方法を試してみました。

/home/site/wwwroot/startup.sh

image.png

ログを確認すると指定したサービス名が見つからないエラーが発生していました。

ただし、ログの内容が変わったのでStartup Commandの変更は効果があるようです。

image.png

[Error -2] Name or service not known

Googleで検索したところ、StackOverflowに対処方法が見つかりました。

記事を読むとgunicornを使うと起動できるようです。

gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

Startup Commandで指定したstartup.shを修正して試してみました。

しかし、これでは正常に起動しませんでした。

image.png

追記:/home/site/wwwroot/startup.shからstartup.shに変更したところ、この方法でも正常に起動しました。

どうも、zipファイルを展開した後のパスを直接指定する必要はないようです。

このブランチからクローンを作って、Startup CommandにStartup.shを設定する方法がシンプルかと思います。

image.png

Stackoverflowの記事と同じくStartup Commandへ直接gunicornを指定してみました。

gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

image.png

ログを確認すると正常に起動してFastAPIの画面が確認できました。

image.png

image.png

記事にはOryxはGunicornを使わないといけない説明がありました。

Azure App Service for Linux with its Oryx build runner when identifies Python web apps run them using Gunicorn, a WSGI server. So your startup script can have gunicorn command to spin up the FastAPI app with the help of Gunicorn's worker class uvicorn.workers.UvicornWorker.

ChatGPTにOryxについて聞いてみるとOryxが自動的にランタイムを選択してくれるようですが、この機能がうまく動かなかったのが原因のようです。

Oryx は、Microsoft Azureの一部として、特にAzure App ServiceやAzure Functionsでのアプリケーションのビルドと実行をサポートするためのツールです。Oryxは、複数のプログラミング言語とプラットフォームを自動的に検出してビルド・実行することができます。
たとえば、あなたがAzure App ServiceにNode.js、Python、.NET Core、PHP、Rubyなどのアプリケーションをデプロイするとき、Oryxはそのソースコードを適切にビルドし、適切なランタイムを選択して実行します。これにより、開発者はアプリケーションのデプロイに必要な具体的なビルド手順やランタイムの詳細を気にすることなく、簡単にアプリケーションをAzureにデプロイできるようになります。
Oryxは、これらのタスクを自動的に処理するためのビルドと実行の環境を提供し、Azure上でのアプリケーションのライフサイクルをシームレスにサポートします。

Azure App Serviceを使う場合にはOryxに気を付けたいと思います。
また、Azure App Service for LinuxとAzure App Service for Windowsでも挙動が変わりそうです。

gunicornは、UNIXベースのシステムを対象としたWSGI HTTPサーバーであり、元々はLinuxやmacOSのようなUNIXベースの環境向けに設計されています。そのため、公式にはWindowsをサポートしていません。

あと、他にも以下のような対処方法があるようです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0