Azure PipelinesでARM TemplateのCI/CDパイプラインを実装してみた-実装編-

本記事は、以下の記事の続きとなります。

blog.jbs.co.jp

前回の記事ではAzure PipelinesでARM TemplateのCI/CDパイプラインを実装するための事前準備をしました。

本記事ではAzure Pipelinesの実装を進めていきます。

Azure Pipelinesの設定

プロジェクト画面の左メニューから「Pipelines」を選択し、「Create Pipeline」をクリックします。

ソースコードの格納先選択

ソースコードの格納先を選択します。

前回の記事でAzure Reposにソースコードを格納したため、「Azure Repos Git」を選択します。

利用するAzure Reposのリポジトリを選択します。

Pipelinesの設定

Pipelinesの設定方法を選択します。

今回は1からazure-pipelines.ymlを作成するため、「Starter pipeline」を選択します。

※既に「azure-pipelines.yml」をリポジトリに格納している場合は「Existing Azure Pipelines YAML file」を選択してください。

サンプルのYAMLファイルが表示されたら、steps:以下を削除します。

削除後のYAMLファイルは以下のようになります。

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:

次に、画面右上にある「Show assistant」を選択します。

検索バーで、「ARM Template」と検索し、検索結果に出てくる「ARM template deployment」を選択します。

以下の表の通りに設定値を入力します。

設定値
Deployment scope Resource Group
Azure Resource Manager Connection 前回の記事で作成したサービス接続名
Subscription デプロイ先のサブスクリプションを選択
Action Create Or Update Resource Group
Resource Group デプロイ先のリソースグループを指定
Location リソースグループのリージョン
Template Location Linked artifact
Template デプロイするテンプレートのパス
Template parameters 今回は利用しない
Override template parameters 今回は利用しない
Deployment mode デプロイモードを選択(今回はIncremental)
Deployment name 任意のデプロイ名を入力

入力後「Add」をクリックすると、azure-pipelines.ymlにタスクが追加されます。

タスク追加後のazure-pipelines.ymlは以下のようになります。

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'サービス接続名'
    subscriptionId: 'サブスクリプションID'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'リソースグループ名'
    location: 'リージョン'
    templateLocation: 'Linked artifact'
    csmFile: 'demo-template.json'
    deploymentMode: 'Incremental'
    deploymentName: 'demo-cicd-pipeline-deploy'

初回の動作確認

azure-pipelines.ymlが作成できたので、保存してパイプラインが正常に動作するか確認します。

まずは画面右上の「Save and run」をクリックします。

作成したazure-pipelines.ymlをmainブランチにプッシュするため、「Commit directory to the main branch」にチェックを入れ、「Save and run」をクリックします。

以下の画面に自動で遷移し、パイプラインが実行されます。

しばらく待つとJobの状態がSuccessになりました。正常に実行できたようです。

また、リソースグループの「デプロイ」画面を確認すると、azure-pipelines.ymlで指定したデプロイ名でデプロイが開始されていることが分かります。

これでパイプラインの実装は完了です。

動作確認

パイプラインの実装が完了したため、パイプラインを利用してリソースの設定変更ができるか確認します。

今回はサブネットを1つ追加してみようと思います。

デプロイ前のリソースは、サブネットが1つだけ作成されている状態です。

まず、ローカルリポジトリのmainブランチのARM Templateを以下のように修正します。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "VnetName": {
            "defaultValue": "vnet-xxxxxxxx",
            "type": "string"
        },
        "VnetAddress": {
            "defaultValue": "xxx.xxx.xxx.xxx/xx",
            "type": "string"
        },
        "SubnetName_1": {
            "defaultValue": "subnet-a",
            "type": "string"
        },
        "SubnetName_1_Address": {
            "defaultValue": "xxx.xxx.xxx.xxx/xx",
            "type": "string"
        },
        "SubnetName_2": {
            "defaultValue": "subnet-b",
            "type": "string"
        },
        "SubnetName_2_Address": {
            "defaultValue": "xxx.xxx.xxx.xxx/xx",
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2023-05-01",
            "name": "[parameters('VnetName')]",
            "location": "japaneast",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[parameters('VnetAddress')]"
                    ]
                },
                "encryption": {
                    "enabled": false,
                    "enforcement": "AllowUnencrypted"
                },
                "subnets": [
                    {
                        "name": "[parameters('SubnetName_1')]",
                        "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('VnetName'), parameters('SubnetName_1'))]",
                        "properties": {
                            "addressPrefixes": [
                                "[parameters('SubnetName_1_Address')]"
                            ],
                            "delegations": [],
                            "privateEndpointNetworkPolicies": "Disabled",
                            "privateLinkServiceNetworkPolicies": "Enabled"
                        },
                        "type": "Microsoft.Network/virtualNetworks/subnets"
                    },
                    {
                        "name": "[parameters('SubnetName_2')]",
                        "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('VnetName'), parameters('SubnetName_2'))]",
                        "properties": {
                            "addressPrefixes": [
                                "[parameters('SubnetName_2_Address')]"
                            ],
                            "delegations": [],
                            "privateEndpointNetworkPolicies": "Disabled",
                            "privateLinkServiceNetworkPolicies": "Enabled"
                        },
                        "type": "Microsoft.Network/virtualNetworks/subnets"
                    }
                ],
                "virtualNetworkPeerings": [],
                "enableDdosProtection": false
            }
        }
    ]
}

subnetsプロパティにサブネットを1つ追加しました。

修正できたため、以下のコマンドでリモートリポジトリのmainブランチにプッシュします。

# 現在のブランチを確認する(mainブランチになっていること)
git branch

# 現在の状態を確認する
git status

# 変更されたファイルを追加する
git add .

# 現在の状態を確認する
git status

#コミットする
git commit -m "add subnet-b"

#リモートリポジトリのmainブランチにプッシュする
git push origin main

プッシュができたら、Pipelinesの画面に移動し、パイプラインが開始されていることを確認します。

しばらく待ってパイプラインの実行が完了すると、アイコンが緑色に変わります。

パイプライン実行完了後にリソースを確認すると、subnetが1つ追加されたことを確認できました。

パイプラインを利用してリソースの設定変更ができました!

まとめ

今回はAzure PipelinesでARM TemplateのCI/CDパイプラインの実装と動作確認を行いました。

業務の中で、Azureリソースの変更管理がコードで完結できるようになればいいなと常に考えていたので、目標に第一歩近づくことができたと思います。

今後はより複雑なARM TemplateやBicepでも試してみたいです。

執筆担当者プロフィール
近藤 結梨香

近藤 結梨香(日本ビジネスシステムズ株式会社)

業務では主にAzureに携わっています。映画好きで良く映画館に籠っています。

担当記事一覧