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 CLIDocker を使用して、必要に応じて 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 イメージを作成してローカル環境でテストするための DockerDocker CLI

サンプル コードの入手

ローカル環境で、コードを取得します。

git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git

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

イメージをローカルでビルドして実行する

イメージをローカルでビルドします。

docker build --tag flask-demo .

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 を作成する

  1. az group create コマンドを使用して、グループを作成します。

    az group create --name web-app-simple-rg --location eastus
    

    Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 リソース グループを作成するときは、eastus などの場所を指定します。

  2. 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 コマンドを使用してパスワードを変数に保存します。 パスワードは、後の手順でレジストリに対する認証に使用されます。

  3. レジストリに対するパスワードの値を環境変数に設定します。

    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 アプリをデプロイする

  1. az appservice plan コマンドを使用して、App Service プランを作成します。

    az appservice plan create \
    --name webplan \
    --resource-group web-app-simple-rg \
    --sku B1 \
    --is-linux
    
  2. 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 CodeAzure Tools Extension で、グループを削除することもできます。

次のステップ

詳細については、次のリソースを参照してください。