Azure Virtual Desktop カスタム イメージ テンプレートの組み込みスクリプトを試す
Azure Virtual Desktop セッションホストを作成する時にカスタムイメージを作成できる Azure Virtual Desktop カスタム イメージ テンプレートが GA されました。
Announcing general availability of Azure Virtual Desktop Custom Image Templates - Microsoft Community Hub
今回は Azure Virtual Desktop カスタム イメージ テンプレートを使ってカスタム イメージを作成してみた記事になります。
はじめに
カスタム イメージ テンプレート は Azure VM Image Builder を Azure Virtual Desktop 向けにラッピングした機能です。
これまで Azure VM Image Builder を使ってイメージを作成できましたが、より簡単に AVD イメージを作成できるようにカスタム イメージ テンプレートでは以下の組み込みスクリプトが用意されています。
- 言語パックのインストール
- 既定の言語を設定
- タイム ゾーンリダイレクトの有効化
- ストレージ センサーを無効化
- FSLogix をインストールとプロファイル コンテナーの構成
- FSLogix と Kerberos の有効化
- マネージド ネットワークに対して RDP ショートパスの有効化
- 画面キャプチャ保護の有効化
- Teams の最適化
- セッション タイムアウトの構成
- Microsoft Office アプリケーションの追加・削除
- Windows の更新プログラムの適用
組み込みスクリプトだけで理想のカスタマイズをすべて実現できるわけではありませんが、基本的なカスタマイズを押さえておりゴールデン イメージの作成をかなり手助けしてもらえます。
やること
- Azure Marketplace の Windows 10 multi-session イメージをベースにします。
- カスタム イメージ テンプレートの組み込みスクリプトを使いカスタムします。
- 作成したイメージは Azure Compute Gallery に保存します。
前提条件
カスタム イメージを作成する前に、サブスクリプションに次のリソース プロバイダーが登録されている必要があります。
- Microsoft.DesktopVirtualization
- Microsoft.VirtualMachineImages
- Microsoft.Storage
- Microsoft.Compute
- Microsoft.Network
- Microsoft.KeyVault
リソース プロバイダーの登録状況の確認や登録方法は リソース プロバイダーとリソースの種類 を参考にしてください。
Azure PowerShell や Azure CLI を利用している場合は、以下コマンドを実行するとさくっと確認できます。
リソースプロバイダー登録確認(Azure PowerShell)
$namespaces = @(
'Microsoft.DesktopVirtualization',
'Microsoft.VirtualMachineImages',
'Microsoft.Storage',
'Microsoft.Compute',
'Microsoft.Network',
'Microsoft.KeyVault'
)
Get-AzResourceProvider -ListAvailable | Where-Object { $namespaces -contains $_.ProviderNamespace } |Select-Object ProviderNamespace, RegistrationState | Format-Table -AutoSize
## output
ProviderNamespace RegistrationState
----------------- -----------------
Microsoft.KeyVault Registered
Microsoft.DesktopVirtualization Registered
Microsoft.VirtualMachineImages Registered
Microsoft.Network Registered
Microsoft.Storage Registered
Microsoft.Compute Registered
リソースプロバイダー登録確認(Azure CLI)
namespaces=(
"Microsoft.DesktopVirtualization"
"Microsoft.VirtualMachineImages"
"Microsoft.Storage"
"Microsoft.Compute"
"Microsoft.Network"
"Microsoft.KeyVault"
)
for namespace in "${namespaces[@]}"; do
result=$(az provider list --query "[?namespace=='$namespace'].{ProviderNamespace:namespace, RegistrationState:registrationState}" -o tsv)
echo -e "$result"
done
## output
Microsoft.DesktopVirtualization Registered
Microsoft.VirtualMachineImages Registered
Microsoft.Storage Registered
Microsoft.Compute Registered
Microsoft.Network Registered
Microsoft.KeyVault Registered
イメージ作成のプロセス
以下のプロセスでカスタム イメージ テンプレートを利用してカスタム イメージを作成します。
- リソース グループの作成
- カスタム ロールの作成
- マネージド ID の作成とカスタム ロールの割り当て
- Azure Compute Gallery と VM イメージ定義の作成
- カスタム イメージ テンプレートの作成
- イメージ ビルド
リソース グループの作成
リソース グループを作成します。
name | value |
---|---|
リソースグループ | RG_AVD_Custom_Image_Templates |
リージョン | Japan East |
カスタム ロールの作成
マネージド ID に割り当てるカスタム ロールを作成します。
アクセス制御(IAM) > 追加 > カスタム ロールの追加 から作成できます。
先ほど作成したリソースグループRG_AVD_Custom_Image_Templates
のスコープにおいて
- Microsoft.Compute/galleries/read
- Microsoft.Compute/galleries/read
- Microsoft.Compute/galleries/images/read
- Microsoft.Compute/galleries/images/versions/read
- Microsoft.Compute/galleries/images/versions/write
のアクセスを許可するカスタム ロールを作成します。[1]
カスタム ロールの作成方法は Azure portal を使用して Azure カスタム ロールを作成または更新する を参考にしてください。
Azure Virtual Desktop Custom Image Templates 用のカスタムロール JSON
- JSON から始める を参考に JSON ファイルをアップロードするもしくは 手順 6:JSON を参考に JSON を直接編集するのいずれかの方法で利用できます。
- 先にやっておくこと
-
<SubscriptionId>
を自身のサブスクリプション ID に置き換えてください。 - リソースグループ名が異なる場合は
RG_AVD_Custom_Image_Templates
を自身のリソースグループ名に置き換えてください。
-
{
"properties": {
"roleName": "CustomRole_AVD_Custom_Image_Templates",
"description": "Azure Virtual Desktop Custom Image Templates用のカスタムロール",
"assignableScopes": ["/subscriptions/<SubscriptionId>/resourceGroups/RG_AVD_Custom_Image_Templates"],
"permissions": [
{
"actions": [
"Microsoft.Compute/galleries/read",
"Microsoft.Compute/galleries/images/read",
"Microsoft.Compute/galleries/images/versions/read",
"Microsoft.Compute/galleries/images/versions/write"
],
"notActions": [],
"dataActions": [],
"notDataActions": []
}
]
}
}
マネージド ID の作成とカスタム ロールの割り当て
マネージド ID の作成
カスタム イメージ テンプレート(Azure VM Image Builder)が、Azure Compute Gallery などの Azure サービスにアクセスに利用するマネージド ID を作成します。
name | value |
---|---|
サブスクリプション | <SubscriptionName> |
リソース グループ | RG_AVD_Custom_Image_Templates |
リージョン | Japan East |
名前 | ManagedId_AVD_Custom_image_Templates |
カスタム ロールの割り当て
作成したマネージド ID に対してカスタム ロールを割り当てることで権限を付与します。
マネージド ID 名 > Azure ロールの割り当て > ロールの割り当ての追加 からカスタム ロールを割り当てます。
name | value |
---|---|
スコープ | リソース グループ |
サブスクリプション | <SubscriptionName> |
リソース グループ | RG_AVD_Custom_Image_Templates |
役割 | CustomRole_AVD_Custom_Image_Templates |
Azure Compute Gallery と VM イメージ定義の作成
Azure Compute Gallery の作成
カスタムしたイメージの保存先として Azure Compute Gallery を作成します。
name | value |
---|---|
サブスクリプション | <SubscriptionName> |
リソース グループ | RG_AVD_Custom_Image_Templates |
地域 | Japan East |
名前 | ACG_Identity_AVD_Custom_image_Templates |
説明 | - |
共有方法 | ロールベースのアクセス制御(RBAC) |
VM イメージ定義の作成
OS の種類や VM の世代、VM アーキテクチャなど保存するイメージの要件を定義します。
Azure コンピューティング ギャラリー > ギャラリー名 > 追加 > VM イメージ定義から作成できます。
name | value |
---|---|
サブスクリプション | <SubscriptionName> |
リソース グループ | RG_AVD_Custom_Image_Templates |
地域 | Japan East |
ターゲット Azure コンピュート ギャラリー | ACG_Identity_AVD_Custom_image_Templates |
VM イメージ定義名 | ImageDefinition_AVD_Custom_Image_Templates |
OS の種類 | Windows |
セキュリティの種類 | トラステッド起動 |
VM の世代 | Gen 2 |
VM アーキテクチャ | x64 |
OS の状態 | 一般 |
発行元 | <Publisher> |
オファー | <Offer> |
SKU | <SKU> |
カスタム イメージ テンプレートの作成
イメージのカスタマイズ内容を定義します。
Azure Virtual Desktop > カスタム イメージ テンプレート > カスタム イメージ テンプレートの追加 から作成できます。
デフォルトではカスタム イメージ テンプレートを作成した際にステージング グループとして IT_<ResourceGroupName>_<TemplateName>_<GUID>
という名前のリソース グループが作成されます。
また、カスタム イメージ テンプレートに指定したマネージド ID に対して作成したリソース グループの共同作成者のロールが付与され、ストレージ アカウントの作成とスクリプトのアップロードが行われます。
-
基本
name value 名前 ImageTemplate_AVD_Custom_image_Templates 既存のテンプレートからのインポート false サブスクリプション <SubscriptionName> リソース グループ RG_AVD_Custom_Image_Templates 場所 Japan East マネージド ID ManagedId_AVD_Custom_image_Templates -
ソース イメージ
name value ソースの種類 プラットフォーム イメージ (マーケットプレース) イメージの選択 Windows 10 Enterprise multi-session, Version 22H2 + Microsoft 365 Apps - Gen2 -
配布ターゲット
name value マネージド イメージ false Azure Compute Gallery true ギャラリー名 ACG_Identity_AVD_Custom_image_Templates ギャラリー イメージの定義 ImageDefinition_AVD_Custom_Image_Templates ギャラリー イメージ バージョン - 実行の出力名 AVD_Image レプリケーションのリージョン Japan East 最新から除外 no ストレージ アカウントの種類 Standard_LRS -
ビルドのプロパティ
name value ビルドのタイムアウト (分) - ビルド VM サイズ Standard_D2s_v4 - Gen 2 に推奨 OS ディスク サイズ (GB) 127 ステージング グループ - Vnet - サブネット - -
カスタマイズ
number name value 1 インストール言語 Japanese (Japan) 2 規定の OS 言語の設定 Japanese (Japan) 3 タイム ゾーンのリダイレクト - 4 FSLogix をインストールし、ファイル コンテナーを有効にする プロファイル パス : -, VHD サイズ (MB) : 3000 5 Appx パッケージの削除 Microsoft.MSpaint 6 Microsoft Office アプリケーションの追加 アプリケーション : Visio , バージョン : 64 7 Microsoft Office アプリケーションの削除 アプリケーション : Word , バージョン : 64 8 Windows Update の適用 -
イメージ ビルド
カスタム イメージ テンプレートを作成後、ビルドの開始を実行することでイメージの作成が開始されます。
Azure Virtual Desktop > カスタム イメージ テンプレート > カスタム イメージ テンプレート名 > ビルドの開始 から実行できます。
ビルドを開始すると以下のリソースが作成されます。このリソースはビルド終了後に削除されます。
ビルドが完了すると Azure Compute Gallery にイメージが保存され、VM イメージ定義にイメージ バージョンが作成されます。
- 仮想ネットワーク
- ネットワーク セキュリティ グループ
- ネットワーク インターフェイス
- パブリック IP アドレス
- 仮想マシン
- ディスク
- キーコンテナー
今回のビルドでは約 90 分程度でビルドが完了しました。
言語パックのインストールや Windows Update の適用の他にイメージをキャプチャし Azure Compute Gallery へのイメージの保存などが行われているため、時間がかかります。
イメージの確認
カスタム イメージ テンプレートで作成したイメージを確認します。
言語設定
日本語の言語パックがインストールされ、既定の言語が日本語に設定されています。
タイム ゾーンのリダイレクト
リダイレクトが設定されています。[2]
PS > Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" | Select-Object fEnableTimeZoneRedirection
## output
fEnableTimeZoneRedirection
--------------------------
1
FSLogix のインストールとプロファイル コンテナーの構成
FSlogix がインストールされています。
また、プロファイル コンテナーの構成も行われています。
今回プロファイル パスを設定していなかったので CCDLocations は設定されていません。
PS > Get-ItemProperty -Path "HKLM:\SOFTWARE\FSLogix\Profiles"
## output
(default) :
Enabled : 1
SizeInMBs : 30000
IsDynamic : 1
VolumeType : vhdx
FlipFlopProfileDirectoryName : 1
SIDDirNamePattern : %username%%sid%
SIDDirNameMatch : %username%%sid%
DeleteLocalProfileWhenVHDShouldApply : 1
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\FSLogix\Profiles
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\FSLogix
PSChildName : Profiles
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Appx パッケージの削除
Microsoft Paint が削除されています。
PS > Get-AppxPackage Microsoft.MSPaint
## output
Microsoft Office アプリケーションの追加・削除
Visio が追加されています。
Word は削除され、Word で検索しても Wordpad しか表示されません。
Windows Update の適用
Windows Update が適用されています。
PS > Get-HotFix | Sort-Object InstalledOn -Descending
## output
Source Description HotFixID InstalledBy InstalledOn
------ ----------- -------- ----------- -----------
avd-image Update KB5011048 NT AUTHORITY\SYSTEM 2023/09/24 0:00:00
avd-image Update KB5029919 NT AUTHORITY\SYSTEM 2023/09/24 0:00:00
avd-image Security Update KB5014032 2023/09/12 0:00:00
avd-image Update KB5029709 2023/09/12 0:00:00
avd-image Security Update KB5030211 2023/09/12 0:00:00
avd-image Update KB5029923 2023/09/12 0:00:00
avd-image Update KB5015684 2023/09/12 0:00:00
その他
ビルドの進捗を確認する
カスタム イメージ テンプレートでは、ビルドの実行状態が Running - Building
のみなのでビルドがどこまで進んでいるのか状況がわかりません。
そのため現在の状況を確認したくなった場合は、イメージ ビルドのログを確認することになります。
ログは ストレージ アカウント名 > コンテナー > packerlogs > <GUID> > customization.log に出力されています。
PACKER OUT ==> azure-arm:
を含む行を抽出するとビルドの進捗を大まかに確認できます。
組み込みスクリプトについて
カスタム イメージ テンプレートで提供される組み込みスクリプトは RDS-Templates/CustomImageTemplateScripts at master · Azure/RDS-Templates を利用しているようです。[3]
参考ドキュメント
- Custom image templates - Azure Virtual Desktop | Microsoft Learn
- Use custom image templates to create custom images - Azure Virtual Desktop | Microsoft Learn
Discussion