Azure Resource Manager 템플릿을 사용하여 Azure Logic Apps 워크플로를 배포합니다.

완료됨

Azure를 한동안 사용했다면 Azure Resource Manager에 관해 들어봤을 수 있습니다. Resource Manager의 역할을 검토하고 Resource Manager 템플릿을 구성하는 요소를 정의하겠습니다.

Azure Resource Manager란?

Azure Resource Manager는 클라우드 리소스를 관리하고 구성하는 인터페이스입니다. Resource Manager는 클라우드 리소스를 배포하는 수단으로 생각할 수 있습니다.

Azure 리소스 그룹에 익숙한 경우 관련 리소스 집합을 단일 단위로 처리할 수 있습니다. Resource Manager에서는 단일 작업으로 모든 리소스를 함께 배포, 관리 및 삭제할 수 있는 리소스 그룹을 구성할 수 있습니다.

분석가를 위해 금융 모델을 실행한다고 가정해 보겠습니다. 모델을 실행하려면 하나 이상의 VM, 데이터를 저장할 데이터베이스, 모든 요소 간의 연결을 가능하게 하는 가상 네트워크가 필요할 수 있습니다. Resource Manager를 사용하면 이러한 자산을 동일한 리소스 그룹에 배포하고 함께 관리하고 모니터링할 수 있습니다. 작업이 완료되면 한 번의 작업으로 리소스 그룹의 모든 리소스를 삭제할 수 있습니다.

Resource Manager 템플릿이란?

Resource Manager 템플릿은 배포의 모든 Resource Manager 자원을 정확하게 정의합니다. Resource Manager 템플릿을 단일 작업으로 리소스 그룹에 배포할 수 있습니다.

Resource Manager 템플릿은 JSON 파일이며, 이 템플릿을 선언적 자동화의 한 형태로 만듭니다. 선언적 자동화에서는 어떤(what) 리소스가 필요한지 정의하지만 이것을 생성하는 방법(how)은 정의하지 않습니다. 다르게 표현하자면, 필요한 것은 사용자가 정의하지만, 해당 리소스가 제대로 배포되도록 하는 것은 리소스 관리자의 책임입니다.

선언적 자동화는 웹 브라우저에 HTML 파일이 표시되는 방법과 비슷하게 생각할 수 있습니다. HTML 파일에는 페이지에 어떤(what) 요소가 표시되는지 설명되어 있지만 어떻게(how) 표시할지는 설명되어 있지 않습니다. “어떻게”라는 부분은 웹 브라우저의 책임입니다.

참고 항목

ARM 템플릿이라고 하는 Resource Manager 템플릿이 들릴 수 있습니다. Azure Resource Manager 템플릿 또는 Resource Manager 템플릿의 전체 이름을 사용하는 것이 좋습니다.

Resource Manager 템플릿을 사용하는 이유

Resource Manager 템플릿을 사용하면 배포를 더 빠르고 반복할 수 있습니다. 예를 들어, 포털에서 VM을 생성하고, 완료될 때까지 기다렸다가 다음 VM을 생성하는 등의 작업이 더 이상 필요하지 않습니다. Resource Manager에서 전체 배포가 처리됩니다.

그 외에도 다음과 같은 이점이 있습니다.

  • 템플릿을 통한 일관성 향상.

    Resource Manager 템플릿은 사용자와 다른 사람에게 배포를 설명하는 공통 언어를 제공합니다. 템플릿 배포에 사용되는 도구나 SDK가 무엇이든 템플릿에 포함된 구조, 형식 및 식은 동일하게 유지됩니다.

  • 템플릿으로 복잡한 배포 표현.

    템플릿을 사용하면 여러 리소스를 올바른 순서로 배포할 수 있습니다. 예를 들어 OS 디스크나 네트워크 인터페이스를 만들기 전에 가상 머신을 배포하는 것은 좋지 않습니다. Resource Manager는 각 리소스와 그에 해당하는 종속 리소스를 매핑하고 종속 리소스를 먼저 생성합니다. 종속성 매핑은 배포를 올바른 순서로 수행하는 데 도움이 됩니다.

  • 템플릿으로 오류가 발생하기 쉬운 수동 작업 줄이기.

    리소스를 수동으로 만들고 연결하면 시간이 많이 들고 실수를 저지르기도 쉽습니다. Resource Manager는 배포가 매번 동일한 방식으로 수행되도록 합니다.

  • 템플릿은 코드이다.

    템플릿은 코드를 통해 요구 사항을 표현합니다. 템플릿은 다른 소프트웨어 부분처럼 공유하고 테스트하고 버전을 지정할 수 있는 코드 형식의 인프라라고 생각할 수 있습니다. 또한 템플릿은 코드이기 때문에 "증거를 추적할 수 있는 일련의 문서(paper trail)"를 만들 수 있습니다. 템플릿 코드는 배포를 문서화합니다. 대부분의 사용자는 일종의 수정 버전 제어(예: Git) 하에 템플릿을 유지 관리합니다. 템플릿을 변경하면 수정 기록에 템플릿(및 배포)이 시간이 지나면서 어떻게 발전했는지도 기록됩니다.

  • 템플릿을 통한 재사용.

    템플릿에는 템플릿이 실행되면 채워지는 매개 변수가 포함될 수 있습니다. 매개 변수는 사용자 이름 또는 암호, 도메인 이름 등을 정의할 수 있습니다. 템플릿 매개 변수를 사용하면 스테이징 및 프로덕션과 같은 여러 버전의 인프라를 만들 수 있지만 동일한 템플릿을 계속 활용할 수 있습니다.

  • 템플릿 연결 가능.

    Resource Manager 템플릿을 함께 연결하여 템플릿 자체를 모듈화할 수 있습니다. 솔루션의 일부를 정의하는 작은 템플릿을 작성하고 결합하여 완전한 시스템을 만들 수 있습니다.

