Share via


Azure Container Apps と PostgreSQL を使用して Python Web アプリを構築してデプロイする

この記事は、Python Web アプリをコンテナー化して Azure Container Apps にデプロイする方法に関するチュートリアルの一部です。 Container Apps を使うと、複雑なインフラストラクチャを管理することなく、コンテナー化されたアプリをデプロイできます。

チュートリアルのこの部分では、Python サンプル Web アプリ (Django または Flask) をコンテナー化してデプロイする方法について説明します。 具体的には、クラウド内にコンテナー イメージを構築し、それを Azure Container Apps にデプロイします。 コンテナー アプリが、サンプル アプリがデータを保存する Azure Database for PostgreSQL - フレキシブル サーバー インスタンスに接続できるようにする環境変数を定義します。

このサービス図は、この記事で取り上げるコンポーネント、つまりコンテナー イメージの構築とデプロイを強調しています。

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

サンプル アプリを入手する

サンプル コードをフォークして、開発環境に複製します。

ステップ 1. サンプル アプリの GitHub リポジトリ (Django または Flask) に移動し、[Fork] を選択します。

手順に従って、GitHub アカウントにディレクトリをフォークします。 フォークや GitHub アカウントを使用せずにローカル コンピューターにコード リポジトリを直接ダウンロードすることもできますが、このチュートリアルで後述する CI/CD を設定できなくなります。

ステップ 2. git clone コマンドを使用して、フォークしたリポジトリを python-container フォルダーに複製します。

# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container

# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container

手順 3. ディレクトリを変更します。

cd python-container

Web アプリ コードからコンテナー イメージをビルドする

次の手順を実行すると、サンプル コードからビルドされた Docker コンテナー イメージを含む Azure Container Registry が作成されます。

Azure CLI コマンドは、Azure Cloud Shell で、または Azure CLI がインストールされているワークステーション上で実行できます。

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

az group create \
--name pythoncontainer-rg \
--location <location>

<location> は、az account list-locations -o table コマンドで出力される Azure の場所の Name 値のいずれかです。

ステップ 2. az acr create コマンドを使用してコンテナー レジストリを作成します。

az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled

<registry-name> は Azure 内で一意にする必要があり、英数字で 5 から 50 文字にする必要があります。

管理者用に作成された資格情報は、次の方法で表示できます。

az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg

手順 3. Sign in to the registry using the az acr login コマンドを使用して、レジストリにサインインします。

az acr login --name <registry-name>

このコマンドは、名前に "azurecr.io" を追加して、完全修飾レジストリ名を作成します。 成功した場合、"Login Succeeded" (ログインに成功しました) というメッセージが表示されます。 レジストリが作成されたサブスクリプションとは異なるサブスクリプションからレジストリにアクセスする場合、--suffix スイッチを使用します。

ステップ 4. az acr build コマンドを使用してイメージをビルドします。

az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .

以下の点に注意してください。

  • コマンドの最後にあるドット (".") は、ビルドするソース コードの場所を示します。 サンプル アプリのルート ディレクトリでこのコマンドを実行しない場合、コードへのパスを指定してください。

  • Azure Cloud Shell でコマンドを実行する場合は、git clone を使用して最初にリポジトリを Cloud Shell 環境にプルし、ディレクトリをプロジェクトのルートに変更して、ドット (".") が正しく解釈されるようにします。

  • -t (--image と同じ) オプションを指定しなかった場合、このコマンドでは、ローカル コンテキスト ビルドがレジストリにプッシュされずにキューに入れられます。 プッシュなしのビルドは、イメージがビルドされるか確認する場合に便利です。

ステップ 5: az acr repository list コマンドを使用して、コンテナー イメージが作成されたことを確認します。

az acr repository list --name <registry-name>

PostgreSQL フレキシブル サーバー インスタンスを作成する

サンプル アプリ (Django または Flask) は、PostgreSQL データベースにレストランのレビュー データを格納します。 これらの手順では、データベースを含むサーバーを作成します。

Azure CLI コマンドは、Azure Cloud Shell で、または Azure CLI がインストールされているワークステーション上で実行できます。

ステップ 1. az postgres flexible-server create コマンドを使用して、Azure に PostgreSQL サーバーを作成します。 このコマンドの実行が完了するまで数分かかることは珍しくありません。

