Visual Studio 2017과 ARM Template 개발

Visual Studio 2017이 지난 Connect(); 2016 행사 때 Release Candidate 버전으로 처음 공개되면서 많은 사항들이 개선되었습니다. 정말 많은 변경 사항들이 있었지만 이번 아티클에서는 Azure Platform 개발과 활용에 깊게 관련되어있는 ARM 템플릿과 이를 통한 배포 자동화에 대해 살펴볼까 합니다.

Resource Group의 변천사, 그리고 존재 이유

Azure Platform의 네 번째 포털이 도입되기 전까지, Azure하면 단연 떠오르는 것은 Cloud Service를 기반으로 하는 모델이었습니다. Cloud Service 안에는 처음에 IIS를 기반으로 하는 Web Role, NT 서비스는 아니지만 간단한 백그라운드 작업을 실행할 수 있는 Worker Role, 그리고 더 이상 사용되지는 않지만 VM Role이라는 컨셉도 있었습니다.

이 중 VM Role은 VHD 이미지를 업로드하여 해당 VHD 이미지를 이용해서 Cloud Service 내에 필요한 만큼 미리 정의된 인스턴스를 생성할 수 있는 컨셉이고, 이것이 다듬어져서 VM Role 자체는 빠지고 Cloud Service가 Visual Studio에서 만든 CSPKG를 통해 만들어지는 경우와 Azure Portal에서 수동으로 가상 컴퓨터를 주문하여 만들어지는 경우로 나뉘게 되었습니다. 그러다보니 다소 모호한 점이 있었습니다.

그리고 Azure Portal의 네 번째 버전이 공개되면서 Cloud Service는 역할이 축소되고 Resource Group이라는 새로운 컨셉의 관리 단위가 등장합니다. Resource Group은 Azure Platform 내의 여러 자원을 묶어서 관리하는 용도로 잘 알려져있지만, 여기서 그치는 것이 아니라, 배포 및 제어의 단위도 됩니다.

Azure Platform을 사용하여 클라우드 서비스를 구축할 때에는 필연적으로 여러 서비스들, 여러 리소스들을 사용하게 됩니다. 이럴 때 한 땀 한 땀 리소스들을 프로비져닝하고 관리하기에는 번거롭고 시간이 많이 걸립니다. 이럴 때 Resource Group 단위로 프로비져닝하는 방법을 검토하는 것이 유용합니다.

왜 Resource Group을 자동화하는가?

여러 가지 이유가 있겠습니다만, Resource Group을 자동화하는 것이 반드시 대규모 솔루션만을 위한 것은 아닙니다. 꼭 대규모 솔루션이 아니어도 VM은 평소에 한 대 이상 사용할 수도 있고, VM을 만들기 위해서는 IP 주소 지정, 저장소 계정 설정 등 여러 리소스들에 필연적으로 연관될 수 밖에 없습니다. 이럴 때 여러 리소스를 한 땀 한 땀 프로비져닝하는 것은 세밀한 제어가 가능하지만 노력이 많이 필요합니다.

뿐만 아니라, Resource Group 프로비져닝 자동화 기능으로 여러 예약 명령을 주문하면 병렬적으로 각 리소스를 프로비져닝할 수 있는데 반해, 수동으로 진행할 경우 노력과 시간을 많이 쓰게 됩니다. 주된 관심사가 Azure 포털 내 혹은 각 리소스의 세부적인 기능 탐색이 아니라면 이런 부분은 과감하게 단축하는 것을 권할 수 있습니다.

ARM 템플릿 개발하기

서두에 말씀드린 것과 같이, Visual Studio 2017에 포함된 Azure 개발 툴 체인을 설치하는 것으로부터 시작합니다. http://www.visualstudio.com/ 에 방문하셔서 Visual Studio 2017 Community Edition 혹은 적절한 MSDN Subscription을 보유하고 계신 경우 Professional 혹은 Enterprise Edition을 받아서 Azure 개발 툴 체인을 선택하고 설치하시면 됩니다.

개발 도구를 설치한 다음, 아래 그림처럼 새 프로젝트에서 Azure Resource Group 프로젝트 템플릿을 찾아 새 프로젝트를 생성합니다.

이어서 프로젝트 템플릿의 종류를 선택하는 대화 상자가 나타나는데, 학습을 위하여 Blank Template을 한 번 선택해보겠습니다. 다른 템플릿에 대한 설명은 이번 아티클에서는 자세히 하지 않겠습니다만 필요하시다면 둘러보시는 것도 추천합니다.

