Azure Compute Gallery を使って別テナントに Azure VM を複製する

本記事は、[Microsoft Azure Tech Advent Calendar 2023](https://qiita.com/advent-calendar/2023/microsoft-azure-tech) の 12/23 の投稿です。

こんにちは、アーキテクトのやまぱんです。
今回は Azure Compute Gallery を使って、別テナント(異なるMicrosoft Entra IDに紐づく Azure Subscripton 環境)にAzure VM を複製してみたいと思います。

補足コメントや質問は<font color="red">是非</font>お願いします🥺！

また Azure Compute Gallery を使わない方法はこちらに記載しています！

https://qiita.com/aktsmm/items/ad416cbeab3be6adb5cc


ではさっそく行ってみましょう👍
# Azure Compute Gallery 使って別テナントにAzure VM を複製する手順

## 1.Azure Container Registry を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8d3a8875-7904-b3fc-afda-bca293813e3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a7bd3430-a7bb-6b1a-7151-f9302c7cebc2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/c1e390dc-1761-92ac-8390-74b62cff92ff.png)

数分で作成が完了しました。

## ソースVMのスナップショットを取得してコビーのVMを作成する。(オリジナルのマスターVMを残したい場合)
今回スナップショットは既に作成済だったので、スナップショットの作成は割愛します。
そのため、今回は作成済みのスナップショットからマネージドディスクを作成し、Azure VM を作成します。

作成済みのスナップショットからマネージドディスクを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d4ca6d53-972c-86c3-88ef-d0d4bb850247.png)


作成したディスクから Azure VM を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/acca924b-f30a-abfe-1d98-dc3e906b1f71.png)

数分で VM が作成できした。


## Azure VM を一般化する(一般化したイメージが必要な場合のみ)
一般化した特殊化したイメージでよい場合は

以前書いたこちらの記事や公式ドキュメントを参考にAzure VM を一般化してください。

https://qiita.com/aktsmm/items/4f31e95db4eff1e6f409

https://learn.microsoft.com/ja-jp/azure/virtual-machines/generalize

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e89f2be1-3d3a-1e3b-bd2a-693429315756.png)
こんな感じで一般化が完了しました。

## Azure VM をキャプチャする
念のため、Azure Portal から停止を押して　停止済み(**割り当て解除**) にしておきます。

下記のように [キャプチャ] をクリックして、イメージを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e7388c60-cee1-223a-ec73-92912216fca6.png)

今回は下記のように設定しました。
今回は一般化(汎用化)したイメージからキャプチャを作成しているので **"汎用化"** にチェックがはいっています。一般化していない場合は **"特殊化"** にチェックをいれていただければOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7044d940-7bc7-4f59-3c07-71ee84e794a0.png)

おおよそ10分程度で作成完了です。

## 作成された Azure Compute Gallery を確認
下記のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d24351e5-2bb5-025d-9745-af6f9f365bfc.png)
こちらは一般化 / 汎用化　しているので Generalized になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6e6ddb00-efe6-7003-e3bc-9a9b3d0f7e4f.png)

## Azure Compute Gallery に RBACで、参照する別テナントのユーザーヘアクセス権を付与する。
こちらから対象のユーザーに権限を付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/0a26c6c5-9abb-9934-de04-cd71f589ac3c.png)

詳細はこちらをご確認ください。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/share-gallery?tabs=portal#share-using-rbac

## Azure Compute Gallery 上のイメージをもとに、別テナントに Azure VM を作成する。
移行先のテナント / Subscription にログインして Azure PowerShell を用いて実施します。
ターゲットテナント/ Subscriostion からAzure Portal でやろうとするとギャラリーが表示されないので<font color="red">Azure Portal では実施できません。</font>
以下サンプルコードです。(適宜環境に合わせて変更してください。)

