コンテナー化された Python アプリを App Service にデプロイする

この記事は、Python Web アプリをコンテナー化して Azure App Service にデプロイする方法に関するチュートリアルの一部です。 App Service を使用すると、コンテナー化された Web アプリを実行すること、および Docker Hub、Azure Container Registry、Visual Studio Team Services を使用した継続的インテグレーション/継続的デプロイ (CI/CD) 機能を通じてデプロイを行うことができます。

チュートリアルのこの部分では、App Service Web App for Containers を使用して、コンテナー化された Python Web アプリを App Service にデプロイする方法について説明します。 Web App for Containers を使用すると、基になるコンテナー オーケストレーターの管理と保守について心配することなく、コンテナーの作成に集中できます。

ここにある手順に従うと、Docker コンテナー イメージを使用して App Service Web サイトを最終的に作成できます。 App Service は、認証のためにマネージド ID を使用して、Azure Container Registry から初期イメージをプルします。

次のサービス図では、この記事で説明するコンポーネントが強調表示されています。

「チュートリアル - Azure でのコンテナー化された Python アプリ」で使用されるサービスのスクリーンショット。デプロイ パスが強調表示されています。

1. Web アプリを作成する

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

手順 1. az group show コマンドを使用して、Azure Container Registry を含むグループのリソース ID を取得します。

# RESOURCE_GROUP_NAME='msdocs-web-app-rg'

RESOURCE_ID=$(az group show \
  --resource-group $RESOURCE_GROUP_NAME \
  --query id \
  --output tsv)
echo $RESOURCE_ID

上記のコマンドでは、環境でRESOURCE_GROUP_NAMEをパート 3 で使用したリソース グループ名に設定する必要があります 。このチュートリアルの Azure でコンテナーをビルドします 。 そうでない場合は、最初の行のコメントを解除し、使用した名前に設定されていることを確認します。

手順 2. az appservice plan create コマンドで、App Service プランを作成します。

APP_SERVICE_PLAN_NAME='msdocs-web-app-plan'

az appservice plan create \
    --name $APP_SERVICE_PLAN_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux

手順 3. az webapp create コマンドを使用して Web アプリを作成します。

次のコマンドでは、Web アプリのシステム割り当てマネージド ID も有効にし、指定されたリソース (この場合は、Azure Container Registryを含むリソース グループ) にロールを割り当てますAcrPull。 これにより、リソース グループ内の任意のAzure Container Registryに対するシステム割り当てマネージド ID プル特権が付与されます。

APP_SERVICE_NAME='<website-name>'
# REGISTRY_NAME='<your Azure Container Registry name>'
CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest'

az webapp create \
  --resource-group $RESOURCE_GROUP_NAME \
  --plan $APP_SERVICE_PLAN_NAME \
  --name $APP_SERVICE_NAME \
  --assign-identity '[system]' \
  --scope $RESOURCE_ID \
  --role acrpull \
  --deployment-container-image-name $CONTAINER_NAME 

上記のコマンドでは:

  • APP_SERVICE_NAMEは、URL https://<website-name>.azurewebsites.netの Web サイト名になるため、グローバルに一意である必要があります。
  • CONTAINER_NAMEは "yourregistryname.azurecr.io/repo_name:tag" という形式です。
  • REGISTRY_NAMEは、環境でパート 3 で使用したレジストリ名に設定する必要があります 。このチュートリアルの Azure でコンテナーをビルドします 。 そうでない場合は、上に設定されている行のコメントを解除し、使用した名前に設定されていることを確認します。

注意

コマンドを実行すると、次のようなエラーが表示されることがあります。

No credential was provided to access Azure Container Registry. Trying to look up...
Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'

このエラーは、Web アプリが既定でAzure Container Registryの管理者資格情報を使用してレジストリで認証し、管理者資格情報がレジストリで有効になっていないために発生します。 次のコマンドで認証にシステム割り当てマネージド ID を使用するように Web アプリを設定するため、このエラーは無視しても問題ありません。

2. マネージド ID と Webhook を構成する

手順 1. az webapp config set コマンドを使用して、マネージド ID を使用してAzure Container Registryからプルするように Web アプリを構成します。

az webapp config set \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --generic-configurations '{"acrUseManagedIdentityCreds": true}'

Web アプリの作成時にシステム割り当てマネージド ID を有効にしたため、Azure Container Registryからプルするために使用されるマネージド ID になります。

手順 2. az webapp deployment list-publishing-credentials コマンドを使用して、アプリケーション スコープの資格情報を取得します。

CREDENTIAL=$(az webapp deployment list-publishing-credentials \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --query publishingPassword \
  --output tsv)