비어있는 템플릿을 선택하였으므로 프로젝트 구성은 매우 단촐합니다.

  • azuredeploy.json 파일이 실제 ARM 템플릿의 내용에 해당하며, 이 파일을 편집하여 Resource Group 내에 배포될 자원들의 설정을 세부적으로 지정할 수 있습니다.
  • azuredeploy.parameters.json 파일은 azuredeploy.json 파일에서 parameters 섹션에 정의한 매개 변수들의 실제 값을 저장하는 파일입니다. 나중에 배포 단계에서 이 파일을 프로퍼티 그리드 상에서 편집할 수 있는 인터페이스를 제공하므로 처음부터 완성하려고 할 필요는 없습니다.
  • Deploy-AzureResourceGroup.ps1 파일은 실제 배포와 배포 상태 점검을 담당하는 PowerShell 스크립트로 Visual Studio 프로젝트 템플릿에 의하여 자동 생성되는 스크립트입니다. 아티클에서 설명하는 기본 사항을 다루기 위해서 별도로 커스터마이징해야 할 부분은 없습니다.

이 중에서 집중해서 봐야 할 부분은 azuredeploy.json 파일입니다. 이 파일을 더블 클릭하여 열면 아래 화면과 같이 화면 우측에 구성 목록이 나타나게 됩니다.

JSON 개요 창의 도구 모음에 있는 + 아이콘이 있는 리소스 추가 버튼을 클릭하면, 추가할 수 있는 리소스들의 목록이 표시됩니다.

다음의 순서대로 리소스를 추가합니다.

  • 저장소 계정 – webserverStorage 이름 입력
  • 저장소 계정 – sqlserverStorage 이름 입력
  • 가상 네트워크 – backendVnet 이름 입력
  • Windows 가상 컴퓨터 – webserver 이름 입력, webserverStorage 선택, backendVnet의 가상 네트워크 1 항목 선택
  • Windows 가상 컴퓨터 – sqlserver 이름 입력, sqlserverStorage 선택, backendVnet의 가상 네트워크 1 항목 선택
  • 공용 IP 주소 – webserverAddress 이름 입력, webserverNic 선택 (webserver 가상 컴퓨터 생성 시 자동으로 추가됨)

JSON 개요 패널의 추가 버튼을 이용하여 리소스들을 추가할 수 있으므로 ARM 템플릿의 JSON 문법을 잘 몰라도 어렵지 않게 리소스 정의를 추가할 수 있습니다. 이렇게 하면 parameter로 받아야 할 항목, variable로 정의하여 관리해야 할 항목, 실제 resource들에 대한 정의가 자동으로 추가됩니다.

RC 버전에서 다듬어지지 않은 사항 한 가지를 점검하면, webserverStorageName과 sqlserverStorageName의 표현식에 관한 부분입니다. 기본 이름을 사용하면 이름이 너무 길어서 배포에 실패하게 되므로, 다음과 같이 수정하도록 합니다.

“variables”: {
“webserverStorageName”: “[concat(‘web‘, uniqueString(resourceGroup().id))]”,
“sqlserverStorageName”: “[concat(‘sql‘, uniqueString(resourceGroup().id))]”,

}

이렇게 스크립트를 완성하면, 솔루션 탐색기에서 마우스 오른쪽 버튼을 클릭하여 배포 – 새로 만들기 메뉴를 클릭합니다.

그러면 대화 상자가 나타납니다.

매개 변수 편집 버튼을 눌러 azuredeploy.parameters.json 파일을 편집합니다.

Password 부분을 제외한 나머지 매개 변수들을 적절하게 설정하고 저장 버튼을 클릭합니다. 암호는 매개 변수에 포함하지 않는 것이 안전합니다.

유효성 검사만 체크박스를 클릭하면 실제로 프로비져닝을 하지 않고 스크립트에서 틀리거나 부족한 부분만 검사할 수 있으니 적절하게 활용하실 수 있습니다. 단, 이것은 스크립트 파일 자체에 대한 검사일 뿐 내용 상 잘못되거나 실패할 수 있는 부분을 미리 검사해주지는 않습니다.

이렇게 배포를 시작하면 비워두었던 암호 매개 변수를 만날 때 암호를 넣어줄 것을 요청하는 대화 상자가 나타납니다. 여기에 대해 답을 해주면 배포 과정이 하단의 출력 패널 창에 계속 나타나는 것을 볼 수 있습니다. 다른 오류가 없으면 Azure Portal로 이동합니다.

ARM 템플릿 결과 보기

