조건부로 리소스 배포

완료됨

Bicep 코드에서 조건을 사용하여 특정 제약 조건이 있는 경우에만 리소스를 배포할 수 있습니다.

장난감 회사에서 다양한 환경에 리소스를 배포해야 하는 경우를 예를 들어 봅시다. 프로덕션 환경에 배포할 때 Azure SQL 논리 서버에 대한 감사를 활성화해야 할 필요가 있습니다. 그러나 개발 환경에 리소스를 배포할 때는 감사를 활성화하지 않으려고 합니다. 단일 템플릿을 사용하여 모든 환경에 리소스를 배포하려고 합니다.

이 단원에서는 조건부로 리소스를 배포하는 방법을 알아봅니다.

기본 조건 사용

Bicep에서 리소스를 배포할 때 if 키워드를 사용하고 그 뒤에 조건을 제공할 수 있습니다. 조건은 부울(true 또는 false) 값으로 확인되어야 합니다. 값이 true이면 리소스가 배포됩니다. 값이 false이면 리소스가 배포되지 않습니다.

제공하는 매개 변수 값을 기반으로 조건을 만드는 것이 일반적입니다. 예를 들어 다음 코드는 deployStorageAccount 매개 변수가 true로 설정된 경우에만 스토리지 계정을 배포합니다.

param deployStorageAccount bool

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (deployStorageAccount) {
  name: 'teddybearstorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  // ...
}

if 키워드는 리소스 정의와 동일한 줄에 있습니다.

조건으로 식 사용

이전 예제는 매우 기본적이었습니다. deployStorageAccount 매개 변수는 bool 형식이므로 값이 true인지 아니면 false인지 명확합니다.

Bicep에서는 조건에 식도 포함할 수 있습니다. 다음 예제에서 코드는 environmentName 매개 변수 값이 Production인 경우에만 SQL 감사 리소스를 배포합니다.

@allowed([
  'Development'
  'Production'
])
param environmentName string

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (environmentName == 'Production') {
  parent: server
  name: 'default'
  properties: {
  }
}

일반적으로 조건으로 사용하는 식에 대한 변수를 만드는 것이 좋습니다. 이렇게 하면 템플릿을 더 쉽게 이해하고 읽을 수 있습니다. 예를 들면 다음과 같습니다.

@allowed([
  'Development'
  'Production'
])
param environmentName string

var auditingEnabled = environmentName == 'Production'

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

조건부로 배포된 리소스에 종속

리소스를 조건부로 배포할 때 Bicep이 리소스 간의 종속성을 평가하는 방법을 알고 있어야 하는 경우가 있습니다.

SQL 감사 설정을 배포하는 몇 가지 Bicep 코드를 계속 작성해 보겠습니다. 또한 Bicep 파일은 다음과 같이 스토리지 계정 리소스를 선언해야 합니다.

@allowed([
  'Development'
  'Production'
])
param environmentName string
param location string = resourceGroup().location
param auditStorageAccountName string = 'bearaudit${uniqueString(resourceGroup().id)}'

var auditingEnabled = environmentName == 'Production'
var storageAccountSkuName = 'Standard_LRS'

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
}

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

스토리지 계정에도 조건이 있습니다. 즉, 비프로덕션 환경용으로 배포되지 않습니다. 이제 SQL 감사 설정 리소스가 스토리지 계정 세부 정보를 참조할 수 있습니다.

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

이 Bicep 코드는 storageEndpointstorageAccountAccessKey 속성 내에서 물음표(?) 연산자를 사용합니다. Bicep 코드가 프로덕션 환경에 배포될 때는 식이 스토리지 계정의 세부 정보로 계산됩니다. 코드가 비 프로덕션 환경에 배포될 때는 식이 빈 문자열('')로 계산됩니다.

auditingSettingsauditStorageAccount는 동일한 조건을 가지기 때문에 스토리지 계정 없이 SQL 감사 설정 리소스를 배포할 필요가 없으므로 이 코드가 필요한 이유가 궁금할 수 있습니다. 이는 사실이지만 Azure Resource Manager는 리소스의 조건 이전에 속성 식을 평가합니다. 이는 Bicep 코드에 이 식이 없으면 ResourceNotFound 오류로 배포가 실패함을 의미합니다.

참고 항목

동일한 Bicep 파일에서 동일한 이름의 두 리소스를 정의한 다음, 조건부로 하나만 배포할 수 없습니다. 이를 Resource Manager에서 충돌로 간주하기 때문에 배포가 실패합니다.

배포 조건이 동일한 여러 리소스가 있는 경우 Bicep 모듈을 사용해 봅니다. 모든 리소스를 배포하는 모듈을 만든 다음, 기본 Bicep 파일의 모듈 선언에 조건을 배치할 수 있습니다.