Azure 가상머신 v1에서 v2로 이전하기

Microsoft Azure를 오래동안 사용해오고 있는 서비스들이 많이 있습니다. 그 서비스들 중에서는 Azure의 신포털이 나오기 전에 구포털에서 생성된 가상머신을 사용하고 있는 경우도 있습니다. IaaS v1과 Iaas v2라고 표현하기도 하고 리소스 관리 측면에서 ASM과 ARM으로 구분하기도 합니다. v1 가상머신이 문제가 있는 건 아닙니다. 서비스가 문제없이 잘 돌아가지만 v2로 이전을 해야하는 순간이 오는 경우가 있습니다. 예를들어 Azure에 새로 나온 서비스들과 연결해서 쓰려면 이전이 불가피 경우가 있습니다. ASM과 ARM이 서로 호환되지 않기 때문입니다.

v1에서 v2로 이전을 할 때 있는 그대로 통째로 옮기는 방법이 있고 관련 스크립트들이 검색되기는 합니다. 하지만 이전을 하는 김에 서비스의 인프라 구성을 다시 하거나 정리할 수 있는 좋은 기회로 활용할 수 있습니다. 쓰지는 않는데 비용을 발생하고 있는 Azure 리소스들이 있다면 제거를 하거나 데이터 분석을 통해서 VM 개수를 조절하거나 가상 네트워크를 다시 구성하는 등 여러가지를 생각해볼 수 있습니다.

여기에서는 구포털의 v1 윈도우 서버 가상머신을 SysPrep하여 이미지로 만들고 신포털 v2 가상머신으로 새로 만들어서 이전하는 방법을 알아보겠습니다. 기존 가상머신의 설정 그대로 이동이 됩니다. 이전을 하면서 가상네트워크 등을 다시 설정해보겠습니다.

그리고 Azure 포털에서 UI를 이용하는 방법과 PowerShell을 사용하는 방법을 모두 사용하겠습니다. 이건 개인의 취향일 수 있지만 아무래도 Azure Portal에서 눈으로 보면서 작업하는 것이 편하지만 여러개의 VM을 생성하는 반복작업은 PowerShell을 사용하는 것이 유리하기 때문입니다. 특이 OS이미지를 사용해서 VM을 생성하는 작업은 현재 이글을 쓰는 시점에는 Azure 포털에 구현이 되어 있지 않습니다. 이런 작업은 또 어쩔 수 없이 PowerShell을 사용해야 하기도 하죠.

Step 1. 리소스 그룹(Resource Group) / 저장소 계정(Storage Account) / 가상 네트워크(Virtaul Network) / 가용성 집합(Availability Set) 만들기

먼저 새로만들 가상머신이 들어갈 인프라를 만듭니다.  Azure 포털에 접속해서 Resource Group을 만들고 그 안에 Storage Account와 Virtual Network를 만듭니다. 아래 링크를 참고하면 개념과 만드는 방법을 알 수 있습니다. 저장소 계정은 가상머신의 디스크가 저장될 공간이고 가상 네트워크는 가상머신이 위치할 네트워크 공간입니다.

리소스 관리자 개요 저장소 계정 만들기 Azure 포털을 이용하여 가상 네트워크 만들기 신규 Azure Portal에서 가용성 집합(A/V Set) 만들기

저장소 계정 만들기

저장소 계정 만들기

저장소 계정에 Blob에 컨테이너(Container)를 vhds라는 이름으로 만듭니다.

Blob 컨테이너 만들기

가상네트워크 설정

가상네트워크 설정

가용성 집합 설정

가용성 집합 설정

Step 2. 가상머신 생성용 이미지 만들기

기존에 사용하던 VM에는 서비스에 필요한 모든 애플리케이션이 설치되어 있을 것이고 관련 설정과 함께 우리 서비스가 배포가 되어 있을 것입니다. 이 VM을 이용하여 이미지를 만듭니다. 여기서는 윈도우 서버가 설치된 가상머신을 SysPrep해서 이미지로 생성합니다. 이 이미지를 이용하여 새로운 VM을 여러개 생성할 것입니다.

Azure에서 사용되는 용어 중에 이미지(image), 디스크(disk), 드라이브(drive)에 대한 개념이 확실히 잡혀 있으면 헷갈리지 않을 것 같습니다. Exploring Windows Azure Drives, Disks, and Images 에 자세한 내용이 있습니다. 간단히 가상머신에 Attach 되어 사용되는 VHD 파일을 Disk, 여러 가상머신을 생성하는데 사용하는 템플릿 VHD를 이미지라고 이해하고 진행하겠습니다.

Azure에서 재사용 가능한 윈도우용 VM 이미지 만들기(Windows Sysprep)

위 블로그 포스트에서 Step2를 수행하면 이미지를 만들 수 있습니다.
이렇게 만든 이미지는 기존 저장소 계정에 들어 있겠죠. 이 이미지(vhd 파일)를 새로만든 저장소 계정으로 복사를 하겠습니다. Azure 저장소를 관리하는 Microsoft Azure Storage Explorer를 사용해도 되고 커멘드 라인 툴인 AzCopy를 이용해도 됩니다. 저는 AzCopy를 이용해서 저장소에서 새로운 저장소로 바로 복사를 하겠습니다. 127GB VHD 파일이 약 10분 정도 걸려서 복사가 되었습니다. (Output 트래픽 비용이 발생하겠죠^^)

