AZ-104 ARM 템플릿·Bicep 읽는 법: 구조·반복·조건·배포 모드·내보내기

같은 스토리지 계정을 ARM JSON과 Bicep으로 나란히 놓고 한 줄씩 해석하며, 자주 나오는 템플릿 함수, copy·for 반복과 조건·종속성 수정, 매개 변수 파일과 Key Vault 참조, 배포 범위와 증분·전체 모드, 템플릿 내보내기와 decompile 변환까지 정리했습니다.

AZ-104 컴퓨팅 도메인의 첫 번째 묶음은 "ARM 템플릿 또는 Bicep 파일로 리소스 배포 자동화"입니다. 하위 항목 다섯 개가 "ARM 템플릿이나 Bicep 파일 해석", "기존 ARM 템플릿 수정", "기존 Bicep 파일 수정", "배포", "배포를 ARM 템플릿으로 내보내거나 Bicep으로 변환"으로, 모두 코드를 직접 읽고 고치는 능력을 묻습니다. 실제 시험에서도 템플릿 일부를 보여 주고 "스토리지 계정 세 개를 만들려면 무엇을 추가해야 하나", "이 배포를 실행하면 기존 리소스는 어떻게 되나"를 묻는 문항이 나옵니다.

이 글은 개발 경험이 없는 관리자도 템플릿을 읽을 수 있도록, 같은 스토리지 계정을 ARM JSON과 Bicep으로 나란히 놓고 한 줄씩 해석합니다. 템플릿의 구성 요소와 자주 나오는 함수, 반복·조건·종속성, 매개 변수 파일과 Key Vault 참조, 배포 범위와 배포 모드, 내보내기와 변환까지 다룹니다. ARM 템플릿과 Bicep이 무엇인지는 가상 머신과 배포 자동화에서 먼저 소개했습니다.

---

 

템플릿은 칸이 정해진 신청서다

관공서 신청서에는 신청자가 채울 칸, 담당자가 계산하는 칸, 실제 신청 내용, 처리 후 받는 접수증이 정해진 자리에 있습니다. ARM 템플릿도 정해진 칸으로 이루어진 JSON 문서입니다.

| 칸 | 역할 | 신청서에 비유하면 | |------|------|------| | $schema | 템플릿 언어 버전과 배포 범위 | 양식 번호 | | contentVersion | 템플릿 자체의 버전 | 문서 개정 번호 | | parameters | 배포할 때 바깥에서 받는 값 | 신청자가 채우는 칸 | | variables | 템플릿 안에서 계산해 다시 쓰는 값 | 담당자 계산 칸 | | resources | 만들거나 수정할 리소스 | 실제 신청 내용 | | outputs | 배포 후 돌려줄 값 | 접수증 |

아래는 스토리지 계정 하나를 만드는 ARM 템플릿입니다.

자주 나오는 템플릿 함수

대괄호 안의 값은 배포할 때 계산되는 식입니다.

| 함수 | 결과 | 쓰임 | |------|------|------| | resourceGroup().location | 배포 대상 리소스 그룹의 지역 | location 기본값 | | parameters('이름') · variables('이름') | 매개 변수·변수 값 | 값 재사용 | | concat() · format() | 문자열 이어 붙이기 | 이름 만들기 | | uniqueString(resourceGroup().id) | 리소스 그룹마다 같은 13자리 해시 | 전역에서 고유해야 하는 이름 | | resourceId('형식', '이름') | 리소스의 전체 ID | 다른 리소스 참조, 출력 | | copyIndex() | 반복 중 현재 순번 | 반복 리소스 이름 |

시험 팁: "매개 변수 값이 주어지지 않으면 리소스 그룹과 같은 지역에 배포"는 defaultValue에 resourceGroup().location을 쓰는 것입니다. "허용된 SKU 외에는 입력할 수 없게"는 allowedValues입니다.

---

 

같은 내용을 Bicep으로 읽기

Bicep은 ARM JSON을 더 짧고 읽기 쉽게 쓰는 언어이고, 배포할 때 ARM JSON으로 변환됩니다. 위 템플릿을 Bicep으로 쓰면 다음과 같습니다.

