JavaScriptを有効にしてください

GitHub Actions を使って Bicep を最新化し隊

 ·   7 分で読めます  ·   Kento

今回は GitHub Actions を使って Bicep ファイルを更新して最新化してみます

モチベーション

以前にこんな記事を書きました
VM のバージョンを指定してデプロイし隊 – クラウドを勉強し隊

最近、同じ内容のブログが投稿されているのも確認しました
自分の方が早かったよアピール
VM イメージ バージョンを指定して VM を作成する方法について | Japan Azure IaaS Core Support Blog

ざっくりこんな内容です

  1. PowerShell または CLI のコマンドを実行して利用可能な VM イメージのバージョンを取得
  2. 取得したバージョンを指定して VM をデプロイ

手順 1.で確認する利用可能な VM イメージの一覧は定期的に更新されます
デプロイするたびに、その時 利用可能なイメージを調べる必要があります

手順 2.では Azure Portal からはバージョン指定できないので、コマンドベース (PowerShell や Azure CLI) または テンプレート (ARM template や Bicep) を利用する必要があります

太字にした2つのポイントを改善したいのが 今回のモチベーションになります

解決策

手順 1. については定期的に Bicep ファイルを更新するように GitHub Actions を用意します
手順 2. については Azure Portal から GUI で実行できるように Bicep + Template Spec で実現します

Template Spec についてはこちら
ARM テンプレートとBicep 03 | Template Spec を試し隊 – クラウドを勉強し隊

ざっくり手順

  1. ベースとなる Bicep の作成
  2. GitHub Actions の Workflow 作成
  3. 検証

1. ベースとなる Bicep の作成

Bicep ファイルを作成します

---
title: Bicep ファイルで作成するもの
---
graph LR
subgraph Vnet[vnet]
    subgraph Subnet[subnet]
        WS1("Windows Server 2022")
    end
end
NSG1(NSG)

classDef subG fill:none,color:#0a0,stroke:#0a0
class Vnet,Subnet subG
classDef SCP fill:#e83,color:#fff,stroke:none
class WS1 SCP
classDef NSGG fill:#46d,color:#fff,stroke:#fff
class NSG1 NSGG

Subnet -.- NSG1

Bicep ファイルには Azure Verified Modules を使いました
Azure Verified Modules を使って Bicep をデプロイし隊 – クラウドを勉強し隊

作成した Bicep ファイルはここに置いています
Azure_Bicep/products/winser2022image at main · NakayamaKento/Azure_Bicep

一部抜粋して簡単に解説します

パラメータ

デプロイする Windows Server のイメージバージョンを指定するパラメータです
description というデコレーターを使って、利用可能なイメージ一覧をユーザーに伝えます

GitHub Actions で hoge の部分を最新化していくことになります

1
2
@description('hoge ')
param winSer2022version string

VM 作成部分

前述のとおり Azure Verified Modules を利用しています
11行目に書かれている version: winSer2022version というところで パラメータで指定した内容に基づいてデプロイを実行します

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
module winser2022 'br/public:avm/res/compute/virtual-machine:0.2.3' = {
  name: '${prefix}-winser2022-deploy'
  params: {
    adminUsername: adminUsername
    adminPassword: adminPassword
    availabilityZone: 0
    imageReference: {
      publisher: 'MicrosoftWindowsServer'
      offer: 'WindowsServer'
      sku: '2022-datacenter-azure-edition'
      version: winSer2022version
    }
    name: '${prefix}-win2022'
    nicConfigurations: [
      {
        ipConfigurations: [
          {
            name: '${prefix}-ip-config'
            pipConfiguration: {
              publicIpNameSuffix: '-pip'
            }
            privateIpAddressVersion: 'IPv4'
            subnetResourceId: Vnet.outputs.subnetResourceIds[0]
          }
        ]
        nicSuffix: '-nic'
      }
    ]
    osDisk: {
      diskSizeGB: '128'
      managedDisk: {
        storageAccountType: 'Premium_LRS'
      }
    }
    osType: 'Windows'
    vmSize: 'Standard_D4s_v4'
  }
}

2. GitHub Actions の Workflow 作成

Bicep ファイルができたので GitHub Actions の Workflow を作成します
作成した YAML ファイルはここに置いています
Azure_Bicep/.github/workflows/winser2022image.yml at main · NakayamaKento/Azure_Bicep

一部抜粋して簡単に説明します
※説明の都合上順番が前後する所があります

Workflow の実行タイミング

明言している公開情報は見つけていませんが、Windows Server のイメージは毎月の更新プログラムが配信されると更新されているようです
その Windows の更新プログラムは 毎月第 2 火曜日に配信されます (日本時間だと 翌水曜日)
そのため 15日なら 最新のイメージになっているんじゃないか って推測をして 毎月 15日 に実行するようにしています

1
2
3
4
on:
    workflow_dispatch:
    schedule:
        - cron: '0 0 15 * *'

