APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Container AppsでCI/CD(Azure DevOps編)

はじめに

こんにちは、ACS事業部の吉川です。

前回の記事では、Azure Container AppsとGitHub Actionsを組み合わせてのCI/CDについて解説しました。

techblog.ap-com.co.jp

今回はAzure DevOpsとの組み合わせでのCI/CDについて解説します。

構成

以下の構成を例として解説を行います。

前回の構成からGitHubをAzure DevOpsに置き換えただけのシンプルな構成です。

リソースの作成

前回記事と同じなので、前回の内容をご覧になられた方は読み飛ばしていただいて構いません。

まずはリソースグループとAzure Container Registry(ACR)を作成します。

# リソース名とリージョンの定義
rgName=rg-sample
acrName=acrsample
location=japaneast

# リソースグループ作成
az group create --location $location --name $rgName

# ACR作成
az acr create --name $acrName -g $rgName -l $location --sku Basic

次にContainer Appsを作成していきますが、まずは Container Apps環境 を作成する必要があります。

# リソース名の定義
caeName=cae-sample

# Container Apps環境作成
az containerapp env create --name $caeName -g $rgName -l $location

Container Apps環境ができあがったらContainer Appsを作成します。
Container Apps作成時に --registry-identity および --registry-server オプションを付与することで、マネージドIDを利用してACRからイメージをPullできるように設定してくれます。

# リソース名の定義
acaName=aca-sample

# Container Apps作成
az containerapp create -n $acaName -g $rgName \
  --environment $caeName \
  --ingress external \
  --target-port 80 \
  --registry-identity system \
  --registry-server ${acrName}.azurecr.io

上記のコマンドでContainer Appsを作成すると、以下のようなサンプル用コンテナが起動した状態となります。

Azure DevOpsの準備

土台となる環境が整ったら、次はAzure DevOpsの準備をします。

Azure Pipelinesでは外部のサービスとの連携のために Service connection を作成する必要があります。
まずは Azure Resource Manager(ARM) のService connectionを作成しましょう。

Azure DevOpsプロジェクトの Settings から Pipelines -> Service connections と進み、Create service connection ボタンをクリックします。

New service connection の一覧から Azure Resource Manager を選択します。

次の画面では Service principal (automatic) を選択します。
(事前に作成しておいたサービスプリンシパルを利用することもできますが、今回はAzure DevOpsから自動生成します)

サブスクリプションとリソースグループを選択し名前を入力して Save ボタンをクリックすると、Service connectionが作成されます。

続いて Azure Container Registry(ACR)用のService connectionも作成します。
New service connection から Docker Registry を選択します。

Registry typeで Azure Container Registry を選択し、サブスクリプションを選択、Azure container registry欄はリソースの作成にて作成したACRを選択します。
Service Connectionの名前を入力し Save ボタンをクリックして作成完了です。

Service connectionの次はEnvironmentを作成します。
名前を入力し、Resourceは None を選択します。

Service connectionとEnvironmentを作成したら、以下の内容でPipelineのYAMLファイルを準備します。
variables の値は準備した環境に合わせ適宜編集してください。

trigger:
- main

resources:
- repo: self

variables:
  armServiceConnection: 'service-connection-aca-sample'         # ARMのService connection名
  dockerRegistryServiceConnection: 'service-connection-acr'     # ACRのService connection名
  environmentName: 'environment-aca-sample'                     # Environment名
  imageRepository: 'sampleapp'
  containerRegistry: 'acrsample.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  resourceGroupName: 'rg-sample'
  containerAppName: 'aca-sample'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'


stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureCLI@2
            displayName: Deploy to containerapp
            inputs:
              azureSubscription: $(armServiceConnection)
              scriptType: 'bash'
              scriptLocation: 'inlineScript'
              inlineScript: |
                az config set extension.use_dynamic_install=yes_without_prompt
                az containerapp update -n $(containerAppName) -g $(resourceGroupName) \
                  --image $(containerRegistry)/$(imageRepository):$(tag)

上記のYAMLをAzure Reposに配置してPipelineとして登録します。
なお、リポジトリ内のファイル配置は以下のディレクトリ構成とします。

├── pipelines
│   └── build_and_deploy.yaml
└── Dockerfile

Pipelineの実行

さて、登録したPipelineを実行してみましょう。

Dockerfileを以下のよう作成してmainブランチにPushします。

FROM nginx:latest

Pipelineの実行が完了したら…

Container Appsがビルドしたコンテナイメージに更新されていることが確認できます。

おわりに

前回に引き続きContainer AppsのCI/CDについて、コンテナイメージをビルドしデプロイするというごく単純な内容で例示しました。
Pipeline内でのデプロイ処理はAzure CLIを実行しているだけですので、他のCI/CDツールでも同様に実行可能かと思います。

これまでの内容では実行中のコンテナを置き換える形でしたが、Container Appsへのデプロイ手法には他のオプションがあります。 次回はそのあたりについて触れられればと思っております。お楽しみに!

本記事の投稿者: 吉川 俊甫
AKSをメインにインフラ系のご支援を担当しています。AKS以外のコンテナもぼちぼち触っていきます。
Shunsuke Yoshikawa - Credly