azure - 如何将 Azure VM 映像移动到其他位置
问题描述
我在美国东部有一个带有托管磁盘的 azure VM 映像,我想将其移动/复制到西欧。
有没有简单的方法来做到这一点?
我看到有一个名为 az-image-copy 的 azure cli 扩展,但它对我不起作用,因为它输出一个错误,指出它找不到 OS 磁盘(即使资源 ID 是正确的并且我可以看到它在天蓝色的门户中)
错误:找不到资源 ServerLinux_OsDisk_1_c208679747734937b10a1525aa84a7d7
那么还有其他方法可以做到吗?
解决方案
您可以使用 azure powershell 复制托管映像,创建快照并将其复制到另一个区域,然后创建映像。这是一个类似的问题。
创建快照:
<# -- Create a snapshot of the OS (and optionally data disks) from the generalized VM -- #>
$vm = Get-AzureRmVM -ResourceGroupName $resourceGroupName -Name $vmName
$disk = Get-AzureRmDisk -ResourceGroupName $resourceGroupName -DiskName $vm.StorageProfile.OsDisk.Name
$snapshot = New-AzureRmSnapshotConfig -SourceUri $disk.Id -CreateOption Copy -Location $region
$snapshotName = $imageName + "-" + $region + "-snap"
New-AzureRmSnapshot -ResourceGroupName $resourceGroupName -Snapshot $snapshot -SnapshotName $snapshotName
复制快照:
# Create the name of the snapshot, using the current region in the name.
$snapshotName = $imageName + "-" + $region + "-snap"
# Get the source snapshot
$snap = Get-AzureRmSnapshot -ResourceGroupName $resourceGroupName -SnapshotName $snapshotName
# Create a Shared Access Signature (SAS) for the source snapshot
$snapSasUrl = Grant-AzureRmSnapshotAccess -ResourceGroupName $resourceGroupName -SnapshotName $snapshotName -DurationInSecond 3600 -Access Read
# Set up the target storage account in the other region
$targetStorageContext = (Get-AzureRmStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
New-AzureStorageContainer -Name $imageContainerName -Context $targetStorageContext -Permission Container
# Use the SAS URL to copy the blob to the target storage account (and thus region)
Start-AzureStorageBlobCopy -AbsoluteUri $snapSasUrl.AccessSAS -DestContainer $imageContainerName -DestContext $targetStorageContext -DestBlob $imageBlobName
Get-AzureStorageBlobCopyState -Container $imageContainerName -Blob $imageBlobName -Context $targetStorageContext -WaitForComplete
# Get the full URI to the blob
$osDiskVhdUri = ($targetStorageContext.BlobEndPoint + $imageContainerName + "/" + $imageBlobName)
# Build up the snapshot configuration, using the target storage account's resource ID
$snapshotConfig = New-AzureRmSnapshotConfig -AccountType StandardLRS `
-OsType Windows `
-Location $targetRegionName `
-CreateOption Import `
-SourceUri $osDiskVhdUri `
-StorageAccountId "/subscriptions/${sourceSubscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.Storage/storageAccounts/${storageAccountName}"
# Create the new snapshot in the target region
$snapshotName = $imageName + "-" + $targetRegionName + "-snap"
$snap2 = New-AzureRmSnapshot -ResourceGroupName $resourceGroupName -SnapshotName $snapshotName -Snapshot $snapshotConfig
创建图像:
<# -- In the second subscription, create a new Image from the copied snapshot --#>
Select-AzureRmSubscription -SubscriptionId $targetSubscriptionId
$snap = Get-AzureRmSnapshot -ResourceGroupName $resourceGroupName -SnapshotName $snapshotName
$imageConfig = New-AzureRmImageConfig -Location $destinationRegion
Set-AzureRmImageOsDisk -Image $imageConfig `
-OsType Windows `
-OsState Generalized `
-SnapshotId $snap.Id
New-AzureRmImage -ResourceGroupName $resourceGroupName `
-ImageName $imageName `
-Image $imageConfig
有关更多详细信息,请参阅此链接。
推荐阅读
- solr - Solr 嵌套连接
- angular - localhost 在运行测试用例后拒绝连接显示
- c# - Azure Function .Net 5 使用 ServiceBusTrigger
- telegram - 如何让 Telegram 机器人向群组发送通知?
- mongodb - 在这种情况下,为什么 $gt 运算符在没有 $expr 的情况下不起作用?
- ruby-on-rails - RubyZip 不上传相同的文件
- android-jetpack-compose - 如何在jetpack compose的导航中传递对象?
- macos - 任何带有“错误:caskroom/cask 已移动。请点击 homebrew/cask”的 brew 命令错误。
- javascript - 使用 Promise 处理由 Ajax 生成的模态表单
- regex - PostgreSQL '间隔' 函数的正则表达式