バベルのいただき

Get your money up!!

Azure Virtual Desktop カスタム イメージ テンプレートの組み込みスクリプトを試す

Azure Virtual Desktop セッションホストを作成する時にカスタムイメージを作成できる Azure Virtual Desktop カスタム イメージ テンプレートが GA されました。
Announcing general availability of Azure Virtual Desktop Custom Image Templates - Microsoft Community Hub

カスタム イメージ テンプレート は 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

イメージ作成のプロセス

以下のプロセスでカスタム イメージ テンプレートを利用してカスタム イメージを作成していきます。

  1. リソース グループの作成
  2. カスタム ロールの作成
  3. マネージド ID の作成とカスタム ロールの割り当て
  4. Azure Compute Gallery と VM イメージ定義の作成
  5. カスタム イメージ テンプレートの作成
  6. イメージ ビルド

リソース グループの作成

リソース グループを作成します。

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 を作成します。

name value
サブスクリプション
リソース グループ 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 に対して作成したリソース グループの共同作成者のロールが付与され、ストレージ アカウントの作成とスクリプトのアップロードが行われます。

  1. 基本

    name value
    名前 ImageTemplate_AVD_Custom_image_Templates
    既存のテンプレートからのインポート false
    サブスクリプション <SubscriptionName>
    リソース グループ RG_AVD_Custom_Image_Templates
    場所 Japan East
    マネージド ID ManagedId_AVD_Custom_image_Templates
  2. ソース イメージ

    name value
    ソースの種類 プラットフォーム イメージ (マーケットプレース)
    イメージの選択 Windows 10 Enterprise multi-session, Version 22H2 + Microsoft 365 Apps - Gen2
  3. 配布ターゲット

    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
  4. ビルドのプロパティ

    name value
    ビルドのタイムアウト (分) -
    ビルド VM サイズ Standard_D2s_v4 - Gen 2 に推奨
    OS ディスク サイズ (GB) 127
    ステージング グループ -
    Vnet -
    サブネット -
  5. カスタマイズ

    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

参考ドキュメント


  1. 前提条件 では、Microsoft.Compute/images/write, Microsoft.Compute/images/read, Microsoft.Compute/images/delete のアクセス許可を要求されていますが、マネージド イメージを利用しないため含めていません。
  2. タイム ゾーン リダイレクトを設定する
  3. 2023-09-24 時点ではカスタム イメージ テンプレートは CustomImageTemplateScripts_2023-07-31 のスクリプトを参照しています。