본문 바로가기

Azure Tech

[Azure] Plan이 부여된 Managed VM 이동 방법

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안녕하세요,


오늘은 Managed VM을 다른 Region이나 구독에 이동하는 방법을 소개해 보겠습니다.


본 페이지에서 이용할 VM은 'Data Science Virtual Machine for Linux (Ubuntu)' 입니다.



이 VM의 SKU는 일반 Linux VM과 다르게 Plan이 부여되어 있어, VM 생성시 Plan을 부여해주는 작업을 필요로 합니다.


- Plan을 부여하지 않을 경우, VM 생성시 다음의 에러 메시지가 발생합니다.


PS C:\Users\lcsco_o9qpfal> New-AzureRmVM -VM $vm3 -ResourceGroupName $resourcegroup -Location $location

경고: Since the VM is created using premium storage, existing standard storage account, chungsutestub, is used for boot diagnostics.

New-AzureRmVM : Long running operation failed with status 'Failed'. Additional Info:'Creating a virtual machine from Marketplace image requires Plan information in the request. OS disk name is 'moved2'.'

ErrorCode: VMMarketplaceInvalidInput

ErrorMessage: Creating a virtual machine from Marketplace image requires Plan information in the request. OS disk name is 'moved2'.

StartTime: 2018-04-01 오후 10:59:29

EndTime: 2018-04-01 오후 10:59:31

OperationID: #

Status: Failed


위치 줄:1 문자:1

+ New-AzureRmVM -VM $vm3 -ResourceGroupName $resourcegroup -Location $l ...

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : CloseError: (:) [New-AzureRmVM], ComputeCloudException

    + FullyQualifiedErrorId : Microsoft.Azure.Commands.Compute.NewAzureVMCommand
 





일반적인 Managed VM 이동은 다음과 같은 순서로 진행됩니다.

* 본 Lab Testing에 사용된 'Data Science Virtual Machine for Linux (Ubuntu)' SKU의 경우, 초기 VM 생성 시 Data Disk도 함께 생성됩니다. 따라서 OS Disk Snapshot 이동 후, Data Disk 이동 작업도 Step에 따라 다시 한번 진행해 주세요.



[Portal 작업]

1. VM 내에서 Generalized 작업 진행

2. VM의 OS Disk에 대한 Snapshot 진행


[PowerShell 작업]

3. 생성된 Snapshot을 VHD 형태로 Export 후(SAS URL 생성), 다른 지역에 있는 Resource Group 내 Storage Account로 이동


[Portal 작업]

4. 이동된 VHD 파일들을 이용해 Image 생성 


[PowerShell 작업]

5. 생성된 Image를 이용해 새로운 VM 생성



왜 이렇게 복잡한가요?

> 아직 Azure Portal에서 Managed VM Disk에 대한 Region/Subscription간의 이동을 지원하지 않기 때문입니다.





1. VM에 접속 후 아래 명령어를 입력하여 Generalized 작업을 진행합니다.


> waagent -deprovision+user



2. VM의 OS Disk 리소스 내에서 Snapshot을 생성합니다.





3.1 생성된 Snapshot에서 'Export' 버튼을 눌러 SAS URL을 생성합니다.


- 설정된 시간보다 이동에 소요되는 시간이 길어질 경우, 이동 작업이 정상적으로 진행되지 않습니다.

- Region간의 거리에 따라 대략적인 URL 지속 시간을 설정합니다. 

- 1시간 = 3600, 6시간 = 21,600, 24시간 = 86,400




3.2 PowerShell을 이용해, 다른 Region으로 VHD 이동


> Script


# Azure 로그인

Login-AzureRmAccount


(Optional) 계정에 여러 구독이 있을 경우, '리소스가 최종적으로 옮겨질' 구독 지정

Select-AzureRmSubscription -Subscription ‘bbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbb’


# 변수 선언 (옮기고자 하는 대상 리소스 정보)

$ResourceGroupName = "리소스 그룹 이름"

$StorageAccountName = "Storage Account 이름"

$ContainerName = "Container 이름"

$snapSASURL = “SAS URL 주소


$targetStorageContext = (Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName).Context


# 복사 작업 시작

*작업 진행 시 원본 및 대상 Storage Key는 필요하지 않습니다.


Start-AzureStorageBlobCopy -AbsoluteUri $snapSASURL -DestContainer $ContainerName -DestContext $targetStorageContext -DestBlob “생성될 VHD 이름 지정 (ex : moved.vhd)


# 진행 상황 추적

Get-AzureStorageBlobCopyState -Container $ContainerName -Context $targetStorageContext -WaitForComplete

> 명령어 실행 후, 생성될 VHD 이름 입력 (ex : moved.vhd)



> 명령어 입력 결과


> 결과 (다른 Region, Storage Account 내 VHD 파일이 옮겨짐)



4. Image 생성


> Azure Portal - Image 검색 후, 옮겨진 VHD 파일을 이용해 Image를 생성합니다.






> 결과 (Image 리소스 생성)




5. PowerShell을 이용해, 신규 VM을 생성합니다.


> Script


#(Optional) Azure 로그인

Login-AzureRmAccount


# 기본 정보

$resourcegroup = "VM이 생성될 리소스 그룹"

$location = "Region 정보" 

$image = Get-AzureRmImage -ResourceGroupName $resourcegroup -ImageName "생성된 Image 이름"

