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
- マネージド ID を使用して ACR アクセスをロック ダウンする場合は、このガイドに従います。
- 別のサブスクリプションのレジストリからデプロイするには、代わりに [Registry source]\(レジストリ ソース\) で [プライベート レジストリ] を選択します。
デプロイするイメージとタグを選択します。 必要に応じて、 [スタートアップ ファイル] にスタートアップ コマンドを入力します。
[コンテナーの種類] に応じて、次の手順に従います。
- [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 CLI で 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 でリポジトリを参照し、[設定] > [シークレット] > [新しいシークレットの追加] を選択します。 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>'