🕌
Azure でコンテナを GitHub Actions 経由でデプロイする際につまずいた点の備忘録
この記事では、Azure Container Registry (ACR) と Container Apps を使い、GitHub Actions で CI/CD を構築する手順をまとめます。途中でハマった点も整理します。
全体の流れ
- うまくいかなかったところ
- 事前準備
- リソースグループの作成
- Azure Container Registryの作成
- Container Apps Environment の作成
- Container Apps の作成
- GitHub Actionsの設定
- まとめ
うまくいかなかったところ
Container Apps をプライベート ACR イメージでデプロイする場合、ドキュメントには「Container Apps に割り当てたマネージドIDに対して ACR の AcrPull ロールを割り当てればよい」と書かれています。しかし、実際に下記コマンドでロールを割り当ててもエラーが発生し、うまくいきませんでした。
# ACR のリソースID を取得
ACR_ID=$(az acr show \
--name sampleprjsamplefe \
--resource-group rg-sampleprj-prd \
--query id -o tsv)
# コンテナアプリのマネージドID (principalId) を取得
CONTAINERAPP_ID=$(az containerapp show \
--name sampleprj-frontend \
--resource-group rg-sampleprj-prd \
--query identity.principalId -o tsv)
# ロール割り当て
az role assignment create \
--assignee "$CONTAINERAPP_ID" \
--role "AcrPull" \
--scope "$ACR_ID"
割り当て後にデプロイしようとすると、下記のように UNAUTHORIZED エラーで失敗します。
Running ..Failed to provision revision for container app 'sampleprj-frontend'. Error details: The following field(s) are either invalid or missing. Field 'template.containers.sampleprj-frontend.image' is invalid with details: 'Invalid value: "sampleprjsamplefe.azurecr.io/sampleprj-frontend:latest": GET https:?scope=repository%3Asampleprj-frontend%3Apull&service=sampleprjsamplefe.azurecr.io: UNAUTHORIZED: authentication required, visit https://aka.ms/acr/authorization for more information.
最終的には、私は ACR の管理者ユーザー (Admin user) とパスワードを使う方式 に切り替えて回避しました(もし根本解決策をご存知の方がいればぜひ教えてください)。
事前準備
AzureのCLIを入れておく
brew update && brew install azure-cli
az extension add --name containerapp --upgrade
リソースグループの作成
# 開発環境用
az group create -n rg-sampleprj-dev -l japaneast
# 本番環境用
az group create -n rg-sampleprj-prd -l japaneast
Azure Container Registryの作成
# ACR_NAMEは※一意かつ英数字である必要あり
# フロントエンド
ACR_NAME=sampleprjfe
az acr create \
--resource-group rg-sampleprj-dev \
--name $ACR_NAME \
--sku Basic \
--location japaneast
Container Apps Environment の作成
# Log Analytics ワークスペースが必要なので有効化しておく
az provider register -n Microsoft.OperationalInsights --wait
# 開発環境用
az containerapp env create \
--resource-group rg-sampleprj-dev \
--name sampleprj-containerapp-env-dev \
--location japaneast
# 本番環境用
az containerapp env create \
--resource-group rg-sampleprj-prd \
--name sampleprj-containerapp-env-prd \
--location japaneast
Container Apps の作成
ACR の管理者ユーザーを有効にし、ユーザー名とパスワードを取得し、GitHub の Secrets にも登録します。
まずは Public なイメージ (例: mcr.microsoft.com/azuredocs/containerapps-helloworld:latest) でコンテナアプリを作っておき、あとで CI/CD で更新する方法を取りました。
# 開発環境用
az containerapp create \
--name sampleprj-pricing-tool-frontend-dev \
--resource-group rg-sampleprj-dev \
--environment sampleprj-containerapp-env-dev \
--image mcr.microsoft.com/azuredocs/containerapps-helloworld:latest \
--ingress external \
--target-port 3000 \
--registry-server sampleprjsamplefe.azurecr.io \
--registry-username sampleprjsamplefe \
--registry-password PASSWORD
# 本番環境用
az containerapp create \
--name sampleprj-pricing-tool-frontend-prd \
--resource-group rg-sampleprj-prd \
--environment sampleprj-containerapp-env-prd \
--image mcr.microsoft.com/azuredocs/containerapps-helloworld:latest \
--ingress external \
--target-port 3000 \
--registry-server sampleprjsamplefe.azurecr.io \
--registry-username sampleprjsamplefe \
--registry-password PASSWORD
GitHub Actionsの設定
ACR のログイン情報
AZURE_SUBSCRIPTION_ID=$(az account show --query id -o tsv)
az ad sp create-for-rbac \
--name gh-sampleprj-sp \
--role contributor \
--scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \
--sdk-auth
出力される JSON を GitHub の Secrets (例: AZURE_CREDENTIALS) に登録します。
# prdへのデプロイ
name: Deploy to Container Apps (prd)
on:
push:
tags:
- 'v*.*.*'
env:
ACR_NAME: sampleprjsamplefe
ENV: prd
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v3
# Azure CLI ログイン用アクション
- name: Login to Azure
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
# ACR にログイン (Log in to container registry)
- name: Azure Container Registry Login
run: |
az acr login --name ${{ env.ACR_NAME }}
# フロントエンドのビルド & プッシュ
- name: Build & Push Frontend Image
run: |
az acr build --registry ${{ env.ACR_NAME }} --image sampleprj-frontend .
# Container Apps にデプロイ
- name: Deploy Container Apps (prd)
run: |
az containerapp update \
--name sampleprj-pricing-tool-frontend-${{ env.ENV }} \
--resource-group rg-sampleprj-${{ env.ENV }} \
--image ${{ env.ACR_NAME }}.azurecr.io/sampleprj-frontend
# devへのデプロイ
name: Deploy to Container Apps (dev)
on:
push:
# mainブランチ以外でpushされたら実行
branches-ignore:
- 'main'
env:
ACR_NAME: sampleprjsamplefe
ENV: dev
jobs:
build-and-deploy-dev:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v3
- name: Azure Login
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Azure Container Registry Login
run: |
az acr login --name ${{ env.ACR_NAME }}
- name: Build & Push Frontend Image (dev)
run: |
az acr build --registry ${{ env.ACR_NAME }} --image sampleprj-frontend .
- name: Deploy Container Apps (dev)
run: |
az containerapp update \
--name sampleprj-pricing-tool-frontend-${{ env.ENV }} \
--resource-group rg-sampleprj-${{ env.ENV }} \
--image ${{ env.ACR_NAME }}.azurecr.io/sampleprj-frontend
各環境へのデプロイのトリガー
push(main以外) | Tag (e.g. v1.1.1 ) |
|
---|---|---|
dev |
💥 | |
prd |
💥 |
まとめ
• マネージドID + AcrPull 方式でのデプロイに失敗したため、今回は ACR Admin ユーザー+パスワード を使う形でCI/CDを実装しました。
• 手順としては、ACR と Container Apps Environment を整備 → Container Apps 作成 → GitHub Actions でビルド&プッシュ → az containerapp update でアプリに反映、という流れです。
• おかげで開発 (dev) / 本番 (prd) それぞれに異なるリソースグループ・環境を用意し、GitHub Actions で自動リリースができるようになりました。
(以上。もしマネージドIDでの Pull に成功した方がいれば、コメントいただけると助かります!)
Discussion