```Azure PowerShell：Azure PowerShell
$resourceGroup = "RG-AGC-test"　#作成する VM のリソースグループ
$location = "Japan East"　#作成する VM のリージョン、対象のイメージと同じリージョンにする必要があります
$vmName = "VMfromAGC" #作成する VM 名

# Set a variable for the image version in Tenant 1 using the full image ID of the image version
$image = "/subscriptions/<ソーステナントのSubscription ID>/resourceGroups/RG-test/providers/Microsoft.Compute/galleries/ACG01/images/WindowsServer-Image01/versions/0.0.1"


# Create user object
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."

# Create a resource group
New-AzResourceGroup -Name $resourceGroup -Location $location

# Networking pieces
$subnetConfig = New-AzVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24
$vnet = New-AzVirtualNetwork -ResourceGroupName $resourceGroup -Location $location `
  -Name MYvNET -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig
$pip = New-AzPublicIpAddress -ResourceGroupName $resourceGroup -Location $location `
  -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP  -Protocol Tcp `
  -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
  -DestinationPortRange 3389 -Access Allow
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroup -Location $location `
  -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP
$nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $resourceGroup -Location $location `
  -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id

# Create a virtual machine configuration using the $image variable to specify the image
$vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1_v2 | `
Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | `
Set-AzVMSourceImage -Id $image | `
Add-AzVMNetworkInterface -Id $nic.Id

# Create a virtual machine
New-AzVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig

```

無事に作成完了しRDP できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/03caac66-f903-3522-7a38-087c38a97e75.png)


詳細手順はこちらの公式ドキュメントがあります。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/vm-generalized-image-version?tabs=cli%2Ccli2%2Ccli3%2Ccli4#rbac---shared-from-another-tenant


## 補足
今回はテナントまたぎで環境における Azure Compute Gallery 利用での Azure VM の作成でしたが、同一 Subscription 内で Azure Compute Gallery からAzure VM を Azure Portal  から作成した場合は以下のようにイメージに関する事前に設定した情報(発行元/オファー/プラン)が Azure VM にも反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f8d67630-fe0e-b374-079a-c11c5eec84c2.png)



# テナントをまたいで Azure VM を複製する他の方法
なお、他に別テナントにAzure VM を複製する方法は以下のようなものがあるかなと思います。
もしニーズがあれば詳しく書くのでコメントいただければと思います。
(他にもある気がしているのでコメントなどで教えていただければ嬉しいです😀)

* 対象のAzure VM のマネージドディスクのSASを発行して、別テナントのストレージ アカウントにVHDを作ってそのVHDからマネージドディスクを作成する方法
こちらが参考になるかと思います

https://cloudsteady.jp/2022/06/29/58822/

こちらの記事も書きました

https://qiita.com/aktsmm/items/ad416cbeab3be6adb5cc

* 対象の Azure VM のマネージドディスクからスナップショットを作成し、その SAS を発行して、別テナントのストレージ アカウントに VHD を作ってその VHD からマネージドディスクを作成する方法
またさらに、移行先のストレージ アカウントの SAS を発行するか、 Azure にログインして Start-AzStorageBlobCopy などを利用して行うかでもそれぞれ方法があります。

Azcopy と 2 つの SAS を使う場合、こちらが参考になるかと思います
https://tech-blog.cloud-config.jp/2021-12-22-vmcopy-to-another-tenant/

MS公式のサポートブログにもこのあたりまとめられており、下記が参考になるかと思います
https://jpaztech.github.io/blog/vm/create-vm-using-vhd/


+ また、Azure VM Backup のクロスサブスクリプションリストアという機能があり、こちらの場合は別テナントにはリストアできませんが、別 Subscription 環境にAzure VM をリストア(複製)することができます。
ただし、現在はパブリックプレビューです。

・クロス サブスクリプション復元 (プレビュー)

https://learn.microsoft.com/ja-JP/azure/backup/backup-azure-arm-restore-vms#cross-subscription-restore-preview

・Azure Backup の Cross Subscription Restore を試す！
以前書いた記事です

https://qiita.com/aktsmm/items/e32f8615938e4ed19360


## 参考

以前Azure Compute Gallery とは という記事を書きました

https://qiita.com/aktsmm/private/dc6634401e4cbcacf06c