ARM 템플릿이란?

클라우드로 전환하며 많은 팀이 Agile 개발 방법을 채택했습니다. 빠르게 반복할 수 있게 되었습니다. 한편, 솔루션을 클라우드에 반복적으로 배포하는 과정에서 인프라가 신뢰할 수 있는 상태인지 확인해야 합니다. 인프라가 반복 프로세스의 일부가 되면서 작업과 개발 간의 구분이 사라졌습니다. 팀은 통합 프로세스를 통해 인프라 및 애플리케이션 코드를 관리해야 합니다.

배포를 자동화하고 Insfrastructure-as-Code 방식을 도입하면 이러한 문제를 해결할 수 있습니다. 배포해야 할 인프라를 코드에서 정의합니다. 인프라 코드가 프로젝트의 일부가 됩니다. 애플리케이션 코드처럼 소스 리포지토리에 인프라 코드를 저장하고 버전을 지정할 수 있습니다. 모든 팀 구성원이 코드를 실행하고 유사한 환경을 배포할 수 있습니다.

Azure 솔루션의 코드형 인프라를 구현하려면 ARM 템플릿(Azure Resource Manager 템플릿)을 사용하세요. 해당 템플릿은 프로젝트에 대한 인프라 및 구성을 정의하는 JSON(JavaScript Object Notation) 파일입니다. 이 템플릿은 대상을 만들기 위한 프로그래밍 명령 시퀀스를 작성하지 않고도 배포하려는 대상을 설명할 수 있는 선언적 구문입니다. 배포할 리소스와 해당 리소스의 속성을 템플릿에서 지정합니다.

ARM 템플릿과 동일한 기능을 제공하지만 더 사용하기 쉬운 구문을 제공하는 새로운 언어(Bicep)가 도입되었습니다. 각 Bicep 파일은 배포하는 동안 ARM 템플릿으로 자동으로 변환됩니다. 인프라를 코드 옵션으로 고려하고 있다면 Bicep을 살펴보는 것이 좋습니다. 자세한 내용은 Bicep이란 무엇인가요?를 참조하세요.

ARM 템플릿을 사용하는 방법에 대한 자세한 내용은 다음 비디오를 참조하세요.

ARM 템플릿을 선택해야 하는 이유

