是否可以将Azure VM映像从一个订阅迁移到另一个订阅?

我最近在一个存储帐户中捕获了一个azure色的vm映像,并计划将此映像迁移到另一个不同订阅的另一个存储帐户。 我使用PowerShell脚本来运行这个任务,但我遇到了这个问题:没有find存储帐户。 还有一个问题是,PowerShell必须与特定的Azure帐户相关,否则无法运行脚本。 那么故事就是如何使用PowerShell同时控制不同的订阅,并执行迁移任务? 谢谢。

顺便说一句,PowerShell脚本如下所示:

更改这些以匹配来源帐户

$ sourceStorageAccountName =“”$ sourceContainerName =“”$ sourceStorageKey =“”#需要从不同的订阅中移动数据

目的地帐户信息

$ destStorageAccountName =读取主机“input目标存储帐户名称”$ destStorageAccountKey = Get-AzureStorageKey $ destStorageAccountName | %{$ _主要} $ destContainerName =读取主机“input目的地容器名称”

$ sourceContext = New-AzureStorageContext -StorageAccountName $ sourceStorageAccountName -StorageAccountKey $ sourceStorageKey -Protocol Http $ destContext = New-AzureStorageContext -StorageAccountName $ destStorageAccountName -StorageAccountKey $ destStorageAccountKey

$ uri = $ sourceContext.BlobEndPoint + $ sourceContainerName +“/”

复制操作

Get-AzureStorageBlob -Context $sourceContext $ sourceContainerName | ForEach-Object { Start-AzureStorageBlobCopy -SrcUri“$ uri $($ -DestContext $destContext )”- -DestContext $destContext -DestContainer $ destContainerName -DestBlob "hackathon/$($_.Name)" }

检查Blob Copy的状态 – 如果不需要确认,可以将其注释掉

Get-AzureStorageBlob -Context $sourceContext $ sourceContainerName | ForEach-Object { Get-AzureStorageBlobCopyState -Blob $ -Context $destContext $ destContainerName -WaitForComplete }

问题是这样的:Get-AzureStorageKey:没有指定当前的订阅。 使用Select-AzureSubscription -Current来设置当前订阅。

尝试这个:

 Select-AzureSubscription -SubscriptionName "EXISTING SUBSCRIPTION NAME" #Get-AzureVM $vmName = "YOUR_VM_NAME" $serviceName = "CLOUD_SERVICE_NAME" $destServiceName = "NEW_CLOUD_SERVICE_NAME" $workingDir = (Get-Location).Path $sourceVm = Get-AzureVM -ServiceName $serviceName -Name $vmName $vmConfigurationPath = $workingDir + "\exportedVM.xml" $sourceVm | Export-AzureVM -Path $vmConfigurationPath $sourceOSDisk = $sourceVm.VM.OSVirtualHardDisk $sourceDataDisks = $sourceVm.VM.DataVirtualHardDisks $sourceStorageName = $sourceOSDisk.MediaLink.Host -split "\." | select -First 1 $sourceStorageAccount = Get-AzureStorageAccount -StorageAccountName $sourceStorageName $sourceStorageKey = (Get-AzureStorageKey -StorageAccountName $sourceStorageName).Primary Stop-AzureVM -ServiceName $serviceName -Name $vmName -Force Select-AzureSubscription -SubscriptionName "NEW SUBSCRIPTION NAME" $location = $sourceStorageAccount.Location $destStorageAccount = Get-AzureStorageAccount | ? {$_.Location -eq $location} | select -first 1 if ($destStorageAccount -eq $null) { $destStorageName = "NEW_STORAGE_NAME" New-AzureStorageAccount -StorageAccountName $destStorageName -Location $location $ destStorageAccount = Get-AzureStorageAccount -StorageAccountName $destStorageName } $destStorageName = $destStorageAccount.StorageAccountName $destStorageKey = (Get-AzureStorageKey -StorageAccountName $destStorageName).Primary $sourceContext = New-AzureStorageContext -StorageAccountName $sourceStorageName ` -StorageAccountKey $sourceStorageKey $destContext = New-AzureStorageContext -StorageAccountName $destStorageName ` -StorageAccountKey $destStorageKey if ((Get-AzureStorageContainer -Context $destContext -Name vhds -ErrorAction SilentlyContinue) -eq $null) { New-AzureStorageContainer -Context $destContext -Name vhds } $allDisks = @($sourceOSDisk) + $sourceDataDisks $destDataDisks = @() foreach($disk in $allDisks) { $blobName = $disk.MediaLink.Segments[2] $targetBlob = Start-CopyAzureStorageBlob -SrcContainer vhds -SrcBlob $blobName ` -DestContainer vhds -DestBlob $blobName ` -Context $sourceContext -DestContext $destContext -Force Write-Host "Copying blob $blobName" $copyState = $targetBlob | Get-AzureStorageBlobCopyState while ($copyState.Status -ne "Success") { $percent = ($copyState.BytesCopied / $copyState.TotalBytes) * 100 Write-Host "Completed $('{0:N2}' -f $percent)%" sleep -Seconds 5 $copyState = $targetBlob | Get-AzureStorageBlobCopyState } If ($disk -eq $sourceOSDisk) { $destOSDisk = $targetBlob } Else { $destDataDisks += $targetBlob } } Add-AzureDisk -OS $sourceOSDisk.OS -DiskName $sourceOSDisk.DiskName -MediaLocation $destOSDisk.ICloudBlob.Uri foreach($currenDataDisk in $destDataDisks) { $diskName = ($sourceDataDisks | ? {$_.MediaLink.Segments[2] -eq $currenDataDisk.Name}).DiskName Add-AzureDisk -DiskName $diskName -MediaLocation $currenDataDisk.ICloudBlob.Uri } Get-AzureSubscription -Current | Set-AzureSubscription -CurrentStorageAccountName $destStorageName $vmConfig = Import-AzureVM -Path $vmConfigurationPath New-AzureVM -ServiceName $destServiceName -Location $location -VMs $vmConfig -WaitForBoot Get-AzureRemoteDesktopFile -ServiceName $destServiceName -Name $vmConfig.RoleName -LocalPath ($workingDir+"\newVM.rdp")` 

Azure几乎不提供将任何Azure服务从一个Subscription切换到另一个Subscription的支持。

如果您创build了票据,那么顺便说一句,您可以让Azure支持人员将所有服务从一个订阅(源)手动切换到另一个订阅(目标),其中目标订阅在该订阅中没有任何服务。

您不能从源订阅中select单个服务转移到目标订阅(源订阅中全部或全部或全部),并且目标订阅中不能包含任何现有服务。

**服务是任何Azurefunction(虚拟机,网站,存储Blob等)

支持代表可能以前没有做过这个程序,你将不得不让他们知道这是可能的,我的支持代表花了大约一个星期的时间来弄明白这一切。 确保在与Azure支持代表进行的所有对话中,都使用本地源订阅和带有GUID的目标订阅。

现在特别是虚拟机,看起来你可以使用名为AzCopy的工具将虚拟机从一个存储帐户复制到另一个存储帐户,查看本文:

http://thecodejunkie.com/2014/01/20/copying-virtual-machines-between-azure-subscriptions/

您可以使用DC迁移工具(一种开放源代码工具)将数据中心中的一个订阅的Azure资源复制到其他订阅。

Azure数据中心迁移工具博客http://blog.persistentsys.com/index.php/2015/01/06/persistent-systems-releases-azure-data-center-migration-solution/