출력 창에 다음과 같이 [ERROR] 라는 문구 없이 결과가 나타나면 성공한 것입니다.

01:20:22 –
01:20:22 – DeploymentName : azuredeploy-1125-1615
01:20:22 – CorrelationId : 824a867a-21d6-48e9-9fef-b9c62fc9c78b
01:20:22 – ResourceGroupName : WebServerDeploy
01:20:22 – ProvisioningState : Succeeded
01:20:22 – Timestamp : 2016-11-25 오후 4:19:51
01:20:22 – Mode : Incremental
01:20:22 – TemplateLink :
01:20:22 – TemplateLinkString :
01:20:22 – DeploymentDebugLogLevel :
01:20:22 – Parameters : {[webserverStorageType, Microsoft.Azure.Commands.Reso
01:20:22 – urceManager.Cmdlets.SdkModels.DeploymentVariable], [s
01:20:22 – qlserverStorageType, Microsoft.Azure.Commands.Resourc
01:20:22 – eManager.Cmdlets.SdkModels.DeploymentVariable], [webs
01:20:22 – erverName, Microsoft.Azure.Commands.ResourceManager.C
01:20:22 – mdlets.SdkModels.DeploymentVariable], [webserverAdmin
01:20:22 – UserName, Microsoft.Azure.Commands.ResourceManager.Cm
01:20:22 – dlets.SdkModels.DeploymentVariable]…}
01:20:22 – ParametersString :
01:20:22 – Name Type Value
01:20:22 –
01:20:22 – =============== ========================= =========
01:20:22 – =
01:20:22 – webserverStorageType String Stan
01:20:22 – dard_LRS
01:20:22 – sqlserverStorageType String Stan
01:20:22 – dard_LRS
01:20:22 – webserverName String rkttuweb
01:20:22 –
01:20:22 – webserverAdminUserName String rk
01:20:22 – ttu
01:20:22 – webserverAdminPassword SecureString
01:20:22 –
01:20:22 – webserverWindowsOSVersion String
01:20:22 – 2012-R2-Datacenter
01:20:22 – sqlserverName String rkttusql
01:20:22 –
01:20:22 – sqlserverAdminUserName String rk
01:20:22 – ttu
01:20:22 – sqlserverAdminPassword SecureString
01:20:22 –
01:20:22 – sqlserverWindowsOSVersion String
01:20:22 – 2012-R2-Datacenter
01:20:22 – webserverAddressDnsName String r
01:20:22 – kttu
01:20:22 –
01:20:22 – Outputs : {}
01:20:22 – OutputsString :
01:20:22 –
01:20:22 –
01:20:22 –
01:20:22 –
01:20:22 – ‘azuredeploy.json’ 템플릿을 ‘WebServerDeploy’ 리소스 그룹에 배포했습니다.

Azure Portal로 이동하여 결과를 살펴보겠습니다.

보시는 것과 같이 주문한 모든 리소스들이 생성된 것을 확인할 수 있습니다. 이 리소스들을 Portal에 와서 혹은 명령줄 도구로 하나씩 번거롭게 생성하지 않고 효율적으로 주문하여 정상적으로 프로비져닝하였습니다.

Resource Group 삭제하기

이렇게 리소스 그룹을 만들고 난후, 결과가 혹시 마음에 들지 않거나 빠뜨린 부분이 있다면 리소스 그룹 자체를 삭제할 수 있습니다. 리소스 그룹 단위로 삭제 주문을 하는 것은 포털에서도 가능한 작업인데 이렇게 하면 리소스를 일일이 다니면서 정리하지 않아도 됩니다. 아래 그림과 같이 처리할 수 있습니다.

리소스 그룹 삭제 시 확인 차 리소스 그룹의 이름을 다시 입력받는 부분이 있습니다. 신중을 기하여 작업하시기 바랍니다.

결론

타 클라우드 서비스와 다르게 Azure에서는 모든 리소스를 지금 보신것과 같이 자동화하여 효율적으로 관리할 수 있습니다. VM 이외에도 Web App, Logic App 등을 같은 방법으로 프로비져닝할 수 있습니다. 그리고 이번 아티클에서는 다루지 않았지만, 기존에 만들어진 Azure 리소스를 역으로 ARM 스크립트로 추출하는 기능이나, ARM 템플릿을 연결하여 프로비져닝 하는 방법도 제공합니다. 향후 아티클에서 좀 더 자세한 내용을 준비하여 공유할 수 있도록 하겠습니다.

댓글 남기기