Share via


Bicep의 사용자 정의 데이터 형식

Bicep에서 사용자 정의 데이터 형식을 사용하는 방법을 알아봅니다.

이 기능을 사용하려면 Bicep CLI 버전 0.12.X 이상이 필요합니다.

사용자 정의 데이터 형식 구문

type 문을 사용하여 사용자 정의 데이터 형식을 정의할 수 있습니다. 또한 일부 위치에서 형식 식을 사용하여 사용자 지정 형식을 정의할 수도 있습니다.

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

참고 항목

@allowed 데코레이터param에서만 허용됩니다. 속성이 type 또는 output 문의 미리 정의된 값 집합 중 하나여야 한다고 선언하려면 공용 구조체 형식 구문을 사용합니다. 공용 구조체 형식 구문은 param을 사용할 수도 있습니다.

유효한 형식 식은 다음과 같습니다.

  • 기호 참조는 앰비언트 형식(예 string 또는 int) 또는 type 문에 선언된 사용자 정의 형식 기호를 참조하는 식별자입니다.

    // Bicep data type reference
    type myStringType = string
    
    // user-defined type reference
    type myOtherStringType = myStringType
    
  • 문자열, 정수 및 부울을 포함한 기본 리터럴은 유효한 형식 식입니다. 예시:

    // a string type with three allowed values.
    type myStringLiteralType = 'bicep' | 'arm' | 'azure'
    
    // an integer type with one allowed value
    type myIntLiteralType = 10
    
    // an boolean type with one allowed value
    type myBoolLiteralType = true
    
  • 배열 형식은 유효한 형식 식에 [] 접미사를 사용하여 선언할 수 있습니다.

    // A string type array
    type myStrStringsType1 = string[]
    // A string type array with three allowed values
    type myStrStringsType2 = ('a' | 'b' | 'c')[]
    
    type myIntArrayOfArraysType = int[][]
    
    // A mixed-type array with four allowed values
    type myMixedTypeArrayType = ('fizz' | 42 | {an: 'object'} | null)[]
    
  • 개체 형식은 중괄호 사이에 0개 이상의 속성을 포함합니다.

    type storageAccountConfigType = {
      name: string
      sku: string
    }
    

    개체의 각 속성은 키와 값으로 구성됩니다. 키와 값은 콜론(:)으로 구분합니다. 키는 모든 문자열(유효한 식별자가 아닌 값은 따옴표로 묶어야 합니다)일 수 있으며 값은 모든 형식 구문 식일 수 있습니다.

    속성 값 다음에 선택적 표식 ?이 없는 한 속성이 필요합니다. 예를 들어 다음 예제의 sku 속성은 선택 사항입니다.

    type storageAccountConfigType = {
      name: string
      sku: string?
    }
    

    데코레이터는 속성에 사용할 수 있습니다. *은(는) 모든 값에 상수가 필요하도록 할 때 사용할 수 있습니다. *을(를) 사용하는 경우에도 추가 속성을 정의할 수 있습니다. 이 예제에서는 id이라는 형식의 int 키가 필요하고 개체의 다른 모든 항목은 10자 이상의 문자열 값이어야 하는 개체를 생성합니다.

    type obj = {
      @description('The object ID')
      id: int
    
      @description('Additional properties')
      @minLength(10)
      *: string
    }
    

    다음 샘플에서는 공용 구조체 형식 구문을 사용하여 미리 정의된 값 집합을 나열하는 방법을 보여 줍니다.

    type obj = {
      level: 'bronze' | 'silver' | 'gold'
    }
    

    재귀

    개체 형식은 재귀 지점에 대한 경로의 레그가 선택 사항인 한 직접 또는 간접 재귀를 사용할 수 있습니다. 예를 들어 직접 재귀 recursiveProp 속성은 선택 사항이므로 다음 예제의 myObjectType 정의는 유효합니다.

    type myObjectType = {
      stringProp: string
      recursiveProp: myObjectType?
    }
    

    그러나 level1, level2, level3, level4 또는 level5 중 어느 것도 선택 사항이 아니므로 다음 형식 정의는 유효하지 않습니다.

    type invalidRecursiveObjectType = {
      level1: {
        level2: {
          level3: {
            level4: {
              level5: invalidRecursiveObjectType
            }
          }
        }
      }
    }
    
  • Bicep 단항 연산 자는 정수 및 부울 리터럴 또는 정수 또는 부울 리터럴 형식 기호에 대한 참조와 함께 사용할 수 있습니다.

    type negativeIntLiteral = -10
    type negatedIntReference = -negativeIntLiteral
    
    type negatedBoolLiteral = !true
    type negatedBoolReference = !negatedBoolLiteral
    
  • 공용 구조체에는 여러 리터럴 형식 식이 포함될 수 있습니다. 공용 구조체 형식은 Bicep에서 허용된 값 제약 조건으로 변환되므로 리터럴만 멤버로 허용됩니다.

    type oneOfSeveralObjects = {foo: 'bar'} | {fizz: 'buzz'} | {snap: 'crackle'}
    type mixedTypeArray = ('fizz' | 42 | {an: 'object'} | null)[]
    