금융 분석가가 실행하는 모델은 독특하지만 기반 인프라에서 패턴을 볼 수 있습니다. 예를 들어, 대부분의 모델에는 데이터를 저장할 데이터베이스가 필요합니다. 많은 모델이 동일한 프로그래밍 언어, 프레임워크 및 운영 체제를 사용하여 세부 사항을 수행합니다. 컴퓨팅, 스토리지, 네트워킹과 같은 각 개별 구성 요소를 설명하는 템플릿을 정의할 수 있습니다. 그런 다음 구성 요소를 결합하여 각 분석가의 특정 요구 사항을 충족할 수 있습니다.

Resource Manager 템플릿에 무엇이 포함되나요?

참고

다음은 각 섹션의 구조에 대한 이해를 돕는 몇 가지 코드 예제입니다. 해당 사항이 익숙하지 않다 해도 걱정하지 마세요. 더 많은 실습 경험을 얻을 때 다른 사람의 템플릿을 검토하고 직접 작성할 수 있습니다.

서버와 웹 애플리케이션 간에 데이터를 보내기 전에 JSON(JavaScript Object Notation)을 사용한 적이 있을 것입니다. JSON 역시 애플리케이션과 인프라 구성 방법을 설명하는 데 많이 사용되는 방법입니다.

JSON을 사용하면 개체(예: 가상 머신)로 저장된 데이터를 텍스트로 표현할 수 있습니다. JSON 문서는 본질적으로 키-값 쌍의 컬렉션입니다. 각 키는 문자열입니다. 키의 값은 문자열, 숫자, 부울 식, 값 목록 또는 개체(다른 키-값 쌍의 컬렉션)입니다.

Resource Manager 템플릿에는 다음 섹션이 포함될 수 있습니다.

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "",
    "parameters": {  },
    "variables": {  },
    "functions": [  ],
    "resources": [  ],
    "outputs": {  }
}

이러한 섹션은 JSON을 사용하여 표현되지만 실제 JSON 언어와는 관련이 없습니다. 각 섹션을 자세히 살펴보겠습니다.

매개 변수

이 섹션은 템플릿을 실행할 때 구성 가능한 값을 지정하는 곳입니다. 예를 들어 템플릿 사용자가 사용자 이름, 암호 또는 할기본 이름을 지정하도록 허용할 수 있습니다.

다음은 VM의 사용자 이름과 해당 암호에 대한 매개 변수의 두 매개 변수를 보여 주는 예제입니다.

"parameters": {
  "adminUsername": {
    "type": "string",
    "metadata": {
      "description": "Username for the Virtual Machine."
    }
  },
  "adminPassword": {
    "type": "securestring",
    "metadata": {
      "description": "Password for the Virtual Machine."
    }
  }
}

variables

이 섹션에서는 템플릿 전체에서 사용되는 값을 정의합니다. 변수를 사용하면 템플릿을 쉽게 유지할 수 있습니다. 예를 들어 스토리지 계정 이름을 변수로 한 번 정의하고 이것을 템플릿 전체에서 사용할 수 있습니다. 스토리지 계정 이름이 변경되면 변수만 업데이트하면 됩니다.

다음은 VM의 네트워킹 기능을 설명하는 몇 가지 변수를 보여주는 예입니다.

"variables": {
  "nicName": "myVMNic",
  "addressPrefix": "10.0.0.0/16",
  "subnetName": "Subnet",
  "subnetPrefix": "10.0.0.0/24",
  "publicIPAddressName": "myPublicIP",
  "virtualNetworkName": "MyVNET"
}

Functions

이 섹션에서는 템플릿 전체에서 반복을 원하지 않는 프로시저를 정의합니다. 변수와 마찬가지로, 함수를 사용하면 템플릿을 쉽게 유지할 수 있습니다. 다음은 전역적으로 고유한 이름 지정 요구 사항이 있는 리소스를 만들 때 사용할 수 있는 고유한 이름을 생성하는 함수를 만드는 예제입니다.

"functions": [
  {
    "namespace": "contoso",
    "members": {
      "uniqueName": {
        "parameters": [
          {
            "name": "namePrefix",
            "type": "string"
          }
        ],
        "output": {
          "type": "string",
          "value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
        }
      }
    }
  }
],

리소스

이 섹션에서는 배포를 구성하는 Azure 리소스를 정의합니다.

