Share via


PowerShell を使用して、VM Image Builder で Windows VM を作成します

適用対象: ✔️ Windows VM

この記事では、Azure VM Image Builder PowerShell モジュールを使用して、カスタマイズされた Windows VM イメージを作成する方法について説明します。

前提条件

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。

ローカルで PowerShell を使用する場合、この記事では Azure PowerShell モジュールをインストールし、Connect-AzAccount コマンドレットを使用して Azure アカウントに接続することが必要です。 詳しくは、Azure PowerShell のインストールに関する記事をご覧ください。

一部の手順では、Az.ImageBuilder モジュールのコマンドレットが必要になります。 次のコマンドを使用して、個別にインストールします。

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure では、ブラウザーを介して使用できる対話型のシェル環境、Azure Cloud Shell がホストされています。 Cloud Shell で Bash または PowerShell を使用して、Azure サービスを操作できます。 ローカル環境に何もインストールしなくても、Cloud Shell にプレインストールされているコマンドを使用して、この記事のコードを実行できます。

Azure Cloud Shell を開始するには、以下のようにします。

オプション 例とリンク
コードまたはコマンド ブロックの右上隅にある [使ってみる] を選択します。 [使ってみる] を選択しても、コードまたはコマンドは Cloud Shell に自動的にはコピーされません。 Screenshot that shows an example of Try It for Azure Cloud Shell.
https://shell.azure.com に移動するか、[Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。 Button to launch Azure Cloud Shell.
Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。 Screenshot that shows the Cloud Shell button in the Azure portal

Azure Cloud Shell を使用するには、以下のようにします。

  1. Cloud Shell を開始します。

  2. コード ブロック (またはコマンド ブロック) の [コピー] ボタンを選択し、コードまたはコマンドをコピーします。

  3. Windows と Linux では Ctrl+Shift+V キーを選択し、macOS では Cmd+Shift+V キーを選択して、コードまたはコマンドを Cloud Shell セッションに貼り付けます。

  4. Enter キーを選択して、コードまたはコマンドを実行します。

複数の Azure サブスクリプションをお持ちの場合は、リソースが課金の対象となる適切なサブスクリプションを選択してください。 Set-AzContext コマンドレットを使用して、特定のサブスクリプションを選択します。

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

プロバイダーを登録する

まだ登録していない場合は、Azure サブスクリプションで使用する次のリソース プロバイダーを登録します:

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

変数の定義

いくつかの情報を繰り返し使用するので、その情報を保存するいくつかの変数を作成します:

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Azure サブスクリプション ID の変数を作成します。 subscriptionID 変数にサブスクリプション ID が含まれていることを確認するには、次の例の 2 行目を実行します:

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

リソース グループを作成する

New-AzResourceGroup コマンドレットを使用して Azure リソース グループを作成します。 リソース グループとは、複数の Azure リソースをまとめてデプロイ、管理する際の論理コンテナーです。

次の例では、$location 変数に指定されたリージョンに、$imageResourceGroup 変数内の名前に基づいてリソース グループを作成します。 このリソース グループは、イメージ構成テンプレート成果物およびイメージを格納するために使用されます。

New-AzResourceGroup -Name $imageResourceGroup -Location $location

ユーザー ID を作成してロールのアクセス許可を設定します

以下の例を使用して、指定したリソース グループにイメージを作成するため、Azure Image Builder のアクセス許可を付与します。 このアクセス許可がないと、イメージのビルド プロセスが正常に終了しません。

  1. ロールの定義と ID の名前に使用する変数を作成します。 これらの値は一意である必要があります。

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. ユーザー ID を作成します。

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. ID リソースとプリンシパル ID を変数に格納します。

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

ID にイメージを配布するためのアクセス許可を割り当てます

  1. JSON 構成ファイルをダウンロードし、この記事で定義されている設定に基づいて変更します。

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. ロール定義を作成します。

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. VM Image Builder のサービス プリンシパルにロールの定義を付与します。

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

注意

[New-AzRoleDefinition]というエラーが表示された場合。役割定義の制限を超えました。 [ロールの定義をこれ以上作成することはできません] というエラーが表示された場合は、「Azure RBAC のトラブルシューティング(ロールベースのアクセス制御)」を参照してください。

  1. ギャラリーを作成します。

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. ギャラリーの定義を作成します。

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

イメージを作成する

  1. VM Image Builder のソース オブジェクトを作成します。 有効なパラメーター値については、「Azure PowerShell を使用して Azure Marketplace で Windows VM イメージを検索する」を参照してください。

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. VM Image Builder のディストリビューターオブジェクトを作成します。

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. VM Image Builder カスタマイズオブジェクトを作成します。

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. 2 番目の VM Image Builder カスタマイズ・オブジェクトを作成します。

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. VM Image Builder のテンプレートを作成します。

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

テンプレートが作成されると、メッセージが返され、VM Image Builder 構成テンプレートが $imageResourceGroup に作成されます。

テンプレートの作成プロセスが正常に行われたかどうかを判断するには、次の例を使用します:

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

VM Image Builder はバックグラウンドで、サブスクリプションにステージングリソースグループも作成します。 このリソース グループがイメージのビルドに使用されます。 これは、IT_<DestinationResourceGroup>_<TemplateName> という形式になっています。

警告

ステージング リソース グループは直接削除しないでください。 ステージング リソース グループを削除させるには、イメージ テンプレート成果物を削除します。

イメージ構成テンプレートを送信するときにサービスから失敗が報告された場合は、次を実行します:

イメージのビルドを開始する

次のコマンドを実行して、VM Image Builder サービスにイメージ構成を送信します:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

イメージの作成プロセスが完了するまで待ちます。最大で 1 時間かかる場合があります。

エラーが発生した場合は、「Azure VM Image Builder の失敗のトラブルシューティング」を参照してください。

VM の作成

  1. VM のログイン資格情報を変数に保存します。 パスワードは複雑なものにする必要があります。

    $Cred = Get-Credential
    
  2. 作成したイメージを使用して VM を作成します。

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

カスタマイズを確認する

  1. VM を作成するときに設定したユーザー名とパスワードを使用して、VM へのリモート デスクトップ接続を作成します。

  2. VM 内で PowerShell を開き、次の例のように Get-Content を実行します:

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    イメージ カスタマイズ プロセス中に作成されたファイルの内容に基づいて出力をします。

    Azure-Image-Builder-Was-Here
    
  3. 同じ PowerShell セッションから、次の例に示すように、c:\buildArtifacts\index.html が存在するか調べて、2 番目のカスタマイズが正常に終了したことを確認します:

    Get-ChildItem c:\buildArtifacts\
    

    結果は、イメージのカスタマイズ プロセス中にダウンロードされたファイルを示すディレクトリの一覧になります。

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

リソースをクリーンアップする

このプロセス中に作成されたリソースが不要になった場合は、次の手順を実行してリソースを削除できます:

  1. VM Image Builder テンプレートを削除します。

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. イメージ リソース グループを削除します。

    注意事項

    次の例では、指定されたリソース グループとそれに含まれるすべてのリソースを削除します。 この記事の範囲外のリソースがリソースグループに存在する場合、それらも削除されます。

    Remove-AzResourceGroup -Name $imageResourceGroup
    

次のステップ

この記事で使用している JSON ファイルのコンポーネントの詳細については、VM Image Builder テンプレートに関するリファレンスを参照してください。