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

カスタム データとは
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 での使い方を試してみました
ざっくり手順
- カスタムデータを Base64 でエンコード
- カスタムデータを利用できるイメージを作成
- エンコードしたファイルを VM 作成時に指定
- VM にログインし、カスタムデータが正しく処理されているか確認
1. カスタムデータを Base64 でエンコード
カスタム データとして VM に渡す処理を Base64 にエンコードしたテキストを作成します
今回はファイルを作成するだけのシンプルな例を示します
エンコード前のスクリプトは下記になります
|
|
DevToys を使って Base64 にエンコードします
結果は下記のようになります
T3V0LUZpbGUgLUZpbGVQYXRoICJDOlxUZW1wXG91dHB1dC50eHQiIC1JbnB1dE9iamVjdCAiSGVsbG8sIFdvcmxkISIgLUVuY29kaW5nIHV0Zjg=

2. カスタムデータを利用できるイメージを作成
処理の流れは以下の通りです
flowchart TD
A[Windows にログイン] --> B["バッチファイル(ProcessCustomData.bat)を実行"]
B --> C["PowerShell スクリプト(ProcessCustomData.ps1)を実行"]
C --> D[カスタムデータをデコードし、実行]
イメージ作成用の Windows VM を作成し、下記のスクリプトを実行し必要なファイルを作成します
|
|
|
|
sysprep を実行します
イメージ作成前に VM をプロビジョニング解除または一般化する - Azure Virtual Machines | Microsoft Learn
VM が停止状態になったらキャプチャーを実行しイメージを作成します
3. エンコードしたファイルを VM 作成時に指定
作成したイメージから VM を作成します
カスタムデータの欄に Base64 でエンコードしたテキストを貼り付けます
4. VM にログインし、カスタムデータが正しく処理されているか確認
作成した VM にログインします
まず、カスタムデータで渡したファイルが存在しているか確認します
Windows の場合は %SYSTEMDRIVE%\AzureData\CustomData.bin
に配置されます
無事に配置されていました
ではカスタム データで記述したスクリプトが実行されているか確認します
画像の通りスクリプトが実行され、ファイルが作成されていることが確認できました
まとめ
VM 作成時のパラメータであるカスタムデータを使って Windows での自動化を試してみました
ゲスト OS 内の処理を実行するなら、実行コマンド等の方が便利だと感じました
Windows においてわざわざカスタムデータを使うメリットは正直感じられませんでした、、、
Azure VM の実行コマンドを Bicep で試し隊 – クラウドを勉強し隊