안녕하세요,
오늘은 Managed VM을 다른 Region이나 구독에 이동하는 방법을 소개해 보겠습니다.
본 페이지에서 이용할 VM은 'Data Science Virtual Machine for Linux (Ubuntu)' 입니다.
이 VM의 SKU는 일반 Linux VM과 다르게 Plan이 부여되어 있어, VM 생성시 Plan을 부여해주는 작업을 필요로 합니다.
- Plan을 부여하지 않을 경우, VM 생성시 다음의 에러 메시지가 발생합니다.
경고: 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 이미지를 찾는 방법
> 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?
PowerShell로 완벽히 구성된 가상 컴퓨터 만들기
'Azure Tech' 카테고리의 다른 글
[Azure] How can we move VMs with managed disks between resource groups / Regions (0) | 2017.11.24 |
---|