🕌

Azure でコンテナを GitHub Actions 経由でデプロイする際につまずいた点の備忘録

2025/01/18に公開

この記事では、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