次の方法で共有


Azure VM Image Builder と Microsoft Dev Box を使用して開発ボックスを構成する

この記事では、Azure VM Image Builder を使用して、カスタマイズした開発ボックスを Microsoft Dev Box でテンプレートを利用して作成します。 テンプレートには、Visual Studio Code (VS Code) をインストールするためのカスタマイズ手順が含まれます。

標準化された仮想マシン (VM) イメージを使用すると、クラウドへの移行時に一貫性のあるデプロイを確保できます。 これらのイメージには、事前に定義されたセキュリティと構成設定と、必要なソフトウェアを含めることができます。 イメージング パイプラインの設定には時間がかかり、複雑になる場合があります。 Azure VM Image Builder を使用すると、イメージの構成を作成できるようになり、それはサービスによってビルドされ、開発ボックス プロジェクトに送信されるので、このプロセスが簡略化されます。

手動で、または他のツールを使用してカスタムの VM イメージを作成することは困難で、信頼性が低い場合があります。 VM Image Builder は HashiCorp Packer に基づいて構築されており、管理サービスの利点があります。

VM イメージの作成を簡略化するための VM Image Builder の機能:

  • 複雑なツール、プロセス、手動の手順が不要になります。 このような詳細は抽象化され、イメージの一般化 (Sysprep) などの Azure 固有のニーズが隠されると同時に、上級ユーザーは必要に応じてオーバーライドできます。
  • 既存のイメージ ビルド パイプラインと連携します。 パイプラインから VM Image Builder を呼び出すか、Azure VM Image Builder サービス DevOps タスクを使用することができます。
  • さまざまなソースからカスタマイズ データが収集されるため、すべてを 1 か所で収集する必要はありません。
  • Azure Compute Gallery と統合され、グローバル分散、レプリケーション、バージョン管理、スケーリングのためのイメージ管理システムが作成されます。 同じイメージを仮想ハード ディスクまたはマネージド イメージとしてリビルドせずに配布できます。

重要

Microsoft Dev Box では、セキュリティの種類としてトラステッド起動対応を使用するイメージのみがサポートされます。

前提条件

VM Image Builder を使用して作成したカスタム イメージをプロビジョニングするには、以下が必要です。

最初の手順は、Azure VM Image Builder と Azure PowerShell を使用して、Azure Compute Gallery にイメージを作成し、それをグローバルに配布することです。

PowerShell を使用する例を次に示します。 Azure コマンド ライン インターフェイス (CLI) を使用することもできます。

  1. VM Image Builder を使用するには、機能を登録する必要があります。

    プロバイダー登録を確認してください。 指定した機能に対して各コマンドから Registered が返されることを確認します。

       Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState 
       Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState  
       Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState 
       Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState 
       Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState 
    

    プロバイダーの登録によって Registered が返されない場合は、以下のコマンドを実行してプロバイダーを登録します。

       Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages  
       Register-AzResourceProvider -ProviderNamespace Microsoft.Storage  
       Register-AzResourceProvider -ProviderNamespace Microsoft.Compute  
       Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault  
       Register-AzResourceProvider -ProviderNamespace Microsoft.Network 
    
  2. PowerShell モジュールをインストールします。

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. 複数回使用する情報を格納する変数を作成します。

    1. 次のサンプル コードをコピーします。
    2. <Resource group> は、デベロッパー センターの作成に使用したリソース グループに置き換えます。
    3. 更新されたコードを PowerShell で実行します。
    # Get existing context 
    $currentAzContext = Get-AzContext
    
    # Get your current subscription ID  
    $subscriptionID=$currentAzContext.Subscription.Id
    
    # Destination image resource group  
    $imageResourceGroup="<Resource group>"
    
    # Location  
    $location="eastus2"
    
    # Image distribution metadata reference name  
    $runOutputName="aibCustWinManImg01"
    
    # Image template name  
    $imageTemplateName="vscodeWinTemplate"  
    
  4. PowerShell で次のコードを実行して、ユーザー割り当て ID を作成し、リソース グループにアクセス許可を設定します。

    VM Image Builder は、指定されたユーザー ID を使用して、イメージを Azure Compute Gallery に保存します。 次の例では、イメージを配布するための特定のアクションを使用して、Azure ロールの定義を作成しています。 このロール定義はその後、ユーザー ID に割り当てられます。

    # Set up role definition names, which need to be unique 
    $timeInt=$(get-date -UFormat "%s") 
    $imageRoleDefName="Azure Image Builder Image Def"+$timeInt 
    $identityName="aibIdentity"+$timeInt 
    
    # Add an Azure PowerShell module to support AzUserAssignedIdentity 
    Install-Module -Name Az.ManagedServiceIdentity 
    
    # Create an identity 
    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
    $identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id 
    $identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    
  5. イメージを配布するための、ID のアクセス許可を割り当てます。

    このコマンドを使用して Azure ロールの定義テンプレートをダウンロードし、それを先ほど指定したパラメーターで更新します。

    $aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json" 
    $aibRoleImageCreationPath = "aibRoleImageCreation.json" 
    
    # Download the configuration 
    Invoke-WebRequest -Uri $aibRoleImageCreationUrl -OutFile $aibRoleImageCreationPath -UseBasicParsing 
    ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $aibRoleImageCreationPath 
    ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $aibRoleImageCreationPath 
    ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $aibRoleImageCreationPath 
    
    # Create a role definition 
    New-AzRoleDefinition -InputFile  ./aibRoleImageCreation.json
    
    # Grant the role definition to the VM Image Builder service principal 
    New-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup" 
    

