Bicep 파일의 구조 및 구문 이해

이 문서에서는 Bicep 파일의 구조와 구문에 대해 설명합니다. 여기서는 파일의 다른 섹션 및 해당 섹션에서 사용할 수 있는 속성을 보여 줍니다.

Bicep 파일을 만드는 과정을 안내하는 단계별 자습서는 빠른 시작: Visual Studio Code를 사용하여 Bicep 파일 만들기를 참조하세요.

Bicep 형식

Bicep은 선언적 언어이므로 요소가 임의의 순서로 표시될 수 있습니다. 명령적 언어와 달리 요소의 순서는 배포가 처리되는 방식에 영향을 주지 않습니다.

Bicep 파일은 다음과 같은 요소로 구성되어 있습니다.

metadata <metadata-name> = ANY

targetScope = '<scope>'

type <user-defined-data-type-name> = <type-expression>

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>

var <variable-name> = <variable-value>

resource <resource-symbolic-name> '<resource-type>@<api-version>' = {
  <resource-properties>
}

module <module-symbolic-name> '<path-to-file>' = {
  name: '<linked-deployment-name>'
  params: {
    <parameter-names-and-values>
  }
}

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@2022-09-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 파일에서 대상 범위를 설정하지 않아도 됩니다.

허용되는 값은 다음과 같습니다.

모듈에서 Bicep 파일의 나머지 부분에 대한 범위와 다른 범위를 지정할 수 있습니다. 자세한 내용은 모듈 범위 구성을 참조하세요.

유형

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@2022-09-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')

자세한 내용은 사용자 정의 함수를 참조하세요.

매개 변수

배포마다 달라져야 하는 값에 대한 매개 변수를 사용합니다. 배포 중에 값이 제공되지 않은 경우 사용되는 매개 변수의 기본값을 정의할 수 있습니다.

예를 들어 SKU 매개 변수를 추가하여 리소스에 대해 다양한 크기를 지정할 수 있습니다. 테스트에 배포하는지 프로덕션에 배포하는지에 따라 다른 값을 전달할 수 있습니다.

param storageSKU string = 'Standard_LRS'

매개 변수는 Bicep 파일에서 사용할 수 있습니다.

sku: {
  name: storageSKU
}

자세한 내용은 Bicep의 매개 변수를 참조하세요.

매개 변수 데코레이터

각 매개 변수에 대해 하나 이상의 데코레이터를 추가할 수 있습니다. 이러한 데코레이터는 매개 변수를 설명하고 전달되는 값에 대한 제약 조건을 정의합니다. 다음 예는 한 데코레이터를 보여 주지만 이 외에도 다양한 데코레이더를 사용할 수 있습니다.

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_ZRS'
  'Premium_LRS'
])
param storageSKU string = 'Standard_LRS'

사용 가능한 모든 데코레이터에 대한 설명을 비롯한 자세한 내용은 데코레이터를 참조하세요.

variables

복잡한 표현식을 변수에 캡슐화하여 Bicep 파일을 더 읽기 쉽게 만들 수 있습니다. 예를 들어 여러 값을 결합하여 구성된 리소스 이름에 대한 변수를 추가할 수 있습니다.

var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'

복잡한 표현식이 필요할 때마다 이 변수를 적용합니다.

resource stg 'Microsoft.Storage/storageAccounts@2019-04-01' = {
  name: uniqueStorageName

자세한 내용은 의 변수를 참조하세요.

리소스

resource 키워드를 사용하여 배포할 리소스를 정의합니다. 리소스 선언에는 해당 리소스에 대한 기호화된 이름이 포함됩니다. Bicep 파일의 다른 부분에서 이 기호 이름을 사용하여 리소스에서 값을 가져오세요.

리소스 선언에는 리소스 종류 및 API 버전이 포함됩니다. 리소스 선언의 본문 내에 리소스 종류와 관련된 속성을 포함합니다.

resource stg 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageSKU
  }
  kind: 'StorageV2'
  properties: {
    supportsHttpsTrafficOnly: true
  }
}

자세한 내용은 Bicep의 리소스 선언을 참조하세요.

일부 리소스에는 상위/하위 관계가 있습니다. 상위 리소스 내부 또는 외부에서 하위 리소스를 정의할 수 있습니다.

다음 예는 상위 리소스 내에서 하위 리소스를 정의하는 방법을 보여 줍니다. 여기에는 스토리지 계정 내에 정의된 자식 리소스(파일 서비스)가 있는 스토리지 계정이 포함됩니다. 파일 서비스에는 내부에 정의된 하위 리소스(공유)도 있습니다.

resource storage 'Microsoft.Storage/storageAccounts@2022-09-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@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2022-09-01' = {
  name: 'default'
  parent: storage
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2022-09-01' = {
  name: 'exampleshare'
  parent: service
}

자세한 내용은 Bicep에서 자식 리소스에 대한 이름 및 형식 설정을 참조하세요.

모듈

모듈을 사용하면 Bicep 파일의 코드를 다른 Bicep 파일에서 재사용할 수 있습니다. 모듈 선언에서 재사용할 파일에 링크합니다. Bicep 파일을 배포하면 모듈의 리소스도 배포됩니다.

module webModule './webApp.bicep' = {
  name: 'webDeploy'
  params: {
    skuName: 'S1'
    location: location
  }
}

기호화된 이름을 사용하면 파일의 다른 위치에서 모듈을 참조할 수 있습니다. 예를 들어 기호화된 이름 및 출력 값의 이름을 사용하여 모듈에서 출력 값을 가져올 수 있습니다.

자세한 내용은 Bicep 모듈을 참조하세요.

리소스 및 모듈 데코레이터

리소스 또는 모듈 정의에 데코레이터를 추가할 수 있습니다. 지원되는 데코레이터는 batchSize(int)description입니다. for 식을 사용하는 리소스 또는 모듈 정의에만 적용할 수 있습니다.

기본적으로 리소스는 병렬로 배포됩니다. batchSize(int) 데코레이터를 추가하는 경우 인스턴스를 순차적으로 배포합니다.

@batchSize(3)
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2019-06-01' = [for storageName in storageAccounts: {
  ...
}]

자세한 내용은 일괄 처리로 배포를 참조하세요.

출력

출력을 사용하여 배포에서 값을 반환합니다. 일반적으로 다른 작업에 해당 값을 다시 사용해야 하는 경우 배포된 리소스에서 값을 반환합니다.

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@2018-05-01' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

자세한 내용은 Bicep의 조건부 배포를 참조하세요.

공백

Bicep 파일을 작성할 때 공백과 탭은 무시됩니다.

Bicep은 줄 바꿈에 민감합니다. 예시:

resource sa 'Microsoft.Storage/storageAccounts@2019-06-01' = if (newOrExisting == 'new') {
  ...
}

다음과 같이 작성할 수 없습니다.

resource sa 'Microsoft.Storage/storageAccounts@2019-06-01' =
    if (newOrExisting == 'new') {
      ...
    }

여러 줄에 개체배열을 정의합니다.

설명

한 줄 주석에는 //를 사용하고 여러 줄 주석에는 /* ... */를 사용합니다.

다음 예제는 한 줄 주석을 보여 줍니다.

// This is your primary NIC.
resource nic1 'Microsoft.Network/networkInterfaces@2020-06-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 기능은 해당 환경에서 중간 언어도 업데이트된 경우에만 사용할 수 있습니다.

다음 단계

Bicep에 대한 소개는 Bicep이란?을 참조하세요. Bicep 데이터 형식은 데이터 형식을 참조하세요.