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
자세한 내용은 사용자 정의 데이터 형식 가져오기를 참조하세요.
다음 단계
- Bicep 데이터 형식 목록은 데이터 형식을 참조하세요.