Azure Image Builder でマスターイメージの自動作成を試す!

Azure Image Builder(AIB)とは、マスターイメージを作成するためのインストール作業を全自動化するサービスです。マスターイメージを作成/更新する際には、OSアップデートや各種アプリケーションのインストール作業が発生します。このような時間のかかるインストール作業を自動で行ってくれる便利なサービスです。※AIBは、Packerを利用しています。

【サポートOS】

Azure MarketplaceでサポートされているOS

【イメージ出力形式】

・共有イメージギャラリー
・マネージドイメージ
・VHD ※ストレージアカウントの指定は不可

【Image Builder を設定するための流れ】

①②マネージドIDの適用先と権限を絞るために、リソースグループとカスタムロールを作成します。
③マネージドIDに対して、カスタムロールとリソースグループを割り当てます。
④出力先として指定するため、先にイメージ定義を作成しておきます。
⑤イメージテンプレートを作成するためのJSONを作成します。
ー作成に必要な権限(マネージドID)
ー出力先(共有イメージギャラリー)
ーインストールに必要なスクリプト
⑥イメージテンプレートから、イメージバージョンを作成します。
⑦イメージバージョンから仮想マシンを作成します。

※Azure FilesやANF上のファイルを実行したい場合、プライベートエンドポイントにて既存の仮想ネットワークと接続します。

※補足記事「マスターイメージ管理サービス! 共有イメージギャラリー を試す!


全体の流れ

Step1:リソースグループの作成 (Image Builder専用)
Step2:カスタムロールの作成
Step3:マネージドIDの作成
Step4:イメージ定義 (共有イメージギャラリー)
Step5:JSON (イメージテンプレート作成用)
Step6:イメージテンプレート

※イメージ出力先として「共有イメージギャラリー」を選択しております。


Step1:リソースグループの作成

サブスクリプション:Azureサービスの提供範囲
リソースグループ:表示名
リージョン:※AIBがサポートしているリージョンを選択


Step2:カスタムロールの作成

[サブスクリプション]ー[アクセス制御]ー[+追加]ー[カスタムロールの追加]を選択

カスタムロール名:表示名
説明:コメントを記載
ベースラインのアクセス許可:
ロールを複製します=既存ロールをベースにして作成
最初から始める=ベース無しで作成
JSONから開始=JSONファイルをアップロードして作成

※「アクセス許可」は変更なし

Step1で作成したリソースグループを選択

“actions”項目に下記を追加します。
“Microsoft.Compute/galleries/read”,
“Microsoft.Compute/galleries/images/read”,
“Microsoft.Compute/galleries/images/versions/read”,
“Microsoft.Compute/galleries/images/versions/write”,
“Microsoft.Compute/images/read”,
“Microsoft.Compute/images/write”,
“Microsoft.Compute/images/delete”

最後に確認


Step3:マネージドIDの作成

[検索:managedid]ー[マネージドID]を選択

サブスクリプション:Azureサービスの提供範囲
リソースグループ:※Step1で作成したものを選択
リージョン:※AIBがサポートしているリージョンを選択
Name:表示名

作成したマネージドIDを選択ー[Azureロールの割り当て]ー[ロールの割り当ての追加]を選択

スコープ:※リソースグループを選択
サブスクリプション:
リソースグループ:※Step1で作成したリソースグループを選択
役割:※Step2で作成したカスタムロールを選択

マネージドIDに対して、適用先と権限の付与が完了しました。

マネージドIDの適用が確認できます。


Step4:イメージ定義 (共有イメージギャラリー)

※「共有イメージギャラリー」と「イメージ定義」を作成します。

【共有イメージギャラリー】の作成

サブスクリプション:Azureサービスの提供範囲
リソースグループ:※Step1で作成したものを選択
名前:表示名
リージョン:デプロイするAzureのリージョン
説明:メモ

【イメージ定義】の作成

サブスクリプション:Azureサービスの提供範囲
リソースグループ:※Step1で作成したものを選択
地域:デプロイするAzureのリージョン
ターゲットShared Image Gallery:※本イメージ定義が保存される場所
イメージの定義名:表示名
オペーレーティング システム:※ソースイメージの選択に影響
VMの生成:※ソースイメージの選択に影響
オペーレーティング システムの状態:※”一般化”を選択

発行元:※会社名/組織名 など
オファー:※Windows10_Enterprise_multi-session_Version2004 など
SKU:※利用用途 など

※「バージョン」「発行のオプション」はスルー


Step5:JSON (イメージテンプレート作成用)

