다음을 통해 공유


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

Bicep에서 사용자 정의 데이터 형식을 만드는 방법을 알아봅니다. 시스템 정의 데이터 형식에 대해서는 데이터 형식을 참조하세요.

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

구문

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

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

@allowed 데코레이터는 param에서만 허용됩니다. 미리 정의된 값 집합이 있는 type형식을 선언하려면 공용 구조체 형식 구문을 사용합니다.

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

  • 기호 참조는 앰비언트 형식(예 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
    }
    

    개체의 각 속성은 콜론 :으로 구분된 키와 값으로 구성됩니다. 키는 따옴표로 묶인 nonidentifier 값이 있는 모든 문자열일 수 있으며 값은 식의 모든 형식일 수 있습니다.

    속성 값 다음에 선택적 표식 ?이 없는 한 속성이 필요합니다. 예를 들어 다음 예제의 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 directions = 'east' | 'south' | 'west' | 'north'
    
    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@2023-04-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@2023-04-01' = {
  name: storageAccountConfig.name
  location: location
  sku: {
    name: storageAccountConfig.sku
  }
  kind: 'StorageV2'
}

오류 수준 상승

기본적으로 Bicep에서 개체 형식을 선언하면 모든 형식의 추가 속성을 허용할 수 있습니다. 예를 들어 다음 Bicep은 유효하지만 [BCP089]의 경고를 발생합니다. - The property "otionalProperty" is not allowed on objects of type "{ property: string, optionalProperty: null | string }". Did you mean "optionalProperty"?:

type anObject = {
  property: string
  optionalProperty: string?
}
 
param aParameter anObject = {
  property: 'value'
  otionalProperty: 'value'
}

경고는 anObject 형식에 otionalProperty라는 속성이 포함되지 않음을 알려줍니다. 배포 중에 오류가 발생하지 않지만 Bicep 컴파일러는 otionalProperty가 오타라고 가정하고 optionalProperty를 사용하려고 했지만 철자가 틀렸으며 불일치를 경고합니다.

이러한 경고를 오류로 에스컬레이션하려면 데코레이터를 @sealed() 개체 유형에 적용합니다.

@sealed() 
type anObject = {
  property: string
  optionalProperty?: string
}

선언에 데코레이터를 적용하여 @sealed() 동일한 결과를 얻습니다 param .

type anObject = {
  property: string
  optionalProperty: string?
}
 
@sealed() 
param aParameter anObject = {
  property: 'value'
  otionalProperty: 'value'
}

ARM 배포 엔진은 또한 봉인된 형식에서 추가 속성을 확인합니다. 봉인된 매개 변수에 대한 추가 속성을 제공하면 유효성 검사 오류가 발생하여 배포가 실패합니다. 예시:

@sealed()
type anObject = {
  property: string
}

param aParameter anObject = {
  property: 'value'
  optionalProperty: 'value'
}

태그가 지정된 공용 구조체 데이터 형식

Bicep 파일 내에서 사용자 지정 태그가 지정된 공용 구조체 데이터 형식을 선언하려면 데코레이터를 discriminator 사용자 정의 형식 선언 위에 배치할 수 있습니다. 이 데코레이터를 사용하려면 Bicep CLI 버전 0.21.X 이상이 필요합니다. 다음 예에서는 태그가 지정된 공용 구조체 데이터 형식을 선언하는 방법을 보여 줍니다.

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

자세한 내용은 사용자 지정 태그가 지정된 공용 구조체 데이터 형식을 참조하세요.

Bicep 파일 간 가져오기 형식

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

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

@export()
type myStringType = string

@export()
type myOtherStringType = myStringType

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

다음 단계