Переместить Azure VM в другую подписку в другом регионе
Мы хотим переместить все наши виртуальные машины Linux из подписки в одном регионе в подписку в другом регионе. Я обнаружил несколько тем, что в данный момент это невозможно, но есть обходные пути. К сожалению, я застрял. Поскольку я хочу переместить виртуальные машины такими, какие они есть (подписка, в которой виртуальные машины в настоящее время работают, будет прекращена), я думаю, мне не нужно удалять файлы? Должен ли я обобщать их для передачи?
Какой лучший способ получить их для другой подписки? Я играл с командой AzCopy и фактически смог скопировать файлы из контейнера из первой подписки в контейнер другой в другом регионе. Тогда я подумал, что могу скопировать VHDS виртуальных машин, но не смог найти их в контейнерах BLOB-объектов наших учетных записей хранения. После этого я создал снимок, но не смог найти его и в контейнерах BLOB-объектов. Поэтому я также не смог скопировать их с помощью AzCopy.
Спасибо за каждую помощь, копи
1 ответ
Как и во всем, это зависит от того, как вы настроили диски вашей виртуальной машины. Два варианта - управляемые и неуправляемые диски.
Если ваши диски управляются, они не будут находиться в учетной записи хранения, и, вероятно, поэтому вы не можете их найти, однако вам следует убедиться, что вы используете дисковый блейд виртуальной машины. Неуправляемый диск покажет ссылку на VHD URI, если вы посмотрите ближе внутрь дискового диска виртуальной машины, и включит "неуправляемый" в скобках в соответствии с этим снимком экрана.
Если ваш диск управляется, и вы хотите скопировать его в учетную запись хранения в качестве виртуального жесткого диска, эти несколько строк помогут вам начать работу. Очевидно, что это PowerShell. Вам потребуется запустить последнюю версию (предпочтительно WMF 5.1) PowerShell и установить последние модули AzureRM (Install-Module AzureRm -Scope CurrentUser).
$token = Grant-AzureRmDiskAccess -ResourceGroupName sourceresourcegroupname -DiskName sourcemanageddiskname -DurationInSecond 3600 -Access Read
$destContext = New-AzureStorageContext –StorageAccountName destinationstorageaccount -StorageAccountKey 'destinationstorageaccountkey'
Start-AzureStorageBlobCopy -AbsoluteUri $token.AccessSAS -DestContainer 'vhds' -DestContext $destContext -DestBlob 'destinationblobname.vhd'
Если, с другой стороны, у вас неуправляемые диски, процесс немного сложнее. Опять же, следующее это PowerShell. Вам нужен исходный URI VHD (см. Скриншот выше), а затем предоставить информацию о целевом BLOB-объекте.
Select-AzureRmSubscription 'SourceSubscription'
### Source VHD - authenticated container ###
$srcUri = "https://sourcestorageaccount.blob.core.windows.net/vhds/nameoffile.vhd"
### Source Storage Account ###
$srcStorageAccount = "sourcestorageaccount"
$srcStorageKey = "sourcestorageaccountkey=="
### Create the source storage account context ###
$srcContext = New-AzureStorageContext –StorageAccountName $srcStorageAccount `
-StorageAccountKey $srcStorageKey
# Target Storage Account
Select-AzureRmSubscription 'DestinationSubscription'
### Target Storage Account ###
$destStorageAccount = "destinationstorageaccount"
$destStorageKey = "destinationstorageaccountkey=="
### Create the destination storage account context ###
$destContext = New-AzureStorageContext –StorageAccountName $destStorageAccount `
-StorageAccountKey $destStorageKey
### Destination Container Name ###
$containerName = "copiedvhds"
### Create the container on the destination ###
New-AzureStorageContainer -Name $containerName -Context $destContext
### Start the asynchronous copy - specify the source authentication with -SrcContext ###
$blob1 = Start-AzureStorageBlobCopy -srcUri $srcUri `
-SrcContext $srcContext `
-DestContainer $containerName `
-DestBlob "destinationblob.vhd" `
-DestContext $destContext
### Loop until complete ###
While($status.Status -eq "Pending"){
$status = $blob1 | Get-AzureStorageBlobCopyState
Start-Sleep 300
### Print out status ###
$status
}
Я упомяну одну вещь: если вы используете управляемые диски, на портале есть опции для перемещения диска в другую подписку. Если вы хотите, вернитесь с вашим текущим типом диска (управляемым или неуправляемым) и дайте мне знать, какой тип цели вы ожидаете / хотите, чтобы он был, и мы можем работать с этого.
Предполагая, что вы создали копию большого двоичного объекта VHD в новой учетной записи хранения в целевой подписке (т. Е. Вы не создали снимок управляемого диска), вы можете "обернуть" контейнер виртуальной машины вокруг диска, используя следующий PowerShell. Важной строкой является Set-AzureRmVMOSDisk, где мы используем опцию Attach, чтобы просто создать конфигурацию и подключить диск.
# Name the new server
$ServerName = 'MYSERVER'
# Provide the URI of the disk to be attached as the OS disk.
$LocationOfVHD = "https://destinationstorageaccount.blob.core.windows.net/copiedvhds/destinationblob.vhd"
# Create a NIC and get the target VNET and subnet references.
$nicName = "$ServerName-nic"
# Set the private IP Address of the NIC
$PrivateIPAddress = '10.203.99.4'
# Set the DNS server for the NIC
$DNSServerAddress = '10.203.99.4'
# Destination resource group
$DestinationResourceGroupName = 'RG-DESTINATION'
# Location where the resources are to be built
$LocationOfResources = 'UK West'
# Select the appropriate subscription
Select-AzureRmSubscription 'DestinationSubscription'
# Create a VM machine configuration
$VM = New-AzureRmVMConfig -VMSize 'Standard_DS2_v2' -VMName $ServerName
# Set the VM OS Disk value to the URI where the disk was restored/copied and attach it. Set the OS type and caching as desired
Set-AzureRmVMOSDisk -VM $VM -Name "$ServerName-OS" -VhdUri $LocationOfVHD -CreateOption "Attach" -Windows -Caching ReadWrite
# Get the reference to the VNET in which the NIC will be bound.
$vnet = Get-AzureRmVirtualNetwork -Name "TargetAzureNetwork" -ResourceGroupName 'TARGETVIRTUALNETWORK'
# Get the reference to the Subnet ID in which the NIC will be bound.
$Subnet = $vnet.Subnets | Where-Object {$_.Name -eq 'TARGETSUBNET'} | Select-Object 'Id'
# Get the ID of the NSG which will be bound to the NIC - if you want.
$NSG = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $DestinationResourceGroupName -Name 'NSG-DESTINATIONVM'
# Create the NIC with the VNET/subnet reference
# You could also define here the backend load balanced pool etc that this NIC belongs to.
$NIC = New-AzureRmNetworkInterface `
-Name $nicName `
-ResourceGroupName $DestinationResourceGroupName `
-Location $LocationOfResources `
-SubnetId $Subnet.Id `
-NetworkSecurityGroupId $NSG.Id `
-PrivateIpAddress $PrivateIPAddress `
-DnsServer $DNSServerAddress
# Add the newly created NIC to the VM definition.
$VM = Add-AzureRmVMNetworkInterface -VM $VM -Id $NIC.Id
# Create the VM
New-AzureRmVM -ResourceGroupName $DestinationResourceGroupName -Location $LocationOfResources -VM $VM
Надеюсь, это неплохой стартер для вас, но возвращайтесь, если вам нужно больше. Если вы новичок в PowerShell, я прошу прощения, но для выполнения ваших задач вам потребуется либо PowerShell, либо интерфейс командной строки Azure.
ОБНОВЛЕНИЕ (теперь я знаю, что это управляемые диски):
С немного большей ясностью, вот ваш процесс.
Лично я бы сделал большинство, если не все это в PowerShell (модули Azure), но, почувствовав, что вы новичок в этом, я проведу вас по методу портала. К сожалению, потребуется немного PowerShell, поэтому приготовьтесь.
Создайте целевую учетную запись хранения в целевой подписке - вам необходимо использовать промежуточную учетную запись хранения как часть этого процесса. Вам также нужна виртуальная сеть, конечно.
Завершите работу вашей исходной виртуальной машины.
Перейдите к блейду Диски и выберите один из дисков.
Нажмите Создать снимок. Повторите эти действия для любых других дисков, подключенных к ВМ, а затем, конечно, для всех других ВМ. Получив снимки, вы можете снова включить виртуальные машины.
Кто-то может возразить, что вам не нужно создавать моментальные снимки, если вы хотите, чтобы виртуальные машины оставались отключенными, пока вы копируете исходный виртуальный жесткий диск, используя URL-адрес доступа, который вы получили бы, если бы выбрали Экспорт> Создать URL-адрес вместо создания снимка, Мы создаем моментальный снимок, поскольку вы, возможно, захотите, чтобы ваши виртуальные машины снова работали быстро.
Для каждого созданного снимка вам необходимо скопировать его в виде большого двоичного объекта в новую целевую учетную запись.
Откройте каждый снимок и нажмите "Экспорт". Увеличьте допустимое время до 86400 секунд (один день), затем нажмите "Создать URL".
Убедитесь, что вы скопировали сгенерированный URL и не потеряете его.
Здесь идет PowerShell, который мы используем для загрузки сгенерированного URL-адреса в BLOB-объект нашей целевой подписки и учетной записи хранения. Процесс загрузки занимает некоторое время на диске, так что будьте готовы! Помните, что вы должны делать это для каждого снимка каждого диска, изменяя имена и, возможно, учетные записи хранения для каждой виртуальной машины по мере необходимости. (это причина, по которой я бы выбрал PowerShell).
Source VHD - authenticated container ### $srcUri = "https://md-f0p4tdq5fjpc.blob.core.windows.net/txwptxxxqvct/abcd?sv=2017-04-17&sr=b&si=cce17550-75f7-429c-bf08-31d0ae2da552&sig=oI%2BNOmQ4F75H8AlSwm7rJb%2Frm2Jhl9kfNZ7Jt2cUJpY%3D" # Target Storage Account Select-AzureRmSubscription 'DestinationSubscription' ### Target Storage Account ### $destStorageAccount = "destinationstorageaccount" $destStorageKey = "IkEvDdWTvTxN7v45VgAcvyEpZB9rGyYwyZhxvhG6eQaPIB15MQOa0vkvsHxMDpmUIJqq42UGiU8ji5Lqt39rAg==" ### Create the destination storage account context ### $destContext = New-AzureStorageContext –StorageAccountName $destStorageAccount ` -StorageAccountKey $destStorageKey ### Destination Container Name ### $containerName = "vhds" ### Create the container on the destination ### New-AzureStorageContainer -Name $containerName -Context $destContext ### Start the asynchronous copy $blob1 = Start-AzureStorageBlobCopy -AbsoluteUri $srcUri ` -DestContainer $containerName ` -DestBlob "destinationblob.vhd" ` -DestContext $destContext $status = $blob1 | Get-AzureStorageBlobCopyState ### Loop until complete ### While($status.Status -eq "Pending"){ $status = $blob1 | Get-AzureStorageBlobCopyState Start-Sleep 300 ### Print out status ### $status }
Как только копия BLOB-объекта будет завершена, нам нужно будет обернуть виртуальную машину вокруг нашего диска (или дисков!). Однако в рамках этого процесса мы импортируем виртуальный жесткий диск, который сейчас находится в нашей целевой учетной записи хранения, на управляемый диск и подключаем его к виртуальной машине. Больше PowerShell, к сожалению, но это выглядит очень похоже на PowerShell, которым я поделился ранее. Есть комментарии, чтобы вы знали, что происходит.
# Name the new server $ServerName = 'DESTINATIONSERVERNAME' # Provide the URI of the disk to be attached as the OS disk. $LocationOfOSVHD = "https://destinationstorage.blob.core.windows.net/vhds/destinationblob.vhd" $LocationOfDataDisk1 = "https://lrdestinationstorage.blob.core.windows.net/vhds/destinationblob1.vhd" # Create a NIC and get the target VNET and subnet references. $nicName = "$ServerName-nic" # Set the private IP Address of the NIC $PrivateIPAddress = '10.0.0.4' # Set the DNS server for the NIC $DNSServerAddress = '8.8.8.8' # Destination resource group $DestinationResourceGroupName = 'RG-DESTINATION' # Location where the resources are to be built $LocationOfResources = 'West Europe' # Select the appropriate subscription Select-AzureRmSubscription 'DestinationSubscription' # Create a VM machine configuration $VM = New-AzureRmVMConfig -VMSize 'Standard_DS2_v2' -VMName $ServerName # Create a managed disk configuration and import the source VHD $OSDisk = New-AzureRmDiskConfig -AccountType StandardLRS -Location $LocationOfResources -CreateOption Import -SourceUri $LocationOfOSVHD # Create the managed disk using the configuration defined above. $Disk1 = New-AzureRmDisk -DiskName 'OS-DISK' -Disk $OSDisk -ResourceGroupName $DestinationResourceGroupName # Set the VM’s OS Disk to be the managed disk. Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $Disk1.Id -StorageAccountType StandardLRS -DiskSizeInGB 80 -CreateOption Attach -Windows -Caching ReadWrite # Repeat ourselves for any data disks that must also be attached to the VM in the destination. # Increase LUN numbering and changing names etc as required. $DataDisk = New-AzureRmDiskConfig -AccountType StandardLRS -Location $LocationOfResources -CreateOption Import -SourceUri $LocationOfDataDisk1 $Disk2 = New-AzureRmDisk -DiskName 'DATA-1' -Disk $DataDisk -ResourceGroupName $DestinationResourceGroupName Add-AzureRmVMDataDisk -ManagedDiskId $Disk2.Id -VM $vm -CreateOption Attach -DiskSizeInGB 20 -Caching ReadWrite -StorageAccountType StandardLRS -Name 'DATA-1' -Lun 0 # Get the reference to the VNET in which the NIC will be bound. Might not be in the resource group you’re migrating to so this is left manual. $vnet = Get-AzureRmVirtualNetwork -Name "DestinationAzureNetwork" -ResourceGroupName 'RG-DESTINATION' # Get the reference to the Subnet ID in which the NIC will be bound. Replace 'default' with the name of the target subnet $Subnet = $vnet.Subnets | Where-Object {$_.Name -eq 'default'} | Select-Object 'Id' # Create the NIC with the VNET/subnet reference # You could also define here the backend load balanced pool etc that this NIC belongs to. $NIC = New-AzureRmNetworkInterface ` -Name $nicName ` -ResourceGroupName $DestinationResourceGroupName ` -Location $LocationOfResources ` -SubnetId $Subnet.Id ` -PrivateIpAddress $PrivateIPAddress ` -DnsServer $DNSServerAddress # Add the newly created NIC to the VM definition. $VM = Add-AzureRmVMNetworkInterface -VM $VM -Id $NIC.Id # Create the VM New-AzureRmVM -ResourceGroupName $DestinationResourceGroupName -Location $LocationOfResources -VM $VM
И это должно делать то, что вы после.
Очевидно, есть некоторые соображения, и вам нужно будет редактировать скрипт каждый раз, когда вы делаете копию или воссоздаете виртуальную машину. Это не идеально, но я постарался учесть ваше знакомство с PowerShell. В противном случае все это было бы PowerShell.