| ARM JSON | Bicep | 기억할 점 | |------|------|------| | parameters + defaultValue | param 이름 형식 = 기본값 | 기본값은 등호로 | | allowedValues · minLength | @allowed · @minLength 데코레이터 | 매개 변수 위에 붙임 | | securestring | @secure() param | 암호·키는 반드시 보안 매개 변수 | | variables | var | 형식 선언 없음 | | type + apiVersion | 'type@apiVersion' | 한 줄로 합침 | | dependsOn | 대부분 자동 (기호 이름 참조) | stg.id처럼 참조하면 종속성이 생김 | | copy | [for ... in ...: {...}] | 반복 식 | | condition | if (조건) | 조건부 배포 | | outputs | output | 형식 선언 필요 |

시험 팁: Bicep 문제에서 "VNet이 먼저 만들어진 뒤 서브넷을 참조하게 하려면 dependsOn을 추가하라"는 보기는 대부분 필요 없습니다. 기호 이름(예: vnet.id)으로 참조하면 Bicep이 종속성을 자동으로 만듭니다.

---

 

반복·조건·종속성: 가장 자주 나오는 수정

템플릿 수정 문제는 대부분 세 가지 중 하나입니다. 같은 리소스를 여러 개 만들기, 조건에 따라 만들지 말지 정하기, 만드는 순서 정하기입니다.

ARM JSON에서 스토리지 계정 세 개를 만들려면 리소스에 copy 속성을 넣고 이름에 copyIndex()를 붙입니다.

Bicep에서는 for 식을 씁니다.

| 요구 사항 | ARM JSON | Bicep | |------|------|------| | 같은 리소스를 N개 | copy + count, copyIndex() | [for i in range(0, N): {...}] | | 조건이 참일 때만 배포 | "condition": "[equals(parameters('env'), 'prod')]" | resource ... = if (env == 'prod') {...} | | VM은 NIC가 생긴 뒤에 | "dependsOn": [ "[resourceId('Microsoft.Network/networkInterfaces', 'nic1')]" ] | nic.id를 참조하면 자동 | | 이미 있는 리소스를 참조 | reference() · resourceId() | resource vnet '...' existing = { name: 'vnet1' } |

시험 팁: copyIndex()는 0부터 시작합니다. "stg1, stg2, stg3처럼 1부터 이름을 붙여라"는 copyIndex(1)처럼 시작값을 넘깁니다.

---

 

매개 변수 파일과 비밀 값

같은 템플릿을 개발·운영 환경에 다른 값으로 배포할 때는 매개 변수 파일을 따로 둡니다. 암호 같은 비밀 값은 파일에 직접 쓰지 않고 Key Vault의 비밀을 참조합니다.

템플릿 쪽 매개 변수는 securestring(Bicep은 @secure())이어야 값이 배포 기록과 로그에 남지 않음 Key Vault에서 템플릿 배포용 액세스(enabledForTemplateDeployment)를 켜야 배포 중에 비밀을 읽을 수 있음 Bicep은 .bicepparam 파일에 using './main.bicep'과 param 이름 = 값을 적어 같은 일을 함

시험 팁: "VM 관리자 암호를 템플릿이나 매개 변수 파일에 노출하지 말라"는 Key Vault 비밀 참조 + securestring 매개 변수입니다. 배포가 "Key Vault에 접근할 수 없다"는 오류로 실패하면 Key Vault의 템플릿 배포 허용 설정을 확인하세요.

---

 

배포 범위와 배포 모드

템플릿은 어디에 배포하느냐에 따라 명령이 달라집니다.

| 배포 범위 | Azure CLI | PowerShell | |------|------|------| | 리소스 그룹 | az deployment group create --resource-group rg1 --template-file main.bicep | New-AzResourceGroupDeployment | | 구독 | az deployment sub create --location koreacentral --template-file main.bicep | New-AzSubscriptionDeployment | | 관리 그룹 | az deployment mg create --management-group-id mg1 --location koreacentral | New-AzManagementGroupDeployment | | 테넌트 | az deployment tenant create --location koreacentral | New-AzTenantDeployment |

리소스 그룹 배포에는 두 가지 모드가 있습니다. 템플릿에 없는 기존 리소스를 어떻게 처리하느냐가 다릅니다.

!증분 모드와 전체 모드는 템플릿에 없는 리소스를 다르게 처리한다

