Bicep 파일의 구조 및 구문 이해
이 문서에서는 Bicep 파일의 구조와 구문에 대해 설명합니다. 여기서는 파일의 다른 섹션 및 해당 섹션에서 사용할 수 있는 속성을 보여 줍니다.
Bicep 파일을 만드는 과정을 안내하는 단계별 자습서는 빠른 시작: Visual Studio Code를 사용하여 Bicep 파일 만들기를 참조하세요.
Bicep 형식
Bicep은 선언적 언어이므로 요소가 임의의 순서로 표시될 수 있습니다. 명령적 언어와 달리 요소의 순서는 배포가 처리되는 방식에 영향을 주지 않습니다.
Bicep 파일은 다음과 같은 요소로 구성되어 있습니다.
@<decorator>(<argument>)
metadata <metadata-name> = ANY
targetScope = '<scope>'
@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>
@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>
@<decorator>(<argument>)
param <parameter-name> <parameter-data-type> = <default-value>
@<decorator>(<argument>)
var <variable-name> = <variable-value>
@<decorator>(<argument>)
resource <resource-symbolic-name> '<resource-type>@<api-version>' = {
<resource-properties>
}
@<decorator>(<argument>)
module <module-symbolic-name> '<path-to-file>' = {
name: '<linked-deployment-name>'
params: {
<parameter-names-and-values>
}
}
@<decorator>(<argument>)
output <output-name> <output-data-type> = <output-value>
다음 예제는 해당 요소의 구현을 보여 줍니다.
metadata description = 'Creates a storage account and a web app'
@description('The prefix to use for the storage account name.')
@minLength(3)
@maxLength(11)
param storagePrefix string
param storageSKU string = 'Standard_LRS'
param location string = resourceGroup().location
var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
location: location
sku: {
name: storageSKU
}
kind: 'StorageV2'
properties: {
supportsHttpsTrafficOnly: true
}
}
module webModule './webApp.bicep' = {
name: 'webDeploy'
params: {
skuName: 'S1'
location: location
}
}
메타데이터
Bicep의 메타데이터는 Bicep 파일에 포함할 수 있는 형식화되지 않은 값입니다. 이름, 설명, 작성자, 만들기 날짜 등과 같은 세부 정보를 비롯한 Bicep 파일에 대한 추가 정보를 제공할 수 있습니다.
대상 범위
기본적으로 대상 범위는 resourceGroup
으로 설정됩니다. 리소스 그룹 수준에서 배포하는 경우 Bicep 파일에서 대상 범위를 설정하지 않아도 됩니다.
허용되는 값은 다음과 같습니다.
- resourceGroup - 리소스 그룹 배포에 사용되는 기본값입니다.
- subscription - 구독 배포에 사용됩니다.
- managementGroup - 관리 그룹 배포에 사용됩니다.
- tenant - 테넌트 배포에 사용됩니다.
모듈에서 Bicep 파일의 나머지 부분에 대한 범위와 다른 범위를 지정할 수 있습니다. 자세한 내용은 모듈 범위 구성을 참조하세요.
데코레이터
다음 각 요소에 대해 하나 이상의 데코레이터를 추가할 수 있습니다.
데코레이터는 다음과 같습니다.
데코레이터 | 요소에 적용 | 데이터 형식에 적용 | 인수 | 설명 |
---|---|---|---|---|
allowed | param | all | 배열 | 해당 데코레이터를 사용하여 사용자가 올바른 값을 제공하는지 확인합니다. 이 데코레이터는 param 문에서만 허용됩니다. 속성이 type 또는 output 문의 미리 정의된 값 집합 중 하나여야 한다고 선언하려면 공용 구조체 형식 구문을 사용합니다. 공용 구조체 형식 구문은 param 문에서도 사용할 수 있습니다. |
batchSize | 모듈, 리소스 | 해당 없음 | 정수 | 순차적으로 배포할 인스턴스를 설정합니다. |
description | 함수, 매개 변수, 모듈, 출력, 리소스, 형식, 변수 | all | string | 요소에 대한 설명을 제공합니다. 설명 텍스트에 Markdown 형식의 텍스트를 사용할 수 있습니다. |
discriminator | 매개 변수, 형식, 출력 | 개체 | string | 이 데코레이터를 사용하면 올바른 하위 클래스가 식별되고 관리되는지 확인할 수 있습니다. 자세한 내용은 사용자 지정 태그가 지정된 공용 구조체 데이터 형식을 참조하세요. |
export | 함수, 형식, 변수 | all | 없음 | 해당 요소를 다른 Bicep 파일에서 가져올 수 있음을 나타냅니다. |
maxLength | 매개 변수, 출력, 형식 | 배열, 문자열 | int | 문자열과 배열 요소의 최대 길이. 해당 값이 포함되어 있습니다. |
maxValue | 매개 변수, 출력, 형식 | int | int | 정수 요소의 최댓값. 해당 값이 포함되어 있습니다. |
metadata | 함수, 출력, 매개 변수, 형식 | all | 개체 | 요소에 적용할 사용자 지정 속성. 설명 데코레이터와 동일한 Description 속성을 포함할 수 있습니다. |
minLength | 매개 변수, 출력, 형식 | 배열, 문자열 | int | 문자열과 배열 요소의 최소 길이. 해당 값이 포함되어 있습니다. |
minValue | 매개 변수, 출력, 형식 | int | int | 정수 요소의 최솟값. 해당 값이 포함되어 있습니다. |
sealed | 매개 변수, 형식, 출력 | 개체 | 없음 | 사용-정의 데이터 형식의 속성 이름이 오타일 가능성이 높은 경우 경고에서 오류로 BCP089를 높입니다. 자세한 내용은 오류 수준 높이기를 참조하세요. |
secure | 매개 변수, 형식 | 문자열, 개체 | 없음 | 매개 변수를 안전하다고 표시합니다. 보안 매개 변수의 값은 배포 기록에 저장되지 않으며 기록되지 않습니다. 자세한 내용은 보안 문자열 및 개체를 참조하세요. |
매개 변수
배포마다 달라져야 하는 값에 대한 매개 변수를 사용합니다. 배포 중에 값이 제공되지 않은 경우 사용되는 매개 변수의 기본값을 정의할 수 있습니다.
예를 들어 SKU 매개 변수를 추가하여 리소스에 대해 다양한 크기를 지정할 수 있습니다. 테스트에 배포하는지 프로덕션에 배포하는지에 따라 다른 값을 전달할 수 있습니다.
param storageSKU string = 'Standard_LRS'
매개 변수는 Bicep 파일에서 사용할 수 있습니다.
sku: {
name: storageSKU
}
각 매개 변수에 대해 하나 이상의 데코레이터를 추가할 수 있습니다. 자세한 내용은 데코레이터 사용을 참조하세요.
자세한 내용은 Bicep의 매개 변수를 참조하세요.
변수
복잡한 표현식을 변수에 캡슐화하여 Bicep 파일을 더 읽기 쉽게 만들 수 있습니다. 예를 들어 여러 값을 결합하여 구성된 리소스 이름에 대한 변수를 추가할 수 있습니다.
var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
복잡한 표현식이 필요할 때마다 이 변수를 적용합니다.
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
각 변수에 대해 하나 이상의 데코레이터를 추가할 수 있습니다. 자세한 내용은 데코레이터 사용을 참조하세요.
자세한 내용은 의 변수를 참조하세요.
유형
type
문을 사용하여 사용자 정의 데이터 형식을 정의할 수 있습니다.
param location string = resourceGroup().location
type storageAccountSkuType = 'Standard_LRS' | 'Standard_GRS'
type storageAccountConfigType = {
name: string
sku: storageAccountSkuType
}
param storageAccountConfig storageAccountConfigType = {
name: 'storage${uniqueString(resourceGroup().id)}'
sku: 'Standard_LRS'
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountConfig.name
location: location
sku: {
name: storageAccountConfig.sku
}
kind: 'StorageV2'
}
사용자 정의 데이터 형식마다 하나 이상의 데코레이터를 추가할 수 있습니다. 자세한 내용은 데코레이터 사용을 참조하세요.
자세한 내용은 사용자 정의 데이터 형식을 참조하세요.
함수
Bicep 파일에서는 Bicep 파일 내에서 자동으로 사용할 수 있는 표준 Bicep 함수를 사용하는 것 외에도 고유한 함수를 만들 수 있습니다. Bicep 파일에서 반복적으로 사용되는 복잡한 식이 있는 경우 고유한 함수를 만들 수 있습니다.
func buildUrl(https bool, hostname string, path string) string => '${https ? 'https' : 'http'}://${hostname}${empty(path) ? '' : '/${path}'}'
output azureUrl string = buildUrl(true, 'microsoft.com', 'azure')
자세한 내용은 사용자 정의 함수를 참조하세요.
리소스
resource
키워드를 사용하여 배포할 리소스를 정의합니다. 리소스 선언에는 해당 리소스에 대한 기호화된 이름이 포함됩니다. Bicep 파일의 다른 부분에서 이 기호 이름을 사용하여 리소스에서 값을 가져오세요.
리소스 선언에는 리소스 종류 및 API 버전이 포함됩니다. 리소스 선언의 본문 내에 리소스 종류와 관련된 속성을 포함합니다.
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: uniqueStorageName
location: location
sku: {
name: storageSKU
}
kind: 'StorageV2'
properties: {
supportsHttpsTrafficOnly: true
}
}
각 리소스에 대해 하나 이상의 데코레이터를 추가할 수 있습니다. 자세한 내용은 데코레이터 사용을 참조하세요.
자세한 내용은 Bicep의 리소스 선언을 참조하세요.
일부 리소스에는 상위/하위 관계가 있습니다. 상위 리소스 내부 또는 외부에서 하위 리소스를 정의할 수 있습니다.
다음 예는 상위 리소스 내에서 하위 리소스를 정의하는 방법을 보여 줍니다. 여기에는 스토리지 계정 내에 정의된 자식 리소스(파일 서비스)가 있는 스토리지 계정이 포함됩니다. 파일 서비스에는 내부에 정의된 하위 리소스(공유)도 있습니다.
resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
resource service 'fileServices' = {
name: 'default'
resource share 'shares' = {
name: 'exampleshare'
}
}
}
다음 예에서는 상위 리소스 외부에 하위 리소스를 정의하는 방법을 보여 줍니다. 부모 속성을 사용하여 부모/자식 관계를 식별합니다. 동일한 세 가지 리소스가 정의됩니다.
resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
resource service 'Microsoft.Storage/storageAccounts/fileServices@2023-04-01' = {
name: 'default'
parent: storage
}
resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
name: 'exampleshare'
parent: service
}
자세한 내용은 Bicep에서 자식 리소스에 대한 이름 및 형식 설정을 참조하세요.
모듈
모듈을 사용하면 Bicep 파일의 코드를 다른 Bicep 파일에서 재사용할 수 있습니다. 모듈 선언에서 재사용할 파일에 링크합니다. Bicep 파일을 배포하면 모듈의 리소스도 배포됩니다.
module webModule './webApp.bicep' = {
name: 'webDeploy'
params: {
skuName: 'S1'
location: location
}
}
기호화된 이름을 사용하면 파일의 다른 위치에서 모듈을 참조할 수 있습니다. 예를 들어 기호화된 이름 및 출력 값의 이름을 사용하여 모듈에서 출력 값을 가져올 수 있습니다.
각 모듈에 하나 이상의 데코레이터를 추가할 수 있습니다. 자세한 내용은 데코레이터 사용을 참조하세요.
자세한 내용은 Bicep 모듈을 참조하세요.
출력
출력을 사용하여 배포에서 값을 반환합니다. 일반적으로 다른 작업에 해당 값을 다시 사용해야 하는 경우 배포된 리소스에서 값을 반환합니다.
output storageEndpoint object = stg.properties.primaryEndpoints
각 출력에 대해 하나 이상의 데코레이터를 추가할 수 있습니다. 자세한 내용은 데코레이터 사용을 참조하세요.
자세한 내용은 Bicep의 출력을 참조하세요.
반복
Bicep 파일에 반복 루프를 추가하여 다음의 여러 복사본을 정의할 수 있습니다.
- resource
- 모듈(module)
- 변수
- 속성
- output
for
표현식을 사용하여 루프를 정의합니다.
param moduleCount int = 2
module stgModule './example.bicep' = [for i in range(0, moduleCount): {
name: '${i}deployModule'
params: {
}
}]
배열, 개체 또는 정수 인덱스를 반복할 수 있습니다.
자세한 내용은 Bicep의 반복 루프를 참조하세요.
조건부 배포
조건부로 배포된 Bicep 파일에 리소스 또는 모듈을 추가할 수 있습니다. 배포하는 동안 조건이 평가되고 결과에 따라 리소스 또는 모듈이 배포되는지 여부가 결정됩니다. if
표현식을 사용하여 조건부 배포를 정의합니다.
param deployZone bool
resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = if (deployZone) {
name: 'myZone'
location: 'global'
}
자세한 내용은 Bicep의 조건부 배포를 참조하세요.
공백
Bicep 파일을 작성할 때 공백과 탭은 무시됩니다.
Bicep은 줄 바꿈에 민감합니다. 예시:
resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' = if (newOrExisting == 'new') {
...
}
다음과 같이 작성할 수 없습니다.
resource sa 'Microsoft.Storage/storageAccounts@2023-04-01' =
if (newOrExisting == 'new') {
...
}
설명
한 줄 주석에는 //
를 사용하고 여러 줄 주석에는 /* ... */
를 사용합니다.
다음 예제는 한 줄 주석을 보여 줍니다.
// This is your primary NIC.
resource nic1 'Microsoft.Network/networkInterfaces@2023-11-01' = {
...
}
다음 예제는 다중 줄 주석을 보여 줍니다.
/*
This Bicep file assumes the key vault already exists and
is in same subscription and resource group as the deployment.
*/
param existingKeyVaultName string
다중 선 문자열
한 문자열을 여러 선으로 나눌 수 있습니다. 세 개의 작은따옴표 문자 '''
을 사용하여 다중 선 문자열을 시작하고 종료합니다.
다중 선 문자열 내의 문자는 있는 그대로 처리됩니다. 이스케이프 문자는 필요하지 않습니다. 다중 선 문자열에는 '''
을 포함할 수 없습니다. 현재 문자열 보간은 지원되지 않습니다.
'''
을 연 직후에 문자열을 시작하거나 새로운 선을 포함할 수 있습니다. 두 경우 모두 결과 문자열에는 새 선이 포함되지 않습니다. Bicep 파일의 선 끝에 따라 새 줄은 \r\n
또는 \n
로 해석됩니다.
다음 예제는 다중 선 문자열을 보여 줍니다.
var stringVar = '''
this is multi-line
string with formatting
preserved.
'''
이전 예제는 다음 JSON과 동일합니다.
"variables": {
"stringVar": "this is multi-line\r\n string with formatting\r\n preserved.\r\n"
}
여러 줄 선언
이제 함수, 배열 및 개체 선언에서 여러 줄을 사용할 수 있습니다. 이 기능을 사용하려면 Bicep CLI 버전 0.7.X 이상이 필요합니다.
다음 예제에서는 resourceGroup()
정의가 여러 줄로 구분됩니다.
var foo = resourceGroup(
mySubscription,
myRgName)
알려진 제한 사항
- 단일 apiProfile을 각 리소스 유형에 대해 설정된 apiVersion에 매핑하는 데 사용되는 apiProfile 개념을 지원하지 않습니다.
- 현재 사용자 정의 함수는 지원되지 않습니다. 그러나 실험 기능에는 현재 액세스할 수 있습니다. 자세한 내용은 Bicep의 사용자 정의 함수를 참조하세요.
- 일부 Bicep 기능을 사용하려면 중간 언어(Azure Resource Manager JSON 템플릿)에 대한 해당 변경이 필요합니다. 필요한 모든 업데이트가 전역 Azure에 배포되면 이러한 기능을 사용할 수 있음을 발표합니다. Azure Stack과 같은 다른 환경을 사용하는 경우 기능의 가용성이 지연될 수 있습니다. Bicep 기능은 해당 환경에서 중간 언어도 업데이트된 경우에만 사용할 수 있습니다.