az postgres flexible-server create \
   --resource-group pythoncontainer-rg \
   --name <postgres-server-name>  \
   --location <location> \
   --admin-user <admin-username> \
   --admin-password <admin-password> \
   --sku-name Standard_D2s_v3 \
   --public-access 0.0.0.0 
  • "pythoncontainer-rg" → このチュートリアルで使用するリソース グループ名。 別の名前を使用した場合は、この値を変更します。

  • <postgres-server-name> → PostgreSQL データベース サーバー名。 この名前は Azure 全体で一意である必要があります。 サーバー エンドポイントは "https://<postgres-server-name>.postgres.database.azure.com" です。 使用できる文字は "A"-"Z"、"0"-"9"、"-" です。

  • <location> → Web アプリに使用したのと同じ場所を使用します。 <location> は、az account list-locations -o table コマンドで出力される Azure の場所の Name 値のいずれかです。

  • <admin-username> →管理者アカウントのユーザー名。 これを "azure_superuser"、"admin"、"administrator"、"root"、"guest"、"public" にすることはできません。 このチュートリアルでは、"demoadmin" を使用します。

  • <admin-password> 管理者ユーザーのパスワード。 これには、次のうちの 3 つのカテゴリの、8 から 128 文字が含まれている必要があります。英大文字、英小文字、数字、英数字以外の文字のうち、3 つのカテゴリの文字が含まれている必要があります。

    重要

    ユーザー名またはパスワードを作成するとき、"$" 文字は使用しないでください。 後で、これらの値を使用して環境変数を作成しますが、Python アプリの実行に使用する Linux コンテナー内では、環境変数内の "$" 文字に特殊な意味があります。

  • <sku-name> → 価格レベルとコンピューティング構成の名前。たとえば "Standard_D2s_v3" とします。 詳しくは、「Azure Database for PostgreSQL の価格」をご覧ください。 利用可能な SKU を一覧表示するには、az postgres flexible-server list-skus --location <location> を使用します。

  • <public-access> → "0.0.0.0" を使用します。これにより、Container Apps などの任意の Azure サービスからサーバーへのパブリック アクセスが許可されます。

Note

Azure CLI 以外のツールを使用してローカル ワークステーションから PostgreSQL サーバーを操作する予定の場合は、az postgres flexible-server firewall-rule create コマンドを使用してファイアウォール規則を追加する必要があります。

サーバー上にデータベースを作成する

この時点で、PostgreSQL サーバーがあります。 このセクションでは、サーバー上にデータベースを作成します。

PostgreSQL 対話型ターミナル psql は、ローカル環境または Azure Cloud Shell (Azure portal でもアクセス可能) で使用できます。 psql を使用する場合は、通常、すべての依存関係がシェルに含まれているため、Cloud Shell を使用する方が簡単です。

ステップ 1. psql を使用してデータベースに接続します。

psql --host=<postgres-server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=demoadmin@<postgres-server-name> \
     --dbname=postgres

postgres-server-name<> は PostgreSQL サーバーの名前です。 コマンドを実行すると、管理者パスワードの入力を求められます。

接続で問題が発生した場合は、データベースを再起動して、もう一度やり直してください。 ローカル環境から接続している場合は、その IP アドレスをデータベース サービスのファイアウォール規則の一覧に追加する必要があります。

ステップ 2. データベースを作成します。

プロンプトで、「postgres=>」を入力します。

CREATE DATABASE restaurants_reviews;

コマンドの末尾のセミコロン (";") は必要です。 データベースが正常に作成されたことを確認するには、コマンド \c restaurants_reviews を使用します。 ヘルプを表示するには「\?」、終了するには「\q」を入力します。

また、Azure PostgreSQL フレキシブル サーバーに接続し、Azure Data Studio か、PostgreSQL をサポートする他の任意の IDE を使用してデータベースを作成することもできます。

Container Apps に Web アプリをデプロイする

コンテナー アプリは、セキュリティで保護された境界として機能する Container Apps "環境" にデプロイされます。 次の手順では、環境と環境内にコンテナを作成し、Web サイトが外部から見えるようにコンテナーを構成します。

ステップ 1. Azure にサインインし、必要に応じて認証します。

az login

ステップ 2. az extension add コマンドを使用して、Azure Container Apps の拡張機能をインストールまたはアップグレードします。

az extension add --name containerapp --upgrade

手順 3. az containerapp env create コマンドを使用して Container Apps 環境を作成します。

az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>

<location> は、az account list-locations -o table コマンドで出力される Azure の場所の Name 値のいずれかです。

ステップ 4. Azure Container Registry のサインイン資格情報を取得します。

az acr credential show -n <registry-name>

コマンドの出力から返されたユーザー名とパスワードの 1 つを使用します。

ステップ 5: az containerapp env create コマンドを使用して、環境内にコンテナー アプリを作成します。

az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn

<env-variable-string> は、key="値" 形式のスペース区切りの値で構成される文字列で、次の値が含まれます。

  • AZURE_POSTGRESQL_HOST=<postgres-server-name>.postgres.database.azure.com
  • AZURE_POSTGRESQL_DATABASE=restaurants_reviews
  • AZURE_POSTGRESQL_USERNAME=demoadmin
  • AZURE_POSTGRESQL_PASSWORD=<db-password>
  • RUNNING_IN_PRODUCTION=1
  • AZURE_SECRET_KEY=<YOUR-SECRET-KEY>

python -c 'import secrets; print(secrets.token_hex())' の出力を使用して AZURE_SECRET_KEY 値を生成します。

次に例を示します: --env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf

