この記事では、マネージド Azure Container Registry リポジトリまたは Docker Hub からカスタム コンテナー イメージの継続的インテグレーションと継続的デリバリー (CI/CD) を構成する方法について説明します。
1. 展開センターに移動する
Azure portal で、Azure App Service アプリの管理ウィンドウに移動します。
サイドバー メニューの [ デプロイ] で、[ デプロイ センター] を選択します。 [設定] タブを選択します。
2. コード ソースを選択する
[ ソース ] ドロップダウン メニューから、次の条件に基づいてデプロイ ソースを選択します。
- [コンテナー レジストリ] では、コンテナー レジストリと App Service の間に CI/CD が設定されます。
-
GitHub でコンテナー イメージのソース コードを維持する場合は、GitHub Actions オプションを選択します。 GitHub リポジトリへの新しいコミットによってデプロイ アクションがトリガーされ、
docker build
とdocker push
をコンテナー レジストリに対して直接実行できます。 その後、App Service アプリが更新され、新しいイメージが実行されます。 詳細については、「CI/CD と GitHub Actions の連携のしくみ」を参照してください。 - Azure Pipelines で CI/CD を設定するには、Azure Pipelines からの Azure Web アプリ コンテナーのデプロイに関する記事を参照してください。
- Docker Compose アプリの場合は、 [Container Registry] を選択します。
GitHub Actions を選択した場合は、[ 承認 ] を選択し、承認プロンプトに従います。 GitHub で以前に承認した場合は、[ アカウントの変更] を選択して、別のユーザーのリポジトリからデプロイできます。
GitHub で Azure アカウントを承認したら、デプロイする 組織、 リポジトリ、 ブランチ を選択します。
2. レジストリ設定を構成する
3. レジストリ設定を構成する
注
サイドカー コンテナーは、App Service のマルチコンテナー (Docker Compose) アプリに成功します。 開始するには、「 チュートリアル: Azure App Service でカスタム コンテナー用にサイドカー コンテナーを構成する」を参照してください。
マルチコンテナー (Docker Compose) アプリをデプロイするには、[コンテナーの種類] で [Docker Compose] を選択します。
[コンテナーの種類] ドロップダウン リストが表示されない場合は、戻って [ソース] までスクロールし、[コンテナー レジストリ] を選択します。
レジストリ ソースで、コンテナー レジストリの場所を選択します。 Azure Container Registry または Docker Hub ではない場合は、[ プライベート レジストリ] を選択します。
注
マルチコンテナー (Docker Compose) アプリで複数のプライベート イメージが使用されている場合は、プライベート イメージが同じプライベート レジストリにあり、同じユーザー資格情報でアクセスできることを確認します。 マルチコンテナー アプリでパブリック イメージのみを使用する場合は、 一部のイメージが Docker Hub にない場合でも、Docker Hub を選択します。
選択内容に合致するタブを選択して、次の手順に従います。
[レジストリ] ドロップダウン リストには、アプリと同じサブスクリプション内のレジストリが表示されます。 目的のレジストリを選択します。
別のサブスクリプションのレジストリからデプロイするには、代わりに [レジストリ ソース] で [プライベート レジストリ] を選択します。
マネージド ID を使用して Azure Container Registry アクセスをロックダウンするには、次を参照してください。
- App Service と Azure Container Registry でシステム割り当てマネージド ID を使用する方法
- App Service と Azure Container Registry でユーザー割り当てマネージド ID を使用する方法
デプロイする イメージ と タグ を選択します。 スタートアップ ファイルにスタートアップ コマンドを入力することもできます。
コンテナーの種類の値に応じて、次の手順に従います。
- Docker Compose の場合は、プライベート イメージのレジストリを選択します。 [ ファイルの選択] を選択 して Docker Compose ファイルをアップロードするか、Docker Compose ファイルの内容を Config に貼り付けます。
- [単一コンテナー] で、デプロイするイメージとタグを選択します。 スタートアップ ファイルにスタートアップ コマンドを入力することもできます。
App Service は、コンテナーを起動するときに、 [スタートアップ ファイル] の文字列を docker run
コマンドの末尾に ([COMMAND] [ARG...]
セグメントとして) 追加します。
3. CI/CD を有効にする
4. CI/CD を有効にする
App Service では、Azure Container Registry および Docker Hub との CI/CD 統合がサポートされています。 CI/CD 統合を有効にするには、継続的デプロイで [オン] を選択します。
注
ソースで 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
を実行して更新されたイメージを取得します。
Webhook が適切に機能するためには、Web アプリ内で [基本認証発行資格情報] オプションを 有効にすることが不可欠です。 そうしないと、Webhook に対して "401 unauthorized" エラーが発生する可能性があります。
基本認証発行資格情報が有効になっているかどうかを確認するには、Web アプリの構成>General 設定に移動します。 [プラットフォーム設定] セクションを探し、[基本認証発行資格情報] オプションを選択します。
その他のプライベート レジストリの場合は、手動で Webhook に投稿するか、CI/CD パイプラインのステップとして投稿できます。 Webhook URL で、[コピー] ボタンを選択して Webhook URL を取得します。
[Save](保存) を選択して設定を保存します。
注
マルチコンテナー (Docker Compose) アプリのサポートは制限されています。 Azure Container Registry の場合、App Service では、レジストリをスコープとして、選択したレジストリに webhook を作成します。 レジストリ内の任意のリポジトリ (Docker Compose ファイルで参照されていないものを含む) への docker push
により、アプリの再起動がトリガーされます。 範囲を絞るために Webhook を変更する必要がある場合があるでしょう。 Docker Hub では、レジストリ レベルで webhook がサポートされません。 Docker Compose ファイルで指定されたイメージに Webhook を手動で追加する必要があります。
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 の サービス プリンシパル を使用して展開します。
サービス プリンシパルで認証する
このオプション構成では、既定の認証が、生成されたワークフロー ファイル内の発行プロファイルに置き換えられます。
az 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 でリポジトリに移動し、設定>Secrets>新しいシークレットを追加するを選択します。 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 ファイルをローカルで準備し、az webapp config container set
パラメーターを使用して--multicontainer-config-file
を実行します。 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 を構成するには、az webapp deployment container config
パラメーターを使用して--enable-cd
を実行します。 コマンドを実行すると 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>'