GitHub Actionsでは、scheduleイベントを使用してワークフローをスケジュールすることができます。以下のように、cron構文を使用して特定の日時にワークフローを実行するように設定できます。

この設定では、ワークフローは毎月15日の00:00(UTC)に実行されます。cron構文は5つのフィールド(分、時間、日、月、曜日)で構成されており、上記の設定は「毎月15日の00:00」を意味します。

なお、cron構文の時間はUTCで指定されますので、特定のタイムゾーンでの実行を希望する場合は、その時間をUTCに変換する必要があります。

Workflow の job | 利用可能なイメージの取得

やっていることは こんな感じ

  1. az vm image list を実行。デプロイしたいイメージの version の情報だけを抜粋
  2. 取得したデータから 改行と カンマ (,) を削除
  3. パラメータのデコレーターにするために文字を追加
  4. 対象の Bicep ファイルの 1行目に置き換え
1
2
3
4
5
6
7
        - name: Get Azure VM Image
          id: get-image
          run: |
                image=$(az vm image list --offer WindowsServer --publisher MicrosoftWindowsServer --sku 2022-datacenter-azure-edition --all --query "[?sku=='2022-datacenter-azure-edition'].version")
                imagelist=`echo $image | tr -d '[\r\n[],]'`
                imagedescription="@description('$imagelist')"
                sed -i -e "1s/^.*$/$imagedescription/g" ./products/winser2022image/main.bicep                

Workflow の job | 変更した Bicep ファイルをレポジトリにプッシュ

変更後の Bicep ファイルをレポジトリに反映させておきます
詳しい背景はわかっていないですが、調べてみると github-actions@github.com というユーザーで実行するのがよさそう
GitHub Actions上でgit commitするときにgit userをどうするか #GitHubActions - Qiita

1
2
3
4
5
6
7
        - name: Commit and push changes
          run: |
                git config user.name github-actions
                git config user.email github-actions@github.com
                git add ./products/winser2022image/main.bicep
                git commit -m "Update Bicep file with Azure VM image"
                git push                

また、プッシュする権限を渡すために Workflow の permissions で contens を write にしておきます

1
2
3
permissions:
    id-token: write
    contents: write

Workflow の job | Bicep ファイルをベースに Template Spec をデプロイ

Template Spec をデプロイできるように Azure にログインしておきます
※シークレットは事前に入力済みです

1
2
3
4
5
6
        - name: Set up Azure CLI
          uses: azure/login@v2
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

Microsoft Learn のここを一通りやれば、理解できます
内容がわからない方は一読をオススメします
GitHub Actions を使用して、初めての Bicep デプロイ ワークフローを構築する - Training | Microsoft Learn

Template Spec をデプロイします
テンプレートのバージョン情報をデプロイ パラメータに含める必要があるので github.run_number (ワークフローの実行番号) を利用しています

1
2
3
        - name: Deploy Template Spec
          run: |
                az ts create --name winser2022vm --location japaneast --resource-group templateSpecRG --version ${{ github.run_number }} --template-file ./products/winser2022image/main.bicep                
github.run_numberは GitHub Actions のワークフロー内で利用できるコンテキスト式で、現在のリポジトリ内でのワークフローの実行番号を表します。この番号はリポジトリごとに一意で、ワークフローが実行されるたびにインクリメントされます。この値は、ワークフローの実行を一意に識別するため、または特定の実行に関連するリソースを名前付けるためなどに使用できます。

3. 検証

Workflow を実行してみます
15日まで待てないので、今回は手動実行です
スクショの番号通りに操作していきます

テストで何度か実行しているので、履歴が残っていますが、執筆時の最新の実行番号は 4 になっています

action01
Workflow の手動実行:

バージョン 4 の Template Spec が作成できているかを確認してみると無事に作成できています

portal01
Workflow によってデプロイされた Template Spec:

上部の [展開] を選択して、Template Spec を使ったデプロイを実行してみます
パラメータの入力画面で [Win Ser2022version] に注目してみます
説明を表示させると Workflow によって追加された最新の利用可能なイメージバージョンを確認することができます
今回は “20348.1487.230106” を入力しました

portal02
Template Spec を使ったデプロイ:

ちなみにどのバージョンがいつの何年何月なのかは ここから確認することができます
“20348.1487.230106” は 2023/1 の更新プログラムが適用されているイメージであることがわかります
Windows Server のリリース情報 | Microsoft Learn

このままデプロイを実行します
VM が作成できたら接続をして Windows OS のバージョン情報を確認すると無事に指定したバージョンでデプロイができています!

vm01
作成した VM のバージョン情報:

まとめ

  • GitHub Actions を使った Bicep ファイルの変更
  • Template Spec を使った VM バージョンを指定したデプロイ

を実装することができました

今回 初めて GitHub Actions を使いました
わからないことは Copilot に聞くことができるので、意外とつまずく箇所が少なく試せました
Copilot 優秀!!!!

参考

共有

Kento
著者
Kento
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中