Azure Compute Gallery で VM Image Builder を使用するには、ギャラリーとイメージ定義を用意しておきます。 VM Image Builder では、ギャラリーとイメージ定義は自動的には作成されません。

  1. 次のコマンドを実行して、新しいギャラリーとイメージ定義を作成します。

    このコードは、"トラステッド起動" というセキュリティの種類で定義を作成できるだけでなく、Windows 365 イメージの要件を満たします。

    # Gallery name 
    $galleryName= "devboxGallery" 
    
    # Image definition name 
    $imageDefName ="vscodeImageDef" 
    
    # Additional replication region 
    $replRegion2="eastus" 
    
    # Create the gallery 
    New-AzGallery -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location 
    
    $SecurityType = @{Name='SecurityType';Value='TrustedLaunch'} 
    $features = @($SecurityType) 
    
    # Create the image definition
    New-AzGalleryImageDefinition -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCompany' -Offer 'vscodebox' -Sku '1-0-0' -Feature $features -HyperVGeneration "V2" 
    
  2. テンプレート定義を保存するファイル (c:/temp/mytemplate.txt など) を作成します。

  3. 次の VM Image Builder 用の Azure Resource Manager テンプレートを新しいテンプレート ファイルにコピーします。

    このテンプレートで、ソース イメージと、適用されるカスタマイズを指定します。 これにより、Choco と VS Code がインストールされ、イメージの配布場所も示されます。

    {
       "$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": [],
          "tags": {
            "imagebuilderTemplate": "win11multi",
            "userIdentity": "enabled"
          },
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
             "<imgBuilderId>": {}
            }
          },
          "properties": {
            "buildTimeoutInMinutes": 100,
            "vmProfile": {
             "vmSize": "Standard_DS2_v2",
             "osDiskSizeGB": 127
            },
          "source": {
             "type": "PlatformImage",
             "publisher": "MicrosoftWindowsDesktop",
             "offer": "Windows-11",
             "sku": "win11-21h2-ent",
             "version": "latest"
          },
            "customize": [
             {
                "type": "PowerShell",
                "name": "Install Choco and Vscode",
                "inline": [
                   "Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))",
                   "choco install -y vscode"
                ]
             }
            ],
             "distribute": 
             [
                {   
                   "type": "SharedImage",
                   "galleryImageId": "/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<sharedImageGalName>/images/<imageDefName>",
                   "runOutputName": "<runOutputName>",
                   "artifactTags": {
                      "source": "azureVmImageBuilder",
                      "baseosimg": "win11multi"
                   },
                   "replicationRegions": [
                     "<region1>",
                     "<region2>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    テンプレート ファイルを閉じてから、次の手順に進んでください。

  4. 変数を使用して新しいテンプレートを構成します。

    <Template Path> をテンプレート ファイルの場所 (c:/temp/mytemplate など) に置き換えます。

    $templateFilePath = <Template Path>
    
    (Get-Content -path $templateFilePath -Raw ) -replace '<subscriptionID>',$subscriptionID | Set-Content -Path $templateFilePath 
    (Get-Content -path $templateFilePath -Raw ) -replace '<rgName>',$imageResourceGroup | Set-Content -Path $templateFilePath 
    (Get-Content -path $templateFilePath -Raw ) -replace '<runOutputName>',$runOutputName | Set-Content -Path $templateFilePath  
    (Get-Content -path $templateFilePath -Raw ) -replace '<imageDefName>',$imageDefName | Set-Content -Path $templateFilePath  
    (Get-Content -path $templateFilePath -Raw ) -replace '<sharedImageGalName>',$galleryName| Set-Content -Path $templateFilePath  
    (Get-Content -path $templateFilePath -Raw ) -replace '<region1>',$location | Set-Content -Path $templateFilePath  
    (Get-Content -path $templateFilePath -Raw ) -replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath  
    ((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath 
    
  5. テンプレートをサービスに送信します。

    以下のコマンドを使用して、スクリプトなどの依存する成果物をダウンロードし、それらをステージング リソース グループに格納します。 ステージング リソース グループには IT_ というプレフィックスが付きます。

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. テンプレートに対して Run コマンドを呼び出してイメージをビルドします。

    実行プロセスを確認するプロンプトで、「Yes」と入力します。

    Invoke-AzResourceAction  -ResourceName $imageTemplateName  -ResourceGroupName $imageResourceGroup  -ResourceType Microsoft.VirtualMachineImages/imageTemplates  -ApiVersion "2020-02-14"  -Action Run
    

    重要

    イメージを作成し、両方のリージョンにレプリケートするまでにしばらくかかることがあります。 PowerShell と Azure portal とでは、進行状況レポートに違いが見られる場合があります。 開発ボックスの定義の作成を開始する前に、このプロセスが完了するまで待ちます。

  7. 実行状態やプロビジョニング状態など、新しく構築されたイメージに関する情報を取得します。

    Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup | Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState 
    

    サンプル出力:

    Name                 LastRunStatusRunState    LastRunStatusMessage   ProvisioningState
    ---------------------------------------------------------------------------------------
    vscodeWinTemplate                                                    Creating
    

    Azure portal でイメージのプロビジョニング状態を確認することもできます。 ギャラリーに移動して、イメージの定義を確認します。

    カスタマイズされたイメージ バージョンのプロビジョニング状態を示すスクリーンショット。

カスタム イメージがギャラリーに格納されている場合、デベロッパー センターのイメージを使用するようにギャラリーを構成できます。 詳細については、Azure Compute Gallery の構成に関するページを参照してください。

カスタム イメージを使用して Microsoft Dev Box を設定する

デベロッパー センターでギャラリー イメージが使用可能になったら、Microsoft Dev Box でカスタム イメージを使用できます。 詳細については、「クイックスタート: Microsoft Dev Box を構成する」を参照してください。