AzCopy 명령줄 유틸리티로 데이터 전송

 'C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy\AzCopy.exe' 
/Source:https://f2portalvhds85s3b7t2plyk.blob.core.windows.net/vhds 
/Dest:https://movedservice.blob.core.windows.net/vhds 
/SourceKey:{소스 저장소 계정 키} 
/DestKey:{새로 만든 저장소 계정 키} 
/S 
/Pattern:"iloh-windows-vm-image-os-2016-07-14-46972A16.vhd"

Step 3. PowerShell로 VM 생성하기

아래 PowerShell 스크립트로 VM을 생성하겠습니다. Azure PowerShell을 설치 및 구성하는 방법을 참조하여 준비를 합니다. 스크립트로 하는일을 글로 표현하며 총 5단계입니다.

  1. 기존에 만들어 놓은 리소스를 미리 가져옵니다. (저장소 계정/가상네트워크/가상네트워크 서브넷 설정/가용성 집합)
  2. 가상머신에 붙일 네트워크 인터페이스 카드(NIC)를 생성합니다.
  3. 가상머신에 로그인 할 계정을 생성 합니다.
  4. 가상머신을 생성합니다.

Azure 신규 포탈에서 재사용 가능한 윈도우 이미지 만들기(Windows Sysprep) – (2)

가상머신의 이름을 변경해서 2개를 생성합니다. 저는 VM2로 생성했습니다.

 #-----------------------------------------------------------------------------------------
# 먼저 기존에 만들어놓은 리소스들을 미리 가져온다. 

# Resource Group
$rgName = "MovedServiceV2"
# 지역 (Japan West)
$location = "japanwest"

# 저장소 계정
$storageAccName = "movedservice"
$storageAcc = Get-AzureRmStorageAccount -ResourceGroupName $rgName -AccountName $storageAccName

# 가상네트워크
$vnetName = "MovedServiceVNet"
$vnet = Get-AzureRmVirtualNetwork -ResourceGroupName $rgName -Name $vnetName
# 가상네트워크 서브넷 설정 
$frontendSubnetName = "FrontEnd"
$frontendSubnetConfig = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name $frontendSubnetName

# 가용성 집합
$avsetName = "MovedServiceAVSet "
$avset = Get-AzureRmAvailabilitySet -ResourceGroupName $rgName -Name $avsetName

#-----------------------------------------------------------------------------------------
# VM 생성 

# NIC를 생성 
$nicName = "VM1Nic"
$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rgName -Location $location -SubnetId $frontendSubnetConfig.Id

# 계정정보 생성 (아이디 패스워드 생성창)
$cred = Get-Credential

# VM 설정(이름 / 크기 / 컴퓨터이름 / OS Disk이름 
$vmName = "VM1"
$vmSize = "Standard_A1"
$computerName = "WebServer1"
$osDiskName = "vm1-osdisk"
$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $avset.Id
$vm = Set-AzureRmVMOperatingSystem -VM $vmConfig -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
$osDiskUri = '{0}vhds/{1}{2}.vhd' -f $storageAcc.PrimaryEndpoints.Blob.ToString(), $vmName.ToLower(), $osDiskName
$urlOfCapturedImageUri = "{0}vhds/iloh-windows-vm-image-os-2016-07-14-46972A16.vhd" -f $storageAcc.PrimaryEndpoints.Blob.ToString()
$vm = Set-AzureRmVMOSDisk -VM $vm -Name $osDiskName -VHdUri $osDiskUri -CreateOption FromImage -SourceImageUri $urlOfCapturedImageUri -Windows

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

Step 4. 부하분산 장치(Load Balancer) 만들기

이번에는 Azure 포털에서 부하분산 장치를 만듭니다.

Azure Portal에서 부하분산 장치(Load Balancer) 만들기

부하분산 장치는 외부의 80포트를 부하분산 하기위해서 Exteranl 로 설정하고 Public IP를 Dynamic으로 하나 만듭니다. 그리고 3가지 설정을 더 해야합니다.

Public IP

  1. Backend Pool : 가용성 집합과 두개의 가상머신을 설정
    Backend Pool
  2. Inbound NAT Rules 설정 : 원격데스트톱 접속을 위한 설정
    Inbound NAT Rules
  3. Probes 설정
    Probes
  4. Load Balancing Rule 설정 : Http 포트에 대한 부하분산 설정
    Load Balancing Rule

설정은 다 끝났습니다.
먼저 원격데스크톱 접속이 잘 되는지 확인해보겠습니다. 부하분산 장치의 Public IP와 NAT에서 설정한 Port를 이용해서 접속해봅니다.

Remote Desktop

부하분산 장치에서 설정한 HTTP 80 포트도 확인해 봅니다.

Http 부하 분산

리소스그룹에 들어있는 최종 Azure 리소스들 입니다.

최종 리소스 최종 리소스