$cred = Get-Credential


# Network 정보 (기본값)

$subnetconfig = New-AzureRmVirtualNetworkSubnetConfig -Name "mySubnet" -AddressPrefix 10.7.1.0/24

$vnet = New-AzureRmVirtualNetwork -Name "myVnet" -ResourceGroupName $resourcegroup -Location $location -AddressPrefix 10.7.0.0/16 -Subnet $subnetconfig

$pip = New-AzureRmPublicIpAddress -ResourceGroupName $resourcegroup -Name "myPublic" -Location $location -AllocationMethod Dynamic

$nic = New-AzureRmNetworkInterface -Name "myNic" -ResourceGroupName $resourcegroup -Location $location -SubnetId $vnet.Subnets[0].Id-PublicIpAddressId $pip.Id


# VM 정보
$vmname = "생성될 VM 이름" 
$vmsize = "VM Size (Ex : Standard_D1_V2)"

$vm = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize
$vm = Set-AzureRmVMSourceImage -VM $vm -Id $image.Id
$vm = Set-AzureRmVMOSDisk -VM $vm -StorageAccountType StandardLRS -DiskSizeInGB 50 -CreateOption FromImage -Caching ReadWrite

# *VM Plan 부여 ('Data Science Virtual Machine for Linux (Ubuntu)'의 예시입니다)
Set-AzureRmVMPlan -VM $vm -Publisher microsoft-ads -Product linux-data-science-vm-ubuntu -Name linuxdsvmubuntu

$vm = Set-AzureRmVMOperatingSystem -VM $vm -Linux -ComputerName $vmname -Credential $cred
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id

New-AzureRmVM -VM $vm -ResourceGroupName $resourcegroup -Location $location



*Azure VM Plan을 알아보는 방법은 다음 문서에서 상세히 기술되어 있습니다.


Azure CLI를 사용하여 Azure Marketplace에서 Linux VM 이미지를 찾는 방법

https://docs.microsoft.com/ko-kr/azure/virtual-machines/linux/cli-ps-findimage?toc=%2Fazure%2Fvirtual-machines%2Flinux%2Ftoc.json



> Sample Script


#Initial Info

$resourcegroup = "resourcegroup"

$location = "East US" 

$image = Get-AzureRmImage -ResourceGroupName chungsuds -ImageName image

$cred = Get-Credential


#Create a new resource group

New-AzureRmResourceGroup -Name $resourceGroup -Location $location

 

#Network Settings

$subnetconfig = New-AzureRmVirtualNetworkSubnetConfig -Name "mySubnet" -AddressPrefix 10.7.1.0/24

$vnet = New-AzureRmVirtualNetwork -Name "myVnet" -ResourceGroupName $resourcegroup -Location $location -AddressPrefix 10.7.0.0/16 -Subnet $subnetconfig

$pip = New-AzureRmPublicIpAddress -ResourceGroupName $resourcegroup -Name "myPublic" -Location $location -AllocationMethod Dynamic

$nic = New-AzureRmNetworkInterface -Name "myNic" -ResourceGroupName $resourcegroup -Location $location -SubnetId $vnet.Subnets[0].Id-PublicIpAddressId $pip.Id


$vmname = "testvm" 

$vmsize = "Standard_D1_V2"


$vm = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize

$vm = Set-AzureRmVMSourceImage -VM $vm -Id $image.Id

$vm = Set-AzureRmVMOSDisk -VM $vm -StorageAccountType StandardLRS -DiskSizeInGB 50 -CreateOption FromImage -Caching ReadWrite


Set-AzureRmVMPlan -VM $vm -Publisher microsoft-ads -Product linux-data-science-vm-ubuntu -Name linuxdsvmubuntu


$vm = Set-AzureRmVMOperatingSystem -VM $vm -Linux -ComputerName $vmname -Credential $cred

$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id


New-AzureRmVM -VM $vm -ResourceGroupName $resourcegroup -Location $location




> 결과



> 정상 생성됨을 확인 했습니다.





Q. PowerShell Cmdlet 오류가 발생합니다.

> Azure PowerShell Module 설치가 필요합니다. 'Install-Module -Name AzureRM -AllowClobber' 명령어를 이용해 모듈 설치를 할 수 있습니다.

Azure PowerShell 설치 및 구성

https://docs.microsoft.com/ko-kr/powershell/azure/install-azurerm-ps?view=azurermps-5.6.0



Q. Image에도 VM 생성 버튼이 있던데, Azure Portal에서는 안되나요?

> 특별한 Plan이 적용되지 않았을 경우, Image 리소스 내 'VM 생성' 버튼을 이용해 간편히 VM생성이 가능합니다.

> 다만, Plan 부여가 필요한 경우 기본 Built-In 되어있는 VM 생성 Template(JSON)의 수정 후에 Deploy를 진행해야 합니다. 






> 관련 자료

How to include “Plan information” when creating ARM VM from a captured image using Powershell?

https://stackoverflow.com/questions/35871496/how-to-include-plan-information-when-creating-arm-vm-from-a-captured-image-usi


PowerShell로 완벽히 구성된 가상 컴퓨터 만들기

https://docs.microsoft.com/ko-kr/azure/virtual-machines/scripts/virtual-machines-windows-powershell-sample-create-vm