Docs記載のテンプレートを利用しております。
※指定のOS展開→FSLogix→OS最適化→Teams→Windows Updateを実行します。

※Cloud Shellにて実施。赤字は適宜書き換えて下さい。
PS /home/taushiga> vi AIB_ImageTemplate.json ※下記をペースト

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "imageTemplateName": {
        "type": "string"
        },
        "api-version": {
          "type": "string"
        },
        "svclocation": {
            "type": "string"
        }
    },
    
    "variables": {
    },

    "resources": [
      {
        "name": "[parameters('imageTemplateName')]",
        "type": "Microsoft.VirtualMachineImages/imageTemplates",
        "apiVersion": "[parameters('api-version')]",
        "location": "[parameters('svclocation')]",
        "dependsOn": [],
            "identity": {
                "type": "UserAssigned",
                        "userAssignedIdentities": {
                        "<マネージドIDのリソースIDをペースト>": {} 
                    }
                    },
        
        "properties": {
            "buildTimeoutInMinutes" : 120,

            "vmProfile": 
                    {
                    "vmSize": "Standard_B2ms",
                    "osDiskSizeGB": 127
                    },
        
            "source": {
                "type": "PlatformImage",
                    "publisher": "MicrosoftWindowsDesktop",
                    "offer": "windows-10",
                    "sku": "21h1-evd",
                    "version": "latest"
            },

            "customize": [
                    {
                        "type": "PowerShell",
                        "name": "installFsLogix",
                        "runElevated": true,
                        "runAsSystem": true,
                        "scriptUri": "https://raw.githubusercontent.com/danielsollondon/azvmimagebuilder/master/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
                    },
                    {
                        "type": "PowerShell",
                        "name": "OptimizeOS",
                        "runElevated": true,
                        "runAsSystem": true,
                        "scriptUri": "https://raw.githubusercontent.com/danielsollondon/azvmimagebuilder/master/solutions/14_Building_Images_WVD/1_Optimize_OS_for_WVD.ps1"
                    },
                    {
                        "type": "WindowsRestart",
                        "restartCheckCommand": "write-host 'restarting post Optimizations'",
                        "restartTimeout": "5m"
                    },
                    {
                        "type": "PowerShell",
                        "name": "Install Teams",
                        "runElevated": true,
                        "runAsSystem": true,
                        "scriptUri": "https://raw.githubusercontent.com/danielsollondon/azvmimagebuilder/master/solutions/14_Building_Images_WVD/2_installTeams.ps1"
                    },
                    {
                        "type": "WindowsRestart",
                        "restartCheckCommand": "write-host 'restarting post Teams Install'",
                        "restartTimeout": "5m"
                    },
                        
                    {
                        "type": "WindowsUpdate",
                        "searchCriteria": "IsInstalled=0",
                        "filters": [
                            "exclude:$_.Title -like '*Preview*'",
                            "include:$true"
                                    ],
                        "updateLimit": 40
                    }

            ],
            "distribute": 
            [
                {   
                    "type": "SharedImage",
                    "galleryImageId": "<イメージ定義のリソースIDをペースト>/versions/1.0.0",
                    "runOutputName": "sigOutput",
                    "replicationRegions": [
                      "japaneast",
                      "japanwest"
                    ],
                    "storageAccountType": "Standard_LRS",
                    "excludeFromLatest": true
                }
            ]
            }
        }
    ]
}    

PS /home/taushiga> New-AzResourceGroupDeployment -ResourceGroupName ImageBuilder -TemplateFile AIB_ImageTemplate.json -api-version “2020-02-14” -imageTemplateName “AVD_ImageTemplate01” -svclocation “westus2
※イメージテンプレートを作成

イメージテンプレートの作成が確認できます。

同時にリソースグループとストレージアカウントが作成される。
※イメージテンプレートで指定したスクリプト,ビルド時のログ,VHDが格納される


Step6:イメージテンプレート

[ビルドの開始]を選択すると、イメージバージョンが作成される。
※JSONビューからテンプレートの内容を確認できる

インストールするアプリによりますが、約90分ほどかかります。

リソースが一時的に作成されます。 ※NSG(in 52.161.20.89:5986) WinRM

完了です!

イメージバージョンの作成が確認できます。


共有イメージギャラリーから、AVD SessionHostを作成する

イメージの種類:ギャラリー
イメージ:すべてのイメージとディスクを参照する

[マイアイテム]ー[共有イメージ]を選択
※作成したイメージバージョンが表示されます。

お疲れ様でした~!