echo $CREDENTIAL 

手順 3. az acr webhook create コマンドにより、アプリケーション スコープの資格情報を使用して Webhook を作成します。

SERVICE_URI='https://$'$APP_SERVICE_NAME':'$CREDENTIAL'@'$APP_SERVICE_NAME'.scm.azurewebsites.net/api/registry/webhook'

az acr webhook create \
  --name webhookforwebapp \
  --registry $REGISTRY_NAME \
  --scope msdocspythoncontainerwebapp:* \
  --uri $SERVICE_URI \
  --actions push 

既定では、このコマンドは、指定された Azure Container レジストリと同じリソース グループと場所に webhook を作成します。 必要に応じて、 パラメーターと --location パラメーターを--resource-group使用して、この動作をオーバーライドできます。

3. MongoDB への接続を構成する

この手順では、MongoDB に接続するために必要な環境変数を指定します。

Azure Cosmos DB for MongoDB を作成する必要がある場合は、手順に従って、パート 2 で Cosmos DB for MangoDB を設定 することをお勧めします 。このチュートリアルのコンテナーをローカルでビルドしてテストします 。 完了したら、 という形式mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>の Azure Cosmos DB for MongoDB 接続文字列が必要です。

下の手順を実行するには、MongoDB 接続文字列情報が必要です。

App Service で環境変数を設定するには、次の az webapp config appsettings set コマンドを使用して "アプリ設定" を作成します。

MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews

az webapp config appsettings set \
   --resource-group $RESOURCE_GROUP_NAME \
   --name $APP_SERVICE_NAME \
   --settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
              DB_NAME=$MONGO_DB_NAME  \
              COLLECTION_NAME=$MONGO_COLLECTION_NAME 
  • CONNECTION_STRING: "mongodb://" で始まる接続文字列。
  • DB_NAME: "restaurants_reviews" を使用します。
  • COLLECTION_NAME: "restaurants_reviews" を使用します。

4. サイトを参照する

サイトが実行されていることを確認するには、 に移動します https://<website-name>.azurewebsites.net。ここで、Web サイト名はアプリ サービス名です。 成功した場合は、レストラン レビューのサンプル アプリが表示されます。 サイトが初めて起動する場合は、しばらく時間がかかることがあります。 サイトが表示されたら、レストランとそのレストランのレビューを追加して、サンプル アプリが機能することを確認します。

Azure CLI をローカルで実行している場合は、 az webapp browse コマンドを使用して Web サイトを参照できます。 Cloud Shellを使用している場合は、ブラウザー ウィンドウを開き、Web サイトの URL に移動します。

az webapp browse  --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME 

注意

コマンドはaz webapp browse、Cloud Shellではサポートされていません。 ブラウザー ウィンドウを開き、代わりに Web サイトの URL に移動します。

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

サンプル アプリが表示されない場合は、次の手順を試してください。

  • コンテナー デプロイと App Service を使用する場合、Azure portal で [デプロイ センター] / [ログ] ページを常に確認します。 コンテナーがプルされ、実行されていることを確認します。 コンテナーが初めてプルされて実行される場合、しばらく時間がかかることがあります。
  • App Service を再起動して、それによって問題が解決するかどうかを確認します。
  • プログラミング エラーがある場合、それらのエラーはアプリケーション ログに表示されます。 App Service の Azure portal ページで、[問題の診断と解決]/[アプリケーション ログ] を選択します。
  • サンプル アプリには、MongoDB への接続が必要です。 App Service に正しい接続情報を含むアプリケーション設定があることを確認します。
  • App Service に対してマネージド ID が有効になっており、デプロイ センターで使用されていることを確認します。 App Service の Azure portal ページで、App Service の [デプロイ センター] リソースに移動し、[認証][マネージド ID] に設定されていることを確認します。
  • Webhook が Azure Container Registry で定義されていることを確認します。 Webhook により、App Service はコンテナー イメージをプルできます。 特に、サービス URI の末尾が "/api/registry/webhook" であることを確認してください。
  • Azure Container Registry の SKU が異なると、Webhook の数など、機能も異なります。 既存のレジストリを再利用する場合、"Quota exceeded for resource type webhooks for the registry SKU Basic" (レジストリ SKU Basic のリソース タイプ Webhook でクォータを超過しました) というメッセージが表示される場合があります。 各種の SKU クォータとアップグレード プロセスについて詳しくは、https://aka.ms/acr/tiers" を参照してください。 このメッセージが表示される場合は、新しいレジストリを使用するか、使用中のレジストリ Webhook の数を減らしてください。

次のステップ