| 모드 | 템플릿에 없는 기존 리소스 | 템플릿에 있는 리소스 | |------|------|------| | 증분 (기본값, 권장) | 그대로 둠 | 만들거나, 템플릿에 적힌 속성 값으로 다시 적용 | | 전체 (권장 안 함) | 삭제 | 만들거나 다시 적용 |

증분 모드에도 함정이 있습니다. 기존 리소스를 다시 배포하면 속성이 "추가"되는 것이 아니라 템플릿 기준으로 다시 적용되므로, 템플릿에 빠진 속성은 기본값으로 덮어써질 수 있습니다. 또 Microsoft는 전체 모드를 권장하지 않고 점차 사용 중단할 예정이며, 배포로 리소스를 지워야 하면 배포 스택을 쓰라고 안내합니다. 배포 전에 what-if(az deployment group what-if)를 실행하면 무엇이 만들어지고 바뀌고 지워지는지 미리 볼 수 있습니다.

시험 팁: "RG1에 VM1과 Storage1이 있고, VNet1만 정의한 템플릿을 전체 모드로 배포"하면 VM1과 Storage1은 삭제되고 VNet1만 남습니다. 같은 템플릿을 증분 모드로 배포하면 셋 모두 남습니다.

---

 

내보내기와 변환

이미 포털에서 만든 리소스를 템플릿으로 만들고 싶을 때는 내보내기를 씁니다. 방법에 따라 결과물의 성격이 다릅니다.

| 방법 | 결과물 | 특징 | |------|------|------| | 리소스 그룹·리소스에서 템플릿 내보내기 | Bicep 또는 ARM JSON | 현재 상태의 스냅숏, 배포 후 바뀐 내용 반영, 속성이 많고 매개 변수는 적음 | | 배포 기록에서 저장 | ARM JSON만 | 실제 배포에 쓴 템플릿 그대로, 매개 변수 포함, 그 배포의 리소스만 | | az bicep decompile --file main.json | ARM JSON → Bicep | 최선의 노력 변환, 결과를 다듬어야 할 수 있음 | | az bicep build --file main.bicep | Bicep → ARM JSON | 배포 전 변환 결과 확인 |

시험 팁: "배포한 뒤 포털에서 바꾼 설정까지 포함한 템플릿이 필요하다"는 리소스 그룹에서 내보내기, "처음 배포에 사용한 템플릿과 매개 변수를 그대로 다시 쓰고 싶다"는 배포 기록에서 저장입니다. "기존 ARM 템플릿을 Bicep으로 바꿔라"는 decompile입니다.

---

 

시험 핵심 정리

시험장 가기 전 마지막으로 확인할 핵심 포인트입니다.

| 구분 | 핵심 암기 사항 | |------|------| | 템플릿 구성 | $schema · contentVersion · parameters · variables · resources · outputs | | 지역 기본값 | resourceGroup().location | | 고유 이름 | uniqueString(resourceGroup().id) | | 입력 제한 | allowedValues · minLength (Bicep은 @allowed · @minLength) | | 비밀 값 | securestring · @secure() + Key Vault 참조(enabledForTemplateDeployment) | | 반복 | ARM copy + copyIndex()(0부터), Bicep for 식 | | 조건 | ARM condition, Bicep if | | 종속성 | ARM dependsOn, Bicep은 기호 이름 참조로 자동 | | 배포 모드 | 증분(기본) 그대로 둠 vs 전체 템플릿에 없는 리소스 삭제 | | 전체 모드 | 권장 안 함, 삭제가 필요하면 배포 스택 | | what-if | 배포 전 변경 내용 미리 보기 | | 내보내기 | 리소스 그룹(현재 상태, Bicep·JSON) vs 배포 기록(원본, JSON), decompile로 Bicep 변환 |

---

 

다음 단계

템플릿을 읽을 수 있게 되었다면, 템플릿으로 만든 VM을 운영하는 방법을 AZ-104 VM 운영 작업에서 이어서 정리하세요. 가용성 옵션과 확장 집합은 가상 머신과 배포 자동화에 있습니다.

템플릿 문제는 코드를 처음부터 끝까지 읽기보다 "무엇을 묻는가(반복, 조건, 순서, 모드)"를 먼저 정하고 해당 칸만 찾는 것이 빠릅니다. AZ-104 모의고사에서 템플릿 문제를 풀며 이 순서를 연습해 보세요.

블로그 목록으로 돌아가기