Azure App Service でのカスタム コンテナーを使用した継続的配置

このチュートリアルでは、管理された Azure Container Registry リポジトリまたは Docker Hub からのカスタム コンテナー イメージの継続的なデプロイを構成します。

1. デプロイ センターに移動する

Azure portalで、App Service アプリの管理ページに移動します。

左側のメニューで、 [デプロイ センター][設定] の順にクリックします。

2. デプロイ ソースを選択する

デプロイ ソースの選択は、シナリオによって異なります。

  • [コンテナー レジストリ] では、コンテナー レジストリと App Service の間に CI/CD が設定されます。
  • [GitHub Actions] オプションは、GitHub でコンテナー イメージのソース コードを維持する場合に使用します。 デプロイ アクションは、GitHub リポジトリへの新しいコミットによってトリガーされ、docker build および docker push をコンテナー レジストリに直接実行した後、App Service アプリを更新して新しいイメージを実行できます。 詳細については、「CI/CD と GitHub Actions の連携のしくみ」を参照してください。
  • Azure Pipelines で CI/CD を設定するには、Azure Pipelines からの Azure Web アプリ コンテナーのデプロイに関する記事を参照してください。

Note

Docker Compose アプリの場合は、 [Container Registry] を選択します。

GitHub Actions を選んだ場合は、[承認]クリックして承認プロンプトに従います。 既に GitHub での承認が済んでいる場合は、 [アカウントの変更] をクリックして別のユーザーのリポジトリからデプロイできます。

GitHub で Azure アカウントを承認したら、デプロイ元となる [組織][リポジトリ][ブランチ]選択します。

2. レジストリ設定を構成する

3. レジストリ設定を構成する

Note

サイドカー コンテナー (プレビュー) は、App Service のマルチコンテナー アプリ (Docker Compose) の後継です。 概要については、「チュートリアル: Azure App Service でカスタム コンテナーのサイドカー コンテナーを構成する (プレビュー)」をご覧ください。

複数コンテナー (Docker Compose) アプリをデプロイするには、[コンテナーの種類][Docker Compose]選択します。

[コンテナーの種類] ドロップダウンが表示されない場合は、[ソース] までスクロールして [Container Registry]選択します。

[Registry source]\(レジストリ ソース\) で、コンテナー レジストリがある場所を選択します。 Azure Container Registry でも Docker Hub でもない場合は、[プライベート レジストリ]選択します。

Note

複数コンテナー (Docker Compose) アプリで複数のプライベート イメージを使用する場合は、プライベート イメージが同じプライベート レジストリにあり、同じユーザー資格情報でアクセスできることを確認してください。 複数コンテナー アプリでパブリック イメージのみを使用する場合は、一部のイメージが Docker Hub にない場合でも、Docker Hub選択します。

選択内容に合致するタブを選択して、次の手順に従います。

[レジストリ] ドロップダウンには、アプリと同じサブスクリプション内のレジストリが表示されます。 必要なレジストリを選択します。

Note

デプロイするイメージタグ選択します。 必要に応じて、 [スタートアップ ファイル] にスタートアップ コマンドを入力します。

[コンテナーの種類] に応じて、次の手順に従います。

  • [Docker Compose] の場合、プライベート イメージのレジストリを選択します。 [ファイルの選択]クリックして Docker Compose ファイルをアップロードするか、Docker Compose ファイルの内容を [構成]貼り付けます。
  • [単一コンテナー] の場合、デプロイするイメージタグ選択します。 必要に応じて、 [スタートアップ ファイル] にスタートアップ コマンドを入力します。

App Service は、コンテナーを起動するときに、 [スタートアップ ファイル] の文字列を docker run コマンドの末尾に ([COMMAND] [ARG...] セグメントとして) 追加します。

3. CI/CD を有効にする

4. CI/CD を有効にする

App Service では、Azure Container Registry および Docker Hub との CI/CD 統合がサポートされています。 これを有効にするには、[継続的デプロイ][オン]選択します。

Note

[ソース][GitHub Actions] を選択した場合、CI/CD は GitHub Actions によって直接処理されるため、このオプションは表示されません。 代わりに [ワークフロー構成] セクションが表示され、ここで [ファイルのプレビュー]クリックしてワークフロー ファイルを検査できます。 Azure によって、選択した GitHub ソース リポジトリにこのファイルがコミットされて、ビルドとデプロイのタスクが処理されます。 詳細については、「CI/CD と GitHub Actions の連携のしくみ」を参照してください。

このオプションを有効にすると、App Service では Azure Container Registry または Docker Hub のリポジトリに webhook が追加されます。 選択したイメージが docker push で更新されるたびに、リポジトリがこの webhook に送信されます。 webhook によって、App Service アプリが再起動され、docker pull を実行して更新されたイメージを取得します。

Note

Webhook が適切に機能することを確認するには、Web アプリ内で [基本認証の発行資格情報] オプションを有効にすることが不可欠です。 これを行わないと、Webhook に対して 401 未承認エラーが発生する可能性があります。 [基本認証の発行資格情報] が有効になっているかどうかの確認は、次の手順に従って行います。

  • Web アプリの [構成] > [一般設定] に移動します。
  • [プラットフォームの設定] セクションを探すと、[基本認証の発行資格情報] オプションが見つかります。

他のプライベート レジストリの場合、webhook に手動で、または CI/CD パイプラインの手順として送信できます。 [Webhook URL] で、 [コピー] ボタンをクリックして、webhook の URL を取得します。

Note