다음은 공용 IP 주소 리소스를 생성하는 예제입니다.

{
  "type": "Microsoft.Network/publicIPAddresses",
  "name": "[variables('publicIPAddressName')]",
  "location": "[parameters('location')]",
  "apiVersion": "2018-08-01",
  "properties": {
    "publicIPAllocationMethod": "Dynamic",
    "dnsSettings": {
      "domainNameLabel": "[parameters('dnsLabelPrefix')]"
    }
  }
}

여기에서 리소스의 형식은 Microsoft.Network/publicIPAddresses입니다. 해당 이름은 변수 섹션에서 읽고 해당 위치(또는 Azure 지역)는 매개 변수 섹션에서 읽습니다.

리소스 종류는 시간이 지나면서 변경될 수 있으므로 apiVersion은 사용하려는 리소스 종류의 버전을 말합니다. 리소스 종류가 발전하고 변경되면서,준비가 되면 최신 기능을 사용하도록 템플릿을 수정할 수 있습니다.

출력

이 섹션에서는 템플릿이 실행될 때 수신하고자 하는 정보를 정의합니다. 예를 들어 배포가 실행될 때까지 알 수 없는 VM의 IP 주소나 FQDN 정보를 수신하고자 한다고 합시다.

다음 예제에서는 hostname이라는 출력을 보여 줍니다. FQDN 값은 VM의 공용 IP 주소 설정에서 읽어옵니다.

"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
  }
}

템플릿에서 Azure Logic Apps 워크플로를 배포하려면 어떻게 해야 할까요?

Azure Logic Apps 워크플로는 Azure의 리소스입니다. 따라서 Resource Manager 템플릿 섹션에서 배포할 리소스 목록에 추가하여 템플릿에 resources 배포할 수 있습니다. 워크플로를 정의하기 위해 리소스 섹션에 정확히 무엇을 추가해야 할까요? 리소스 섹션에 해당 워크플로의 JSON 워크플로 정의를 추가합니다. 사실, 다음 JSON 코드 조각이 앞의 단원에서 설명한 기본 워크플로의 배포를 위한 Resource Manager 템플릿을 보여 줍니다. 강조 표시에서 확인할 수 있듯이 리소스 섹션은 전체 워크플로 정의를 포함합니다.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Logic/workflows",
            "apiVersion": "2017-07-01",
            "name": "HelloLogicAppsTemplate",
            "location": "westus2",
            "properties": {
                "state": "Enabled",
                "definition": {
                    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "triggers": {
                        "manual": {
                            "type": "Request",
                            "kind": "Http",
                            "inputs": {
                                "method": "GET",
                                "schema": {}
                            }
                        }
                    },
                    "actions": {
                        "Response": {
                            "runAfter": {},
                            "type": "Response",
                            "kind": "Http",
                            "inputs": {
                                "body": "Hello Logic Apps Template!",
                                "statusCode": 200
                            }
                        }
                    },
                    "outputs": {}
                },
                "parameters": {}
            }
        }
    ],
    "outputs": {
        "logicAppUrl": {
           "type": "string",
           "value": "[listCallbackURL(concat(resourceId('Microsoft.Logic/workflows/', 'HelloLogicAppsTemplate'), '/triggers/manual'), '2017-07-01').value]"
        }
     }
}

다음 방법 중 하나를 사용하여 이 템플릿을 배포할 수 있습니다.

  • Azure Portal을 사용하여 배포
  • PowerShell Az 모듈을 사용하여 배포
  • Azure CLI(명령줄 인터페이스)에서 배포합니다.

이 모듈에서는 Azure CLI 및 az deployment group 명령을 사용하여 템플릿을 배포합니다.

Resource Manager 템플릿을 작성하는 방법

Resource Manager 템플릿을 작성하는 방법은 다양합니다. 템플릿을 처음부터 작성할 수 있지만 기존 템플릿을 활용하여 필요에 맞게 수정하는 것이 일반적입니다.

다음은 시작 템플릿을 구할 수 있는 몇 가지 방법입니다.

  • Azure Portal을 사용하여 기존 리소스 그룹의 리소스를 기반으로 템플릿을 만듭니다.
  • 사용자나 사용자의 팀에서 작성한 비슷한 용도로 사용되는 템플릿을 사용하여 시작합니다.
  • Azure 빠른 시작 템플릿을 사용하여 시작합니다. 방법은 다음 부분에서 볼 수 있습니다.

어떠한 방식이든 템플릿을 작성하려면 텍스트 편집기 작업이 필요합니다. 즐겨 찾는 편집기를 가져올 수 있지만 Visual Studio Code의 Azure Resource Manager 도구 확장 은 템플릿을 만들기 위해 특별히 설계되었습니다. 이 확장을 사용하면 템플릿 코드를 간편하게 탐색할 수 있으며, 다수의 일반적인 작업에 자동 완성 기능이 제공됩니다.

템플릿을 살펴보고 작성할 때 설명서를 검토하여 사용 가능한 리소스 유형과 사용하는 방법을 이해하는 것이 좋습니다.

다음 단원에서는 Azure CLI의 기존 템플릿을 살펴보고 배포하겠습니다.