JavaScriptを有効にしてください

Azure VM のカスタム データを Windows で使ってみ隊

 ·   4 分で読めます  ·   Kento

Azure VM を作成する際に [カスタム データ] というパラメータがあります
Linux では cloud-init というキーワードで検索するとたくさん情報が出てきますが、Windows での事例が見つからなかったので試してみました

image01
VM 作成時のパラメータ:

カスタム データとは

Microsoft 公式から引用します

カスタムデータは、“プロビジョニング” と呼ばれる最初のスタートアップ時またはセットアップ時に、VM で使用できるようになります。 プロビジョニングとは、VM の作成パラメーター (ホスト名、ユーザー名、パスワード、証明書、カスタム データ、キーなど) を VM で使用できるようにするプロセスです。

ゲスト OS の自動化で利用することができる機能の1つです

利用するときは Base64 でエンコードが必要だそうです

カスタム データを使用するには、変換を実行する CLI ツール (Azure CLI など) を使用していない限り、データを API に渡す前に、コンテンツを Base64 でエンコードする必要があります。

カスタム データと Azure 仮想マシン - Azure Virtual Machines | Microsoft Learn

なお、Azure VM の自動化関連は下記にまとまっています
インフラストラクチャ自動化ツールを使用する - Azure Virtual Machines | Microsoft Learn

Windows での使い方

Base64 でエンコードすることに加えて、Windows では下記の記載があります

カスタム データは、バイナリ ファイルとして %SYSTEMDRIVE%\AzureData\CustomData.bin に配置されますが、処理されません。 このファイルを処理する場合は、カスタム イメージをビルドし、CustomData.bin を処理するコードを記述する必要があります。

カスタム データと Azure 仮想マシン - Azure Virtual Machines | Microsoft Learn

ここまでの情報を踏まえて、Windows での使い方を試してみました

ざっくり手順

  1. カスタムデータを Base64 でエンコード
  2. カスタムデータを利用できるイメージを作成
  3. エンコードしたファイルを VM 作成時に指定
  4. VM にログインし、カスタムデータが正しく処理されているか確認

1. カスタムデータを Base64 でエンコード

カスタム データとして VM に渡す処理を Base64 にエンコードしたテキストを作成します
今回はファイルを作成するだけのシンプルな例を示します

エンコード前のスクリプトは下記になります

1
Out-File -FilePath "C:\Temp\output.txt" -InputObject "Hello, World!" -Encoding utf8

DevToys を使って Base64 にエンコードします
結果は下記のようになります

T3V0LUZpbGUgLUZpbGVQYXRoICJDOlxUZW1wXG91dHB1dC50eHQiIC1JbnB1dE9iamVjdCAiSGVsbG8sIFdvcmxkISIgLUVuY29kaW5nIHV0Zjg=
image0
DevToys を使ったエンコード:

2. カスタムデータを利用できるイメージを作成

処理の流れは以下の通りです

flowchart TD
    A[Windows にログイン] --> B["バッチファイル(ProcessCustomData.bat)を実行"]
    B --> C["PowerShell スクリプト(ProcessCustomData.ps1)を実行"]
    C --> D[カスタムデータをデコードし、実行]

イメージ作成用の Windows VM を作成し、下記のスクリプトを実行し必要なファイルを作成します

1
2
3
4
5
6
7
8
9
# ファイルのパスを指定
$path = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\ProcessCustomData.bat"

# ファイルの内容を指定
$content = '@echo off
PowerShell -ExecutionPolicy Bypass -File "C:\Users\Public\Documents\ProcessCustomData.ps1"'

# ファイルに内容を書き込み
Set-Content -Path $path -Value $content
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# ファイルのパスを指定
$path = "C:\Users\Public\Documents\ProcessCustomData.ps1"

# ファイルの内容を指定
$content = '# CustomData.bin のパス
$customDataPath = "C:\AzureData\CustomData.bin"

# CustomData.bin を読み込み、Base64 からデコード
$customData = Get-Content -Path $customDataPath -Raw
$decodedData = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($customData))

# デコードされたデータをスクリプトとして実行
Invoke-Expression $decodedData'

# ファイルに内容を書き込み
Set-Content -Path $path -Value $content

sysprep を実行します
イメージ作成前に VM をプロビジョニング解除または一般化する - Azure Virtual Machines | Microsoft Learn

VM が停止状態になったらキャプチャーを実行しイメージを作成します

image03
VM イメージの作成:

3. エンコードしたファイルを VM 作成時に指定

作成したイメージから VM を作成します

image04
作成した VM イメージから VM の作成:

カスタムデータの欄に Base64 でエンコードしたテキストを貼り付けます

image05
VM 作成時のパラメータ:

4. VM にログインし、カスタムデータが正しく処理されているか確認

作成した VM にログインします
まず、カスタムデータで渡したファイルが存在しているか確認します
Windows の場合は %SYSTEMDRIVE%\AzureData\CustomData.bin に配置されます

無事に配置されていました

image06
カスタムデータの配置場所:

ではカスタム データで記述したスクリプトが実行されているか確認します
画像の通りスクリプトが実行され、ファイルが作成されていることが確認できました

image07
カスタムデータの実行結果:

まとめ

VM 作成時のパラメータであるカスタムデータを使って Windows での自動化を試してみました
ゲスト OS 内の処理を実行するなら、実行コマンド等の方が便利だと感じました
Windows においてわざわざカスタムデータを使うメリットは正直感じられませんでした、、、

Azure VM の実行コマンドを Bicep で試し隊 – クラウドを勉強し隊

参考

共有

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