複数コンテナー (Docker Compose) アプリのサポートには制限があります。

  • Azure Container Registry の場合、App Service では、レジストリをスコープとして、選択したレジストリに webhook を作成します。 レジストリ内の任意のリポジトリ (Docker Compose ファイルで参照されていないものを含む) への docker push により、アプリの再起動がトリガーされます。 範囲が狭くなるよう webhook を変更することができます。
  • Docker Hub では、レジストリ レベルで webhook がサポートされません。 Docker Compose ファイルで指定されたイメージに、webhook を手動で追加する必要があります。

4. 設定を保存する

5. 設定を保存する

[保存]クリックします。

CI/CD と GitHub Actions の連携のしくみ

[ソース][GitHub Actions] を選択した場合 (「デプロイ ソースの選択」を参照)、App Service では次の方法で CI/CD を設定します。

  • GitHub Actions ワークフロー ファイルを GitHub リポジトリに保管して、App Service のビルドとデプロイのタスクを処理します。
  • プライベート レジストリの資格情報を GitHub シークレットとして追加します。 生成されたワークフロー ファイルは、Azure/docker-login アクションを実行してプライベート レジストリでサインインし、docker push を実行してそれにデプロイします。
  • アプリの発行プロファイルを GitHub シークレットとして追加します。 生成されたワークフロー ファイルでは、App Service で認証するためにこのシークレットが使用され、その後、更新されたイメージを構成するために Azure/webapps-deploy アクションが実行され、これによって、更新されたイメージをプルするためにアプリの再起動がトリガーされます。
  • ワークフロー実行ログから情報をキャプチャし、それをアプリの "デプロイ センター" の [ログ] タブに表示します。

GitHub Actions ビルド プロバイダーは、次の方法でカスタマイズできます。

  • GitHub リポジトリでワークフロー ファイルが生成された後に、そのファイルをカスタマイズします。 詳しくは、「GitHub Actions のワークフロー構文」を参照してください。 アプリの再起動をトリガーするために、ワークフローが Azure/webapps-deploy アクションで終了していることを確認してください。
  • 選択したブランチが保護されている場合でも、構成を保存せずに引き続きワークフロー ファイルをプレビューしてから、これと必要な GitHub シークレットを手動でリポジトリに追加することができます。 この方法では、Azure portal とのログ統合は行われません。
  • 発行プロファイルではなく、Microsoft Entra ID でサービス プリンシパルを使ってデプロイします。

サービス プリンシパルでの認証

このオプション構成では、既定の認証が、生成されたワークフロー ファイル内の発行プロファイルに置き換えられます。

Azure CLIaz ad sp create-for-rbac コマンドを使用して、サービス プリンシパルを作成します。 次の例で、<subscription-id><group-name><app-name> を独自の値に置き換えます。 最上位の {} を含め、次の手順の JSON 出力全体を保存します。

az ad sp create-for-rbac --name "myAppDeployAuth" --role contributor \
                            --scopes /subscriptions/<subscription-id>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name> \
                            --json-auth

重要

セキュリティのために、サービス プリンシパルに最低限必要なアクセス権を付与してください。 前の例の範囲は、リソース グループ全体ではなく、特定の App Service アプリに限定されます。

GitHub でご自分のリポジトリを参照し、[設定] > [シークレット] > [Add a new secret](新しいシークレットの追加) の順に選択します。 Azure CLI コマンドからの JSON 出力全体をシークレットの値フィールドに貼り付けます。 シークレットに AZURE_CREDENTIALS などの名前を指定します。

デプロイ センターによって生成されたワークフロー ファイルで、次の例のようなコードを使用して azure/webapps-deploy 手順を修正します。

- name: Sign in to Azure 
# Use the GitHub secret you added
- uses: azure/login@v1
    with:
    creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to Azure Web App
# Remove publish-profile
- uses: azure/webapps-deploy@v2
    with:
    app-name: '<app-name>'
    slot-name: 'production'
    images: '<registry-server>/${{ secrets.AzureAppService_ContainerUsername_... }}/<image>:${{ github.sha }}'
    - name: Sign out of Azure
    run: |
    az logout

CLI で自動化する

コンテナー レジストリと Docker イメージを構成するには、az webapp config container set実行します。

az webapp config container set --name <app-name> --resource-group <group-name> --docker-custom-image-name '<image>:<tag>' --docker-registry-server-url 'https://<registry-name>.azurecr.io' --docker-registry-server-user '<username>' --docker-registry-server-password '<password>'

複数コンテナー (Docker Compose) アプリを構成するには、Docker Compose ファイルをローカルに準備し、--multicontainer-config-file パラメーターを指定して az webapp config container set実行します。 Docker Compose ファイルにプライベート イメージが含まれている場合は、前の例で示したように --docker-registry-server-* パラメーターを追加します。

az webapp config container set --resource-group <group-name> --name <app-name> --multicontainer-config-file <docker-compose-file>

コンテナー レジストリからアプリに CI/CD を構成するには、--enable-cd パラメーターを指定して az webapp deployment container config実行します。 コマンドを実行すると Webhook URL が出力されますが、別の手順でレジストリに Webhook を手動で作成する必要があります。 次の例では、アプリで CI/CD を有効にし、出力の Webhook URL を使用して Azure Container Registry に Webhook を作成します。

ci_cd_url=$(az webapp deployment container config --name <app-name> --resource-group <group-name> --enable-cd true --query CI_CD_URL --output tsv)

az acr webhook create --name <webhook-name> --registry <registry-name> --resource-group <group-name> --actions push --uri $ci_cd_url --scope '<image>:<tag>'

その他のリソース