VMを別テナントに複製したい時が来たときのために
2021-12-22
azblob://2022/11/11/eyecatch/2021-12-22-vmcopy-to-another-tenant-000.jpg

この記事はFIXER Advent Calendar 2021 22日目 の記事です。

どうも、FIXERの細井です!

今回はDevelop環境で作成したVMを別テナントのProduction環境に複製する必要があったので記事にしました。

VMを検証環境のテナントから本番環境のテナントへの移動する方法はいくつかありますが、今回は「Az PowerShell」モジュールを使ってテナント間の複製を行っていきたいと思います。

1. 事前準備

今回はAz PowerShellモジュールを使用するので、まだインストールしてない人は、Azure Az PowerShell モジュールの概要 を参考にインストールしてください。

複製元のテナント

複製する対象のVMを停止しておく。

複製先のテナント

複製するManaged Disksを保管するストレージアカウントとコンテナーを作成しておく。

準備しておくこととしてはこれぐらいで大丈夫だと思います。

2. 別テナントへ複製

  1. まずはPowerShellを開いて、複製するManaged Diskがあるサブスクリプションにログインしましょう。
Login-AzAccount

※多要素認証を設定してると、下記のような警告が出てくるので、-SubscriptionIdオプションを追加して認証を通しましょう。

Login-AzAccount -TenantId "テナントID"

※テナントIDはAzure Portalから右上のアイコンクリック→ディレクトリの切り替え→[ディレクトリID]から複製元のIDをコピペします。

成功したら自分のアカウント名と関連付けられたサブスクリプション等のリストが表示されると思います。

サブスクリプションが複数ある場合は、下記のコマンドを実行して複製対象のサブスクリプションを選択しましょう。

Select-AzSubscription -SubscriptionId  "複製先のサブスクリプションID"

※サブスクリプションIDはリソースの概要画面に[サブスクリプションID]があるので、それをコピペしてください。

成功したら選択したサブスクリプション名が表示されます。

2. 次にSASを発行します。その際に必要なパラメータを設定しておきます。

パラメータ

# 複製「元」のパラメータ
$rgname = "リソースグループ名"
$diskname = "対象のManaged Disks名"

SAS(有効期限を1時間に設定)

$diskSas = Grant-AzDiskAccess -ResourceGroupName $rgname -DiskName $diskname -Access Read -DurationInSecond 3600

3. 先ほどの手順1を参考に、今度は「複製先」のテナントにログインします。

4. 複製時に必要なパラメータを設定します。

# 複製「先」のパラメータ
$targetrgname = "リソースグループ名"
$storageaccountname = "事前準備で作成したストレージアカウント名"
$containername = "事前準備で作成したコンテナ名"

$storageaccountkey = Get-AzStorageAccountKey -ResourceGroupName $targetrgname -Name $storageaccountname
$storagecontext = New-AzStorageContext -StorageAccountName $storageaccountname -StorageAccountKey $storageaccountkey[0].Value
$storagecontainer = Get-AzStorageContainer -Name $containername -Context $storagecontext

$copydiskname = "複製後のディスク名"
$sourceSas = $diskSas.AccessSAS

5. 複製の実行

$ops = Start-AzStorageBlobCopy -AbsoluteUri $sourceSas -DestBlob $copydiskname -DestContainer $storagecontainer.Name -DestContext $storagecontext 
Get-AzStorageBlobCopyState -Container $storagecontainer.Name -Blob $copydiskname -Context $storagecontext -WaitForComplete

3. 複製したManaged DisksからVMを作成

複製されたManaged DisksはVHDファイルとしてストレージアカウントに保管されています。

  1. まずはVHDファイルをManaged Disksに変換します。手順2-1で複製先のサブスクリプションを選択しておきます。
  2. パラメータを設定します。
# VHD を管理ディスクに変換します。
#パラメーター
$ResourceGroupName = "リソース グループ名"
$Location = "Japan East などリージョン名"
$DiskName = "Managed Disks に変換後のディスク名"
$vhdUri = "VHD のフルパス (https://<ストレージ アカウント名>.blob.core.windows.net/<コンテナー名>/<VHD ファイル名>.vhd)"
$OsType = "ManagedDiskのOS Type (Windowsなど)"

# VHD を管理ディスクへ変換
$disk1 = New-AzureRmDisk -DiskName $diskName -Disk (New-AzureRmDiskConfig -AccountType Premium_LRS -Location $Location -CreateOption Import -SourceUri $vhdUri -OsType $OsType) -ResourceGroupName $ResourceGroupName

※現時点では、管理ディスク (Managed Disk) にて使用できる -AccountType オプションは、Standard_LRS と Premium_LRS だけです。

3. 指定したリソースグループに複製したManaged Diskが作成されているのを確認してください。

4. 最後にディスク概要→[VM]の作成からVMを立てることができます。

以上でVMを今のテナント(develop)から別のテナント(production)に複製できたかと思います。

年末は大寒波が来るそうなので、防寒対策しっかりして体調を崩さないように気を付けてください!

それでは、少し早いですが、よいお年を!!