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 に自動的にはコピーされません。 | |
https://shell.azure.com に移動するか、[Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。 | |
Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。 |
Azure Cloud Shell を使用するには、以下のようにします。
Cloud Shell を開始します。
コード ブロック (またはコマンド ブロック) の [コピー] ボタンを選択し、コードまたはコマンドをコピーします。
Windows と Linux では Ctrl+Shift+V キーを選択し、macOS では Cmd+Shift+V キーを選択して、コードまたはコマンドを Cloud Shell セッションに貼り付けます。
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 のアクセス許可を付与します。 このアクセス許可がないと、イメージのビルド プロセスが正常に終了しません。
ロールの定義と ID の名前に使用する変数を作成します。 これらの値は一意である必要があります。
[int]$timeInt = $(Get-Date -UFormat '%s') $imageRoleDefName = "Azure Image Builder Image Def $timeInt" $identityName = "myIdentity$timeInt"
ユーザー ID を作成します。
New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
ID リソースとプリンシパル ID を変数に格納します。
$identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
ID にイメージを配布するためのアクセス許可を割り当てます
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
ロール定義を作成します。
New-AzRoleDefinition -InputFile $myRoleImageCreationPath
VM Image Builder のサービス プリンシパルにロールの定義を付与します。
$RoleAssignParams = @{ ObjectId = $identityNamePrincipalId RoleDefinitionName = $imageRoleDefName Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup" } New-AzRoleAssignment @RoleAssignParams
注意
[New-AzRoleDefinition]というエラーが表示された場合。役割定義の制限を超えました。 [ロールの定義をこれ以上作成することはできません] というエラーが表示された場合は、「Azure RBAC のトラブルシューティング(ロールベースのアクセス制御)」を参照してください。
Azure Compute Gallery の作成
ギャラリーを作成します。
$myGalleryName = 'myImageGallery' $imageDefName = 'winSvrImages' New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
ギャラリーの定義を作成します。
$GalleryParams = @{ GalleryName = $myGalleryName ResourceGroupName = $imageResourceGroup Location = $location Name = $imageDefName OsState = 'generalized' OsType = 'Windows' Publisher = 'myCo' Offer = 'Windows' Sku = 'Win2019' } New-AzGalleryImageDefinition @GalleryParams
イメージを作成する
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
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
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
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
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>
という形式になっています。
警告
ステージング リソース グループは直接削除しないでください。 ステージング リソース グループを削除させるには、イメージ テンプレート成果物を削除します。
イメージ構成テンプレートを送信するときにサービスから失敗が報告された場合は、次を実行します:
「Azure VM Image Builder の失敗のトラブルシューティング」を参照してください。
テンプレートの送信を再試行する前に、次の例に従ってテンプレートを削除します:
Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
イメージのビルドを開始する
次のコマンドを実行して、VM Image Builder サービスにイメージ構成を送信します:
Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
イメージの作成プロセスが完了するまで待ちます。最大で 1 時間かかる場合があります。
エラーが発生した場合は、「Azure VM Image Builder の失敗のトラブルシューティング」を参照してください。
VM の作成
VM のログイン資格情報を変数に保存します。 パスワードは複雑なものにする必要があります。
$Cred = Get-Credential
作成したイメージを使用して VM を作成します。
$ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
カスタマイズを確認する
VM を作成するときに設定したユーザー名とパスワードを使用して、VM へのリモート デスクトップ接続を作成します。
VM 内で PowerShell を開き、次の例のように
Get-Content
を実行します:Get-Content -Path C:\buildActions\buildActionsOutput.txt
イメージ カスタマイズ プロセス中に作成されたファイルの内容に基づいて出力をします。
Azure-Image-Builder-Was-Here
同じ 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
リソースをクリーンアップする
このプロセス中に作成されたリソースが不要になった場合は、次の手順を実行してリソースを削除できます:
VM Image Builder テンプレートを削除します。
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
イメージ リソース グループを削除します。
注意事項
次の例では、指定されたリソース グループとそれに含まれるすべてのリソースを削除します。 この記事の範囲外のリソースがリソースグループに存在する場合、それらも削除されます。
Remove-AzResourceGroup -Name $imageResourceGroup
次のステップ
この記事で使用している JSON ファイルのコンポーネントの詳細については、VM Image Builder テンプレートに関するリファレンスを参照してください。