if 식이 있는 Bicep의 조건부 배포

필요에 따라 Bicep에서 리소스 또는 모듈을 배포하려면 if 식을 사용합니다. if 식에는 true 또는 false로 확인되는 조건이 포함됩니다. if 조건이 true이면 리소스가 배포됩니다. 값이 false이면 리소스가 만들어지지 않습니다. 값은 전체 리소스 또는 모듈에만 적용할 수 있습니다.

참고 항목

조건부 배포는 하위 리소스로 연결되지 않습니다. 리소스 및 해당 자식 리소스를 조건부로 배포하려면 각 리소스 종류에 동일한 조건을 적용해야 합니다.

학습 리소스

단계별 참고 자료를 통해 조건에 대해 알아보려면 조건 및 루프를 사용하여 유연한 Bicep 템플릿 빌드를 참조하세요.

배포 조건 정의

Bicep에서는 리소스 배포 여부를 지정하는 매개 변수를 전달하여 조건부로 리소스를 배포할 수 있습니다. 리소스 선언의 if 식을 사용하여 조건을 테스트합니다. 다음 예제에서는 Bicep 파일의 if 식에 대한 구문을 보여 줍니다. DNS 영역을 조건부로 배포합니다. deployZonetrue이면 DNS 영역을 배포합니다. deployZonefalse이면 DNS 영역 배포를 건너뜁니다.

param deployZone bool

resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

다음 예제에서는 조건부로 모듈을 배포합니다.

param deployZone bool

module dnsZone 'dnszones.bicep' = if (deployZone) {
  name: 'myZoneModule'
}

조건은 종속성 선언에 사용할 수 있습니다. 명시적 종속성의 경우 리소스가 배포되지 않으면 Azure Resource Manager가 필수 종속성에서 해당 종속성을 자동으로 제거합니다. 암시적 종속성의 경우 조건부 리소스의 속성을 참조하는 것은 허용되지만 배포 오류가 발생할 수 있습니다.

신규 또는 기존 리소스

조건부 배포를 사용하여 새 리소스를 만들거나 기존 리소스를 사용할 수 있습니다. 다음 예에서는 새 스토리지 계정을 배포하거나 기존 스토리지 계정을 사용하는 방법을 보여 줍니다.

param storageAccountName string
param location string = resourceGroup().location

@allowed([
  'new'
  'existing'
])
param newOrExisting string = 'new'

resource saNew 'Microsoft.Storage/storageAccounts@2022-09-01' = if (newOrExisting == 'new') {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

resource saExisting 'Microsoft.Storage/storageAccounts@2022-09-01' existing = if (newOrExisting == 'existing') {
  name: storageAccountName
}

output storageAccountId string = ((newOrExisting == 'new') ? saNew.id : saExisting.id)

newOrExisting 매개 변수가 new로 설정되면 조건이 true로 평가됩니다. 스토리지 계정이 배포됩니다. 그렇지 않으면 기존 스토리지 계정이 사용됩니다.

Warning

배포되지 않은 조건부로 배포된 리소스를 참조하는 경우 리소스가 템플릿에 정의되지 않았다는 오류가 표시됩니다.

런타임 기능

조건부로 배포된 리소스와 함께 reference 또는 list 함수를 사용하는 경우 리소스가 배포되지 않은 경우에도 함수가 평가됩니다. 함수가 존재하지 않는 리소스를 참조하면 오류가 발생합니다.

조건식?: 연산자를 사용하여 리소스가 배포될 때 함수가 조건에 대해서만 평가되도록 합니다. 다음 예제 템플릿에서는 조건부로 유효한 식에서만 이 함수를 사용하는 방법을 보여 줍니다.

param vmName string
param location string
param logAnalytics string = ''

resource vmName_omsOnboarding 'Microsoft.Compute/virtualMachines/extensions@2023-03-01' = if (!empty(logAnalytics)) {
  name: '${vmName}/omsOnboarding'
  location: location
  properties: {
    publisher: 'Microsoft.EnterpriseCloud.Monitoring'
    type: 'MicrosoftMonitoringAgent'
    typeHandlerVersion: '1.0'
    autoUpgradeMinorVersion: true
    settings: {
      workspaceId: ((!empty(logAnalytics)) ? reference(logAnalytics, '2022-10-01').customerId : null)
    }
    protectedSettings: {
      workspaceKey: ((!empty(logAnalytics)) ? listKeys(logAnalytics, '2022-10-01').primarySharedKey : null)
    }
  }
}

output mgmtStatus string = ((!empty(logAnalytics)) ? 'Enabled monitoring for VM!' : 'Nothing to enable')

다음 단계