ARM 템플릿과 다른 코드형 인프라 서비스 중 무엇을 사용할지 고민한다면, 템플릿 사용 시 얻을 수 있는 다음과 같은 이점을 고려해 보세요.

  • 선언적 구문: ARM 템플릿을 사용하면 전체 Azure 인프라를 선언적으로 생성하고 배포할 수 있습니다. 예를 들면 가상 머신뿐만 아니라 네트워크 인프라, 스토리지 시스템 및 필요한 기타 리소스도 배포할 수 있습니다.

  • 반복 가능한 결과: 개발 수명 주기 내내 인프라를 반복적으로 배포하며, 안정적이고 일관된 리소스 배포를 보장할 수 있습니다. 템플릿은 idempotent이며, 이는 동일한 템플릿을 여러 번 배포하고 동일한 상태에 있는 동일한 유형의 리소스를 가져올 수 있음을 의미합니다. 업데이트를 나타내는 여러 개의 개별 템플릿을 개발하는 대신 원하는 상태를 나타내는 하나의 템플릿을 개발할 수 있습니다.

  • 오케스트레이션: 복잡한 작업 순서 지정 작업에 대해 우려할 필요가 없습니다. Resource Manager는 리소스가 올바른 순서로 생성되도록 상호 의존적인 리소스의 배포를 오케스트레이션합니다. 가능한 경우 Resource Manager는 리소스를 병렬로 배포하여, 직렬로 배포될 때보다 배포가 빠르게 완료되도록 합니다. 다수의 명령어가 아닌 하나의 명령으로 템플릿을 배포합니다.

    Diagram that shows the difference between imperative and declarative deployment.

  • 모듈식 파일: 템플릿을 재사용 가능한 소규모 구성 요소로 분할하고, 배포 시 서로 연결할 수 있습니다. 다른 템플릿 내에 하나의 템플릿을 중첩할 수도 있습니다.

  • Azure 리소스 만들기: 새로운 Azure 서비스 및 기능을 템플릿에서 즉시 사용할 수 있습니다. 리소스 공급자가 새 리소스를 도입하면, 템플릿을 통해 해당 리소스를 즉시 배포할 수 있습니다. 새 서비스를 사용하기 전에 도구나 모듈이 업데이트되기를 기다릴 필요가 없습니다.

  • 확장성: 배포 스크립트를 사용하여 템플릿에 PowerShell 또는 Bash 스크립트를 추가할 수 있습니다. 배포 스크립트는 배포 중에 리소스를 설정하는 능력을 확장합니다. 스크립트는 템플릿에 포함될 수도 있고, 외부 소스에 저장되어 템플릿이 해당 스크립트를 참조할 수도 있습니다. 배포 스크립트를 사용하면 단일 ARM 템플릿에서 엔드투엔드 환경 설정을 완료할 수 있습니다.

  • 테스트: ARM 템플릿 도구 키트(arm-ttk)로 템플릿을 테스트하여 권장 지침을 따르는지 확인할 수 있습니다. 이 테스트 키트는 GitHub에서 다운로드할 수 있는 PowerShell 스크립트입니다. 도구 키트를 사용하면 템플릿 언어를 사용하여 보다 쉽게 전문성을 계발할 수 있습니다.

  • 변경 내용 미리 보기: 가상 작업을 사용하여 템플릿을 배포하기 전에 변경 내용 미리 보기를 가져올 수 있습니다. 가상 작업으로 어떤 리소스가 생성되고, 업데이트되고, 삭제될 것인지 확인하고, 변경될 모든 리소스 속성을 볼 수 있습니다. 가상 작업은 사용자 환경의 현재 상태를 확인하고 상태를 관리할 필요가 없도록 해 줍니다.

  • 기본 제공 유효성 검사: 템플릿이 배포되려면 먼저 유효성 검사를 통과해야 합니다. 또한 Resource Manager는 배포의 성공 여부를 확인하기 위해 배포를 시작하기 전에 템플릿을 확인합니다. 배포가 반 정도 완료된 상태에서는 중단될 가능성이 낮습니다.

  • 배포 추적: Azure Portal에서 배포 기록을 검토하고 템플릿 배포에 대한 정보를 가져올 수 있습니다. 배포된 템플릿, 전달된 매개 변수 값, 모든 출력 값을 확인할 수 있습니다. 다른 코드형 인프라는 포털을 통해 추적되지 않습니다.

    Screenshot of the Azure portal showing deployment history.

  • 코드형 정책: Azure Policy는 거버넌스를 자동화하는 코드형 정책 프레임워크입니다. Azure 정책을 사용하면 템플릿을 통해 리소스를 배포할 때 규격에 맞지 않는 리소스에 대해 정책 수정이 수행됩니다.

  • 배포 청사진: 규정 및 규정 준수 표준을 충족하기 위해 Microsoft에서 제공하는 청사진을 활용할 수 있습니다. 청사진에는 다양한 아키텍처를 위해 미리 빌드된 템플릿이 포함되어 있습니다.

  • CI/CD 통합: CI/CD(연속 통합 및 연속 배포) 도구에 템플릿을 통합할 수 있습니다. 이 도구는 빠르고 안정적인 애플리케이션 및 인프라 업데이트를 위해 릴리스 파이프라인을 자동화할 수 있습니다. Azure DevOps 및 Resource Manager 템플릿 작업을 통해 Azure Pipelines를 사용해서 ARM 템플릿 프로젝트를 지속적으로 빌드하고 배포할 수 있습니다. 자세한 내용은 파이프라인을 사용한 VS 프로젝트자습서: Azure Resource Manager 템플릿과 Azure Pipelines의 연속 통합을 참조하세요.

  • 내보내기 가능한 코드: 리소스 그룹의 현재 상태를 내보내거나 특정 배포에 사용된 템플릿을 검토하여 기존 리소스 그룹에 대한 템플릿을 가져올 수 있습니다. 내보낸 템플릿을 살펴보면 템플릿 구문에 대해 알아보는 데 도움이 됩니다.

  • 제작 도구: Visual Studio Code 및 템플릿 도구 확장을 통해 템플릿을 작성할 수 있습니다. Intellisense, 구문 강조, 인라인 도움말 및 기타 많은 언어 함수를 사용할 수 있습니다. Visual Studio Code 외에도 Visual Studio를 사용할 수 있습니다.