type 문에 사용되는 것 외에도 사용자 정의 데이터 형식을 만들기 위해 이러한 위치에서 형식 식을 사용할 수도 있습니다.

  • param 문의 형식 절에 사용할 경우. 예시:

    param storageAccountConfig {
      name: string
      sku: string
    }
    
  • 개체 형식 속성에서 : 뒤에 옵니다. 예시:

    param storageAccountConfig {
     name: string
      properties: {
        sku: string
      }
    } = {
      name: 'store$(uniqueString(resourceGroup().id)))'
      properties: {
        sku: 'Standard_LRS'
      }
    }
    
  • 배열 형식 식의 [] 앞에 옵니다. 예시:

    param mixedTypeArray ('fizz' | 42 | {an: 'object'} | null)[]
    

스토리지 계정을 만드는 일반적인 Bicep 파일은 다음과 같습니다.

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

@allowed([
  'Standard_LRS'
  'Standard_GRS'
])
param storageAccountSKU string = 'Standard_LRS'

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSKU
  }
  kind: 'StorageV2'
}

사용자 정의 데이터 형식을 사용하면 다음과 같이 보일 수 있습니다.

param location string = resourceGroup().location

type storageAccountSkuType = 'Standard_LRS' | 'Standard_GRS'

type storageAccountConfigType = {
  name: string
  sku: storageAccountSkuType
}

param storageAccountConfig storageAccountConfigType

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountConfig.name
  location: location
  sku: {
    name: storageAccountConfig.sku
  }
  kind: 'StorageV2'
}

태그가 지정된 공용 구조체 형식 선언

Bicep 파일 내에서 사용자 지정 태그가 지정된 공용 구조체 데이터 형식을 선언하려면 사용자 정의 형식 선언 위에 판별자 데코레이터를 배치할 수 있습니다. 이 데코레이터를 사용하려면 Bicep CLI 버전 0.21.X 이상이 필요합니다. 구문은 다음과 같습니다.

@discriminator('<propertyName>')

판별자 데코레이터는 모든 공용 구조체 구성원 간의 공유 속성 이름을 나타내는 단일 매개 변수를 사용합니다. 이 속성 이름은 모든 구성원에서 필수 문자열 리터럴이어야 하며 대/소문자를 구분합니다. 공용 구조체 구성원의 구분된 속성 값은 대/소문자를 구분하지 않는 방식으로 고유해야 합니다.

다음 예제는 태그가 지정된 공용 구조체 형식을 선언하는 방법을 보여줍니다.

type FooConfig = {
  type: 'foo'
  value: int
}

type BarConfig = {
  type: 'bar'
  value: bool
}

@discriminator('type')
type ServiceConfig = FooConfig | BarConfig | { type: 'baz', *: string }

param serviceConfig ServiceConfig = { type: 'bar', value: true }

output config object = serviceConfig

매개 변수 값은 구분된 속성 값에 따라 유효성이 검사됩니다. 위의 예제에서 serviceConfig 매개 변수 값이 foo 형식인 경우 FooConfig 형식을 사용하여 유효성 검사를 수행합니다. 마찬가지로 매개 변수 값이 bar 형식인 경우 BarConfig 형식을 사용하여 유효성 검사가 수행되고 다른 형식에도 이 패턴이 계속됩니다.

Bicep 파일 간에 형식 가져오기(미리 보기)

이 컴파일 시간 가져오기 기능을 사용하려면Bicep CLI 버전 0.21.X 이상이 필요합니다. compileTimeImports 실험 플래그는 Bicep 구성 파일에서 사용하도록 설정해야 합니다.

@export() 데코레이터를 포함하는 사용자 정의 데이터 형식만 다른 템플릿으로 가져올 수 있습니다. 현재 이 데코레이터는 type 문에서만 사용할 수 있습니다.

다음 예제를 사용하면 서로 다른 템플릿에서 두 개의 사용자 정의 데이터 형식을 가져올 수 있습니다.

@export()
type myStringType = string

@export()
type myOtherStringType = myStringType

자세한 내용은 사용자 정의 데이터 형식 가져오기를 참조하세요.

다음 단계