この記事では、Azure App Service でホストされている Python Web アプリのカスタム スタートアップ ファイルを構成するタイミングと方法について説明します。 ローカル開発にはスタートアップ ファイルは必要ありませんが、Azure App Serviceは、デプロイされた Web アプリを Docker コンテナー内で実行します。Docker コンテナー内では、スタートアップ コマンドを指定した場合に使用できます。
次の状況では、カスタム スタートアップ ファイルが必要です。
カスタム Gunicorn 引数: Gunicorn の既定の Web サーバーを、既定値を超える追加の引数 (
--bind=0.0.0.0 --timeout 600) で起動する必要があります。代替フレームワークまたはサーバー: アプリは Flask または Django 以外のフレームワークを使用して構築されているか、Gunicorn ではなく別の Web サーバーを使用する必要があります。
標準以外の Flask アプリケーション構造: メイン コード ファイルに app.py または application.py以外の名前が付けられている Flask アプリ、またはアプリ オブジェクトに
appの名前が付けられている Flask アプリがあります。
つまり、プロジェクトのルート フォルダーに app.py または application.py ファイルがあり、その中に という名前の Flask アプリ オブジェクトが含まれている場合を除き、カスタム スタートアップ コマンドが必要です。
詳細については、「 Python アプリの構成 - コンテナーの起動プロセス」を参照してください。
前提条件
カスタム スタートアップ ファイルを構成する前に、Pythonを実行している既存のApp Service on Linuxが必要です。 App Service を作成するには、App Service の Python クイックスタートに従います。 Azure CLIを使用して App Service を作成することもできます。
az webapp create --resource-group <group> --plan <plan> --name <app-name> --runtime "PYTHON:3.12"
スタートアップ ファイルを作成する
カスタム スタートアップ ファイルが必要な場合は、次の手順に従います。
startup.txt、startup.sh、またはスタートアップ コマンドを含む別の名前のファイルをプロジェクトに作成します。 Django、Flask、およびその他のフレームワークの詳細については、この記事の後のセクションを参照してください。
スタートアップ ファイルには、必要に応じて複数のコマンドを含めることができます。
ファイルをコード リポジトリにコミットして、アプリの残りの部分と共にデプロイできるようにします。
Visual Studio Code で、アクティビティ バーの Azure アイコンを選択し、[ リソース] を展開し、サブスクリプションを検索して展開し、[ App Services] を展開して、App Service を右クリックして、[ ポータルで開く] を選択します。
Azure portal の左側のサービス メニューから、[設定]>[構成] を選択します。 App Service の [構成] ページで、[全般設定] を選択し、[スタック設定] にスタートアップ ファイルの名前 (startup.txt や startup.sh など) を入力します>[スタートアップ コマンド]、[保存] の順に選択します。
または、Azure CLIを使用してスタートアップ コマンドを設定することもできます。
az webapp config set --resource-group <group> --name <app-name> --startup-file "<startup-command>"注
スタートアップ コマンド ファイルを使用する代わりに、スタートアップ コマンド自体を Azure portal の [スタートアップ コマンド] フィールドに直接配置できます。 構成はリポジトリに格納されるため、スタートアップ コマンド ファイルを使用することをお勧めします。 これにより、バージョン管理で変更を追跡でき、他の Azure App Service インスタンスへの再デプロイが簡略化されます。
App Service の再起動を求められたら、[ 続行] を選択します。
アプリケーション コードをデプロイする前に Azure App Service サイトにアクセスすると、要求を処理できるコードがないため、"アプリケーション エラー" が表示されます。
Django スタートアップ コマンド
既定では、Azure App Service は、wsgi.py ファイルを含むフォルダーを検索し、次のコマンドを使用して Gunicorn を起動します。
# <module> is the folder that contains wsgi.py. If you need to use a subfolder,
# specify the parent of <module> using --chdir.
gunicorn --bind=0.0.0.0 --timeout 600 <module>.wsgi
タイムアウト値を 1,200 秒 (--timeout 1200) に増やすなど、Gunicorn 引数を変更する場合は、カスタム スタートアップ コマンド ファイルを作成します。 このメソッドは、既定の設定を特定の要件でオーバーライドします。 詳細については、「 コンテナーの起動プロセス - Django アプリ」を参照してください。
Flask のスタートアップ コマンド
既定では、App Service on Linuxは Flask アプリケーションが次の条件を満たしていることを前提としています。
- WSGI 呼び出し可能オブジェクトには、
appという名前が付けられています。 - アプリケーション コードは、 application.py または app.py という名前のファイルに含 まれています。
- アプリケーション ファイルは、アプリのルート フォルダーにあります。
プロジェクトがこの構造と異なる場合、カスタム スタートアップ コマンドは、フォーマット ファイル:app_objectでアプリ オブジェクトの場所を識別する必要があります。
別のファイル名またはアプリ オブジェクト名: アプリのメイン コード ファイルが hello.py され、アプリ オブジェクトの名前が
myappの場合、スタートアップ コマンドは次のようになります。gunicorn --bind=0.0.0.0 --timeout 600 hello:myappスタートアップ ファイルはサブフォルダーにあります。スタートアップ ファイルが myapp/website.py で、アプリ オブジェクトが
appされている場合は、Gunicorn の--chdir引数を使用してフォルダーを指定し、スタートアップ ファイルとアプリ オブジェクトに通常どおり名前を付けます。gunicorn --bind=0.0.0.0 --timeout 600 --chdir myapp website:appスタートアップ ファイルはモジュール内にあります。 python-sample-vscode-flask-tutorial コードでは、 webapp.py スタートアップ ファイルは 、__init__.pyファイルを 含むモジュールであるhello_appフォルダー内に含まれています。 アプリ オブジェクトは
appという名前で、 __init__.pyで定義されています。 webapp.py は相対インポートを使用します。この配置のため、Gunicorn を
webapp:appポイントすると、"パッケージ以外で相対インポートを試行しました" というエラーが発生し、アプリの起動に失敗します。このような場合は、モジュールからアプリ オブジェクトをインポートする shim ファイルを作成し、shim を使用して Gunicorn にアプリを起動させます。 たとえば 、python-sample-vscode-flask-tutorial コードには、次の内容の startup.py が含まれています。
from hello_app.webapp import appその後、スタートアップ コマンドは次のようになります。
gunicorn --bind=0.0.0.0 --workers=4 startup:app
詳細については、「 コンテナーの起動プロセス - Flask アプリ」を参照してください。
その他のフレームワークと Web サーバー
Python アプリを実行する App Service コンテナーには、Gunicorn Web サーバーと共に Django と Flask が既定でインストールされています。
Django や Flask 以外のフレームワーク ( Falcon、 FastAPI など) を使用する場合、または別の Web サーバーを使用する場合:
requirements.txt ファイルにフレームワークと Web サーバーを含めます。
スタートアップ コマンドで、Flask について説明した前のセクションに従って、WSGI 呼び出し可能オブジェクトを特定します。
Gunicorn 以外の Web サーバーを起動するには、サーバーを直接呼び出す代わりに
python -mコマンドを使用します。 たとえば、次のコマンドは、WSGI 呼び出し可能な名前が で、application.py にあると仮定してappサーバーを起動します。python -m uvicorn application:app --host 0.0.0.0python -mを使用するのは、requirements.txt によってインストールされた Web サーバーがPythonグローバル環境に追加されないため、直接呼び出すことができないためです。python -mコマンドは、現在の仮想環境内からサーバーを呼び出します。
アプリをデプロイする
スタートアップ ファイルを構成したら、アプリケーション コードを App Service にデプロイする必要があります。 Azure CLIまたは選択したデプロイ方法を使用します。
az webapp up --name <app-name>
デプロイ オプションの詳細については、「 デプロイのベスト プラクティス」を参照してください。