템플릿 파일

템플릿 내에서 JSON 기능을 확장하는 템플릿 식을 작성할 수 있습니다. 해당 식은 Resource Manager에서 제공하는 함수를 사용합니다.

템플릿은 다음과 같은 섹션으로 구성됩니다.

  • 매개 변수 - 배포 중에 다양한 환경에서 동일한 템플릿을 사용할 수 있도록 허용하는 값을 제공합니다.

  • 변수 - 템플릿에서 재사용되는 값을 정의합니다. 변수는 매개 변수 값에서 생성될 수 있습니다.

  • 사용자 정의 함수 - 템플릿을 간소화하는 사용자 지정 함수를 만듭니다.

  • 리소스 - 배포할 리소스를 지정합니다.

  • 출력 - 배포된 리소스의 값을 반환합니다.

템플릿 배포 프로세스

템플릿을 배포할 때 Resource Manager가 템플릿을 REST API 작업으로 변환합니다. 예를 들어 리소스 관리자가 다음 리소스 정의로 템플릿을 받는 경우:

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2022-09-01",
    "name": "mystorageaccount",
    "location": "centralus",
    "sku": {
      "name": "Standard_LRS"
    },
    "kind": "StorageV2"
  },
]

Microsoft.Storage 리소스 공급자에게 전송되는 다음 REST API 작업으로 정의를 변환합니다.

PUT
https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/mystorageaccount?api-version=2022-09-01
REQUEST BODY
{
  "location": "centralus",
  "sku": {
    "name": "Standard_LRS"
  },
  "kind": "StorageV2",
  "properties": {}
}

리소스에 대해 템플릿에 설정한 apiVersion이 REST 작업의 API 버전으로 사용됩니다. 템플릿을 반복적으로 배포할 수 있으며 배포는 안정적으로 지속 가능합니다. 동일한 API 버전을 사용하면 후속 버전에서 호환성이 손상되는 변경이 생길 것을 걱정할 필요가 없습니다.

템플릿을 배포하려면 다음 옵션 중 하나를 사용합니다.

템플릿 디자인

템플릿 및 리소스 그룹을 정의하는 방법은 사용자 및 솔루션을 관리하려는 방법에 전적으로 달려 있습니다. 예를 들어 단일 템플릿을 통해 3계층 애플리케이션을 단일 리소스 그룹에 배포할 수 있습니다.

Diagram that shows a three-tier application deployment using a single template.

그러나 단일 템플릿에서 전체 인프라를 정의할 필요가 없습니다. 대부분 배포 요구 사항을 대상, 목적에 특정 템플릿 집합으로 나누는 것이 좋습니다. 서로 다른 솔루션에 이러한 템플릿을 쉽게 다시 사용할 수 있습니다. 특정 솔루션을 배포하려면 모든 필수 템플릿에 연결하는 메인 템플릿을 만듭니다. 다음 이미지는 세 개의 중첩된 템플릿을 포함하는 부모 템플릿을 통해 3계층 솔루션을 배포하는 방법을 보여 줍니다.

Diagram that shows a three-tier application deployment using nested templates.

계층이 별도 수명 주기를 갖도록 계획하는 경우 3계층을 별도 리소스 그룹에 배포할 수 있습니다. 리소스는 다른 리소스 그룹의 리소스에 계속해서 연결될 수 있습니다.

Diagram that shows a three-tier application deployment with separate resource groups.

중첩된 템플릿에 대한 자세한 내용은 Azure Resource Manager에서 연결된 템플릿 사용을 참조하세요.

템플릿 공유

템플릿을 만든 후 조직의 다른 사용자와 공유할 수 있습니다. 템플릿 사양을 사용하면 템플릿을 리소스 종류로 저장할 수 있습니다. 역할 기반 액세스 제어를 사용하여 템플릿 사양에 대한 액세스를 관리할 수 있습니다. 템플릿 사양에 대한 읽기 권한이 있는 사용자는 템플릿을 배포할 수 있지만 템플릿을 변경할 수는 없습니다.

이 접근 방식을 사용하면 조직의 표준에 맞는 템플릿을 안전하게 공유할 수 있습니다.

다음 단계