こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、いいね、拡散、是非お願いします🥺!
間違ってたら優しく教えてください!
モチベーション
以前下記の記事を書きました
こちらの方法の手順はざっくり以下です。
- ソース環境のマネージドディスクからスナップショットの作成
- ソース環境のスナップショットのエクスポート用 SAS を発行
- ターゲット環境のストレージ アカウントのアップロード用 SAS を発行
- 作成したそれぞれの SAS を使って Azcopy
azcopy copy ‘<ソース SAS>’ ‘<ターゲットSAS>’
- ターゲット環境のストレージ アカウントに作成された VHD からマネージドディスクを作成
- 作成されたマネージドディスクから Azure VM を作成
この方法では以下の問題が発生します。
8 TiB (8192GiB) 以上の容量のディスクではストレージ アカウント(BLOB ストレージ) の仕様に抵触して失敗します。
Azure でサポートされている最大ページ BLOB サイズは、8 TB (8,191 GiB) です。
- サポートされている最大ページ BLOB サイズはどれくらいですか? - ディスクに関してよく寄せられる質問 - Azure Virtual Machines | Microsoft Learn
なので、8 TiB (8192GiB) 以上の容量のディスクを別テナントにコピーするには ストレージ アカウントに VHD を作成する以前の方法以外の方法が必要になりました。
方法概略
ざっくりと以下の手順で可能です。
- ソース環境でのコピーしたいディスクのスナップショットの SAS 発行 (<ソース SAS>)
- ターゲット環境で空のマネージドディスクの作成 (データのUpload 可能な状態で作成)
- ターゲット環境で空のマネージドディスクの SAS 発行 (<ターゲットSAS>)
- Azcopy
azcopy copy ‘<ソース SAS>’ ‘<ターゲットSAS>’
- SAS の無効化 / マネージドディスクのステータス変更
主に下記の MS Learn が参考になります。
- VHD を Azure にアップロードするか、リージョン間でディスクをコピーする - Azure PowerShell - Azure Virtual Machines | Microsoft Learn
コマンド概略
主に CLI 操作が必要なターゲット環境側での操作です。
#空のマネージドディスクの作成
# サイズは 8TiB=8192 GiB (8796093022208 バイト) + 512 バイト = 8796093022720 バイト で計算
$diskconfig = New-AzDiskConfig -SkuName 'Standard_LRS' -OsType 'Windows' -UploadSizeInBytes '8796093022720' -Location '<yourregion>' -CreateOption 'Upload'
New-AzDisk -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>' -Disk $diskconfig
# sas の発行
$diskSas = Grant-AzDiskAccess -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>' -DurationInSecond 864000 -Access 'Write'
$disk = Get-AzDisk -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>'
# ソース URL は スナップショットのエクスポートから発行した SAS 付き URL
AzCopy.exe copy '<ソース sas>' $diskSas.AccessSAS --blob-type PageBlob
# sas の無効化
Revoke-AzDiskAccess -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>'
上記はデータディスクのコピー際のコマンドです。OS ディスクの際は オプションが必要になります。
OS ディスクを作成する場合は、-HyperVGeneration '' を New-AzDiskConfig に追加します。
手順詳細
*後述の手順で出てくる SAS は執筆時時点で使えない状態となっています。
今回の環境
- ソース環境
Subscription ID:XXXXXXXX-XXXXX-XXXX-XXXXXXXXe83
リソースグループ:RG-azcopy
ディスク:empty-8192Gib
スナップショット:snapshot-8192Gib
- ターゲット環境
Subscription ID:XXXXXXXX-XXXXX-XXXX-XXXXXXXX40a
リソースグループ:RG-SAS-test
作成する予定のマネージドディスク:re8TiBDisk
ターゲット環境に空のマネージドディスクを作成(書き込みSAS Upload 可能な状態で作成)
Cloud Shell か、ローカルにインストールした Azure PowerShell でターゲット環境で以下のコマンドを実行する。
# VHD サイズを指定
$vhdSizeBytes =8796093022720
# サイズは 8TiB=8192 GiB (8796093022208 バイト) + 512 バイト = 8796093022720 バイト で計算
$diskconfig = New-AzDiskConfig -SkuName 'Standard_LRS' -OsType 'Windows' -UploadSizeInBytes '8796093022720' -Location 'japaneast' -CreateOption 'Upload'
#マネージドディスクの作成
New-AzDisk -ResourceGroupName 'RG-SAS-test' -DiskName 're8TiBDisk' -Disk $diskconfig
8 TiB の場合の計算
$vhdSizeBytes =8796093022720
(計算式 8(TiB)×1024^4=8796093022208 バイト,
8796093022208 バイト+512バイト=8796093022720 )
# SAS の発行
$diskSas = Grant-AzDiskAccess -ResourceGroupName 'RG-SAS-test' -DiskName 're8TiBDisk' -DurationInSecond 864000 -Access 'Write'
$disk = Get-AzDisk -ResourceGroupName 'RG-SAS-test' -DiskName 're8TiBDisk'
# SAS の確認
$diskSas.AccessSAS
ディスクの状態が "Active Upload" となっていることが確認できる。
- ReadyToUpload : ディスクはアップロードを受け取る準備ができていますが、Secure Access Signature (SAS) が生成されていないことを意味します。
- ActiveUpload : ディスクはアップロードを受け取る準備ができており、SAS が生成済みであることを意味します。
ref: https://learn.microsoft.com/ja-jp/azure/virtual-machines/windows/disks-upload-vhd-to-managed-disk-powershell
また、SAS の有効期限が切れた場合。「ReadyToUpload 」 → 「ActiveUpload 」へと状態が遷移します。後述しますが、 SAS の有効期限は長めに設定するのがよしです。
$diskSas.AccessSAS
が Azcopy の際に必要なので必要に応じてメモしておきます。
こちらが後ほど azcopy copy ‘<ソース SAS>’ ‘<ターゲットSAS>’
の <ターゲット SAS>’
になります。
ソース環境のスナップショットの SAS を発行
$diskSas.AccessSAS
が Azcopy の際に必要なので必要に応じてメモしておきます。
こちらが後ほど azcopy copy ‘<ソース SAS>’ ‘<ターゲットSAS>’
の ’<ソース SAS>’
になります。
Azcopy の実行
$SSAS="(先ほど発行したソースのスナップショットのSAS)"
$DSAS="(先ほど発行したターゲットのマネージドディスクのSAS = $diskSas.AccessSAS)"]
azcopy copy "<ソース SAS>" "<ターゲットSAS>"
例:Cloud Shell
例:ローカル PowerShell (参考)
SAS を無効にする
- ターゲット環境側
# sas の無効化
Revoke-AzDiskAccess -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>'
SAS の有効期限が切れ (「ReadyToUpload 」 → 「ActiveUpload」となった状態) て、その間に azcopy が終わらなかった場合では下記のようにError Messageが出てしまうので、SAS の有効期限は長めにしておくのがよし。
ちなみに、 ReadyToUpload 状態で SAS を失効させようとすると以下のような、Error Message がでます。
Revoke-AzDiskAccess: The specified cookie value in VHD footer indicates that disk 'abcd' with blob https://md-impexp-p3zm11jwdzwz.z27.blob.storage.azure.net:8443/mh3cxx5wbmhx/abcd is not a supported VHD. Disk is expected to have cookie value 'conectix'.
ErrorCode: InvalidVhd
ErrorMessage: The specified cookie value in VHD footer indicates that disk 'abcd' with blob https://md-impexp-p3zm11jwdzwz.z27.blob.storage.azure.net:8443/mh3cxx5wbmhx/abcd is not a supported VHD. Disk is expected to have cookie value 'conectix'.
ErrorTarget:
StatusCode: 400
ReasonPhrase: Bad Request
OperationID : e9a2ccbb-957f-47cd-8561-5eed195f1a27
また クラウドシェルではセッションタイムアウトの時間があり、セッションタイムアウトが発生すると azcopy が実行中にセッションタイムアウトする可能性があるので、今回のように大きいサイズの Azcopy を実行する際はローカル OS 上 から Azcopy を実施することをオススメします。
- Azure Cloud Shell に関してよくあるご質問 (FAQ) | Microsoft Learn
https://learn.microsoft.com/ja-jp/azure/cloud-shell/faq-troubleshooting#is-there-a-time-limit-for-cloud-shell-sessions
Cloud Shell は対話型のユース ケースを想定しています。 Cloud Shell セッションは、無操作状態で 20 分経過するとタイムアウトとなります。 そのため、実行時間の長い非対話型セッションは、警告なしで終了します。
ただし、ローカル端末から Azcopy を実施すると以下のエラーが発生する可能性があります。
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0xc063ea]
検証した結果、 Azcopy 10.23.0 では上記のエラーが発生するが、Azcopy 10.20.0 では起きないことが確認できました。
もし、どうようのエラーがでた場合は一度、Azcopy のバージョンを変えて試してみてください
- Azcopy 10.20.0 のダウンロードリンク:https://azcopyvnext.azureedge.net/releases/release-10.20.0-20230727/azcopy_windows_amd64_10.20.0.zip
他の方法
以下の方法でも可能です。
- Azure Storage Explorer を用いてディスクをコピー
Azure Storage Explorer でも下記ブログ記事に記載の手順にて、8192 GiB マネージド ディスクのコピーが可能でした
・Azure Storage Explorer を用いて、コマンド無しで VM を別のリージョン・サブスクリプション・テナントに移動/複製をしてみよう | Japan Azure IaaS Core Support Blog
https://jpaztech.github.io/blog/vm/copy-vm-with-storage-explorer/
- Azure Storage Explorer とは
https://azure.microsoft.com/ja-jp/products/storage/storage-explorer/