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 Container Registry に Docker イメージを作成し、Azure App Service にデプロイします。 Web アプリは、デプロイ時に Azure Container Registry から Docker イメージをプルするために、システム割り当てマネージド ID (パスワードレス接続) と Azure ロールベースのアクセスで構成されます。 デプロイには、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 アカウント。 Azure サブスクリプションをお持ちでない場合は、始める前に無料アカウントを作成してください。
Docker イメージを作成して App Service にデプロイするための Azure CLI。 必要に応じて、Docker イメージを作成してローカル環境でテストするための Docker と Docker CLI。
サンプル コードを入手する
ローカル環境で、コードを取得します。
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart
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 login コマンドを実行して、Azure にサインインします。
az login
az upgrade コマンドを実行して、Azure CLI のバージョンが最新であることを確認します。
az upgrade
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
Note
レジストリ名は、Azure 上で一意の名前にする必要があります。 エラーが発生した場合は、別の名前を試してください。 レジストリ名は 5 ~ 50 文字の英数字で構成できます。 ハイフンとアンダースコアは使用できません。 詳細については、「Azure Container Registry の名前規則」を参照してください。 別の名前を使用する場合は、次のセクションでレジストリとレジストリ アーティファクトを参照するコマンドで、
webappacr123
ではなく、自分で付けた名前を使用してください。Azure Container Registry は、Azure Container Instances、Azure App Service、Azure Kubernetes Service、その他のサービスで使用するイメージを保存するプライベート Docker レジストリです。 レジストリを作成するときは、名前、SKU、リソース グループを指定します。
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
環境変数を、サブスクリプション ID に設定します。 これは、次のコマンドの
--scope
パラメーターで使用されます。SUBSCRIPTION_ID=$(az account show --query id --output tsv)
環境変数を作成するコマンドは、Bash シェル用です。 他の環境に合わせて構文を変更します。
az webapp create コマンドを使用して、Web アプリを作成します。
az webapp create \ --resource-group web-app-simple-rg \ --plan webplan --name webappsimple123 \ --assign-identity [system] \ --role AcrPull \ --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/web-app-simple-rg \ --acr-use-identity --acr-identity [system] \ --container-image-name webappacr123.azurecr.io/webappsimple:latest
注:
Web アプリの名前は、Azure 内で一意である必要があります。 エラーが発生した場合は、別の名前を試してください。 名前には英数字とハイフンを使用できますが、先頭または末尾にハイフンを使用することはできません。 詳細については、「Microsoft.Web の名前規則」を参照してください。
Azure Container Registry に
webappacr123
以外の名前を使用している場合は、--container-image-name
パラメーターを適宜更新してください。--assign-identity
パラメーター、--role
パラメーター、および--scope
パラメーターを使用すると、Web アプリでシステム割り当てマネージド ID が有効になり、リソース グループにAcrPull
ロールが割り当てられます。 これにより、リソース グループ内の任意の Azure Container Registry からイメージをプルするためのアクセス許可がマネージド ID に付与されます。--acr-use-identity
パラメーターと--acr-identity
パラメーターは、システム割り当てマネージド ID を使用して Azure Container Registry からイメージをプルするように Web アプリを構成します。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 で、グループを削除することもできます。
次のステップ
詳細については、次のリソースを参照してください。