次の方法で共有


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

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

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

この記事の手順に従った後、Docker コンテナー イメージを使用して App Service Web サイトを完成させます。 App Service は、認証にマネージド ID を使用して Azure Container Registry から初期イメージをプルします。

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

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

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は、あなたの環境で、このチュートリアルの「Azureでコンテナーを構築」()の部分で使用したリソース グループ名として設定する必要があります(パート 3)。 そうでない場合は、最初の行のコメントアウトを解除し、あなたが使用した名前に設定します。

  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 を含むリソース グループ) に ロールを割り当てます。 これにより、リソース グループ内の任意の 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 アプリを設定するため、このエラーは無視しても問題ありません。

マネージド 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 を作成します。 必要に応じて、--resource-group パラメーターと --location パラメーターを使用して、この動作をオーバーライドできます。

MongoDB への接続を構成する

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

MongoDB 用の Azure Cosmos DB を作成する必要がある場合は、このチュートリアルのパート2「 ローカルでコンテナーをビルドしてテストする方法」に従って、Cosmos DB for MongoDB をセットアップすることをお勧めします。 完了したら、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" を指定してください。

サイトを参照する

サイトが実行されていることを確認するには、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 に移動します。

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

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

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

次の手順

リソース をクリーンアップする