Flask または FastAPI Web アプリをコンテナーとして Azure App Service にデプロイする
このチュートリアルでは、Web App for Containers 機能を使用して、Python Flask または FastAPI Web アプリを Azure App Service にデプロイする方法を示します。 Web App for Containers は、フル マネージド Azure App Service プラットフォームを活用しながら、アプリとそのすべての依存関係を 1 つにまとめてデプロイできるアーティファクトも必要とする開発者にとって、簡単な導入手段となります。 Azure でのコンテナーの使用について詳しくは、Azure コンテナーのオプションの比較に関するページを参照してください。
このチュートリアルでは、Docker CLI と Docker を使用して、必要に応じて Docker イメージを作成し、ローカルでテストします。 また、Azure CLI を使用して Azure に Docker イメージを作成し、Azure App Service にデプロイします。 デプロイには、Azure Tools Extension をインストールした Visual Studio Code を使用することもできます。 Azure Container Apps で実行する Docker イメージのビルドと作成の例については、「Flask または FastAPI Web アプリを Azure Container Apps にデプロイする」を参照してください。
Note
このチュートリアルでは、App Service で実行できる Docker イメージの作成方法を示します。 この手順は App Service の使用に必須ではありません。 Docker イメージを作成せずに、ローカル ワークスペースから App Service に直接コードをデプロイすることもできます。 例については、「クイックスタート: Python (Django または Flask) Web アプリを Azure App Service にデプロイする」を参照してください。
前提条件
このチュートリアルを完了するには、以下が必要です。
Web アプリを Azure App Service および Azure Container Registry にデプロイできる Azure アカウント。
Docker イメージを作成して App Service にデプロイするための Azure CLI。 必要に応じて、Docker イメージを作成してローカル環境でテストするための Docker と Docker CLI。
サンプル コードの入手
ローカル環境で、コードを取得します。
Dockerfile と .dockerignore ファイルを追加する
Dockerfile を追加して、このファイルで Docker にイメージのビルド方法を指示します。 Dockerfile では、Flask および FastAPI フレーム ワークに Web 要求を転送する本番レベルの Web サーバーとして、Gunicorn を使用するように指定します。 ENTRYPOINT コマンドと CMD コマンドで、Gunicorn にアプリ オブジェクトへの要求を処理するように指示します。
# syntax=docker/dockerfile:1
FROM python:3.11
WORKDIR /code
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 50505
ENTRYPOINT ["gunicorn", "app:app"]
この例では、コンテナー ポート (内部) に 50505
を使用していますが、任意の空きポートを使用できます。
requirements.txt ファイルに gunicorn
が含まれていることを確認します。
Flask==2.2.2
gunicorn
Werkzeug==2.2.2
.dockerignore ファイルを追加して、このファイルでイメージから除外する不要なファイルを指定します。
.git*
**/*.pyc
.venv/
gunicorn を構成する
Gunicorn は、gunicorn.conf.py ファイルを使用して構成できます。 gunicorn.conf.py ファイルが gunicorn の実行ディレクトリと同じディレクトリにある場合、Dockerfile でそのファイルの場所を指定する必要はありません。 構成ファイルの指定の詳細については、「Gunicorn の設定」を参照してください。
このチュートリアルでは、推奨される構成ファイルにより、使用可能な CPU コアの数に基づいてワーカーの数を増やすように gunicorn を構成します。 gunicorn.conf.py ファイルの設定の詳細については、「Gunicorn の構成」を参照してください。
# Gunicorn configuration file
import multiprocessing
max_requests = 1000
max_requests_jitter = 50
log_file = "-"
bind = "0.0.0.0:50505"
workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers
timeout = 120
イメージをローカルでビルドして実行する
イメージをローカルでビルドします。
Note
docker build
コマンドがエラーを返す場合は、docker デーモンが実行されていることを確認します。 Windows で、Docker Desktop が実行されていることを確認します。
Docker コンテナー内にイメージをローカルで実行します。
docker run --detach --publish 5000:50505 flask-demo
ブラウザーで http://localhost:5000
URL を開き、Web アプリがローカルで実行されていることを確認します。
--detach
オプションは、コンテナーをバックグラウンドで実行します。 --publish
オプションは、コンテナー ポートをホスト上のポートにマップします。 ホスト ポート (外部) がペアの 1 番目で、コンテナー ポート (内部) が 2 番目です。 詳細については、Docker 実行リファレンスを参照してください。
リソース グループと Azure Container Registry を作成する
az group create コマンドを使用して、グループを作成します。
az group create --name web-app-simple-rg --location eastus
Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 リソース グループを作成するときは、eastus などの場所を指定します。
az acr create コマンドを使用して、Azure Container Registry を作成します。
az acr create --resource-group web-app-simple-rg \ --name webappacr123 --sku Basic --admin-enabled true
Note
レジストリ名は、Azure 上で一意の名前にする必要があります。 エラーが発生した場合は、別の名前を試してください。 レジストリ名は 5 ~ 50 文字の英数字で構成できます。 ハイフンとアンダースコアは使用できません。 詳細については、「Azure Container Registry の名前規則」を参照してください。 別の名前を使用する場合は、次のセクションでレジストリとレジストリ アーティファクトを参照するコマンドで、
webappacr123
ではなく、自分で付けた名前を使用してください。Azure Container Registry は、Azure Container Instances、Azure App Service、Azure Kubernetes Service、その他のサービスで使用するイメージを保存するプライベート Docker レジストリです。 レジストリを作成するときは、名前、SKU、リソース グループを指定します。 2 番目のコマンドでは、az credential show コマンドを使用してパスワードを変数に保存します。 パスワードは、後の手順でレジストリに対する認証に使用されます。
レジストリに対するパスワードの値を環境変数に設定します。
ACR_PASSWORD=$(az acr credential show \ --resource-group web-app-simple-rg \ --name webappacr123 \ --query "passwords[?name == 'password'].value" \ --output tsv)
環境変数を作成するコマンドは、Bash シェル用です。 他のシェル用には、構文と行連結文字 (
\
) を適宜変更してください。また、Azure ポータルからパスワード (
ACR_PASSWORD
) を取得することもできます。そのためには、レジストリに移動し、[アクセス キー] を選択して、パスワードをコピーします。
Azure Container Registry でイメージをビルドする
az acr build コマンドを使用して、Azure で Docker イメージをビルドします。 このコマンドは、現在のディレクトリにある Dockerfile を使用して、イメージをレジストリにプッシュします。
az acr build \
--resource-group web-app-simple-rg \
--registry webappacr123 \
--image webappsimple:latest .
--registry
オプションでレジストリ名を指定し、--image
オプションでイメージ名を指定します。 イメージ名の形式は registry.azurecr.io/repository:tag
です。
Azure に Web アプリをデプロイする
az appservice plan コマンドを使用して、App Service プランを作成します。
az appservice plan create \ --name webplan \ --resource-group web-app-simple-rg \ --sku B1 \ --is-linux
az webapp create コマンドを使用して、Web アプリを作成します。
az webapp create \ --resource-group web-app-simple-rg \ --plan webplan --name webappsimple123 \ --docker-registry-server-password $ACR_PASSWORD \ --docker-registry-server-user webappacr123 \ --role acrpull \ --deployment-container-image-name webappacr123.azurecr.io/webappsimple:latest
注:
Web アプリの名前は、Azure 内で一意である必要があります。 エラーが発生した場合は、別の名前を試してください。 名前には英数字とハイフンを使用できますが、先頭または末尾にハイフンを使用することはできません。 詳細については、「Microsoft.Web の名前規則」を参照してください。
Azure Container Registry に
webappacr123
以外の名前を使用している場合は、--docker-registry-server-user
および--deployment-container-image-name
パラメーターを適宜更新してください。Web アプリが作成されるまで数分かかる場合があります。 az webapp log tail コマンドを使用して、デプロイ ログを確認できます。 たとえば、
az webapp log tail --resource-group web-app-simple-rg --name webappsimple123
のようにします。 「warmup」というエントリがあれば、コンテナーはデプロイされています。Web アプリの URL は
<web-app-name>.azurewebsites.net
です (https://webappsimple123.azurewebsites.net
など)。
更新して再デプロイする
コードを変更した後、az acr build コマンドと az webapp update コマンドを使用して、App Service に再デプロイできます。
クリーンアップ
このチュートリアルで作成されるすべての Azure リソースは同じリソース グループ内にあります。 リソース グループを削除して、リソース グループ内のすべてのリソースを削除することが、アプリで使用されているすべての Azure リソースを削除する最も簡単な方法です。
リソースを削除するには、az group delete コマンドを使用します。
az group delete --name web-app-simple-rg
Azure ポータルで、または Visual Studio Code と Azure Tools Extension で、グループを削除することもできます。
次のステップ
詳細については、次のリソースを参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示