ステップ 7. Django の場合のみ、データベース スキーマを移行して作成します。 (Flask サンプル アプリでは自動的に実行されるため、この手順をスキップできます)。

az containerapp exec コマンドを使用して接続します。

az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg

次に、シェル コマンド プロンプトで、「python manage.py migrate」と入力します。

コンテナーのリビジョンについては、移行する必要はありません。

手順 8. Web サイトをテストします。

入力した az containerapp create コマンドは、アプリの参照に使用できるアプリケーション URL を出力します。 URL の末尾が "azurecontainerapps.io" である。 ブラウザーで URL にアクセスします。 または、az containerapp browse コマンドを使用することもできます。

1 軒のレストランと 2 つのレビューを追加した後のサンプル Web サイトの例を次に示します。

Screenshot showing an example of the sample website built in this tutorial.

デプロイのトラブルシューティング

  • Web サイトにアクセスするためのアプリケーション URL を忘れた。

    • Azure portal で、コンテナー アプリの [概要] ページに移動し、[アプリケーション URL] を探します。
    • VS Code で Azure 拡張機能に移動し、[Container Apps] セクションを選択します。 サブスクリプションを展開し、コンテナー環境を展開します。コンテナー アプリが見つかったら、[python-container-app] を右クリックして [参照] を選択します。
    • Azure CLI では、az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn コマンドを使用します。
  • VS Code で、[Build Image in Azure] (Azure でのイメージのビルド) タスクからエラーが返される。

    • "Error: failed to download context. Please check if the URL is incorrect." (コンテキストのダウンロードに失敗しました。URL が正しくないかどうかを確認してください) というメッセージが VS Code の [出力] ウィンドウに表示されたら、Docker 拡張機能でレジストリを更新します。 更新するには、Docker 拡張機能を選択し、[レジストリ] セクションに移動し、レジストリを見つけて選択します。
    • [Build Image in Azure] (Azure でのイメージのビルド) タスクを再度実行する場合は、前回の実行のレジストリが存在するか確認し、存在する場合は使用します。
  • コンテナー アプリの作成中に Azure portal に、"ACR '<name>.azurecr.io' にアクセスできません" のようなアクセス エラーが表示される。

    • このエラーは、ACR の管理者資格情報が無効になっている場合に発生します。 ポータルで管理者の状態を確認するには、Azure Container Registry に移動し、[アクセス キー] リソースを選択して、[管理者ユーザー] が有効になっていることを確認します。
  • コンテナー イメージが Azure Container Registry に表示されない。

    • Azure CLI コマンドまたは VS Code 出力の出力を確認し、成功を確認するメッセージを探します。
    • Azure CLI を使用したビルド コマンドまたは VS Code タスク プロンプトで、レジストリの名前が正しく指定されていることを確認します。
    • 資格情報の有効期限が切れていないことを確認します。 たとえば、VS Code では、Docker 拡張機能でターゲット レジストリを見つけて更新します。 Azure CLI では、az login を実行します。
  • Web サイトから "無効な要求 (400)" が返される。

    • コンテナーに渡される PostgreSQL の環境変数を確認します。 多くの場合、400 エラーは、Python コードが PostgreSQL インスタンスに接続できないことを示しています。
    • このチュートリアルで使用するサンプル コードでは、コンテナー環境変数 RUNNING_IN_PRODUCTION の存在を確認します。これは、"1" のような任意の値に設定できます。
  • Web サイトから "見つかりません (404)" が返される。

    • コンテナーの [概要] ページで [アプリケーション URL] を確認します。 アプリケーション URL に "internal" という単語が含まれている場合、イングレスが正しく設定されていません。
    • コンテナーのイングレスを確認します。 たとえば、Azure portal でコンテナーの[イングレス] リソースに移動し、HTTP Ingress (HTTP イングレス) が有効になっており、[どこからでもトラフィックを受け入れます] が選択されていることを確認します。
  • Web サイトが起動せず、"stream timeout" (ストリーム タイムアウト) と表示されるか何も返されない。

    • ログを確認します。
      • Azure portal で、コンテナー アプリの [リビジョン管理] リソースに移動し、コンテナーの [プロビジョニングの状態] を確認します。
        • "プロビジョニング中" の場合は、プロビジョニングが完了するまで待ちます。
        • "失敗" の場合は、リビジョンを選択し、コンソール ログを確認します。 列の順序を選択して、"生成時刻"、"Stream_s"、"Log_s" を表示します。 ログを新しい順に並べ替えて、"Stream_s" 列で Python stderr および stdout メッセージを探します。 Python の 'print' 出力は stdout メッセージになります。
      • Azure CLI では、az containerapp logs show コマンドを使用します。
    • Django フレームワークを使用している場合は、restaurants_reviews テーブルがデータベースに存在するかどうかを確認します。 存在しない場合は、コンソールを使用してコンテナーにアクセスして python manage.py migrate を実行します。

次のステップ