JSON 및 Bicep의 템플릿 비교
이 문서에서는 Azure Resource Manager 템플릿(ARM 템플릿)에서 Bicep 구문과 JSON 구문을 비교합니다. 대부분의 경우 Bicep는 JSON의 경우 보다 자세한 정보가 적은 구문을 제공합니다.
JSON을 사용하여 ARM 템플릿을 개발하는 방법을 잘 알고 있는 경우, 다음 예제를 사용하여 Bicep의 해당 구문에 대해 알아보세요.
전체 파일 비교
Bicep 플레이그라운드를 사용하면 Bicep 및 이에 상응하는 JSON을 나란히 볼 수 있습니다. 동일한 인프라의 구현을 비교할 수 있습니다.
예를 들어 파일을 보고 SQL 서버 및 데이터베이스를 배포할 수 있습니다. Bicep는 ARM 템플릿의 절반 정도 크기입니다.
식
식 만들기:
func()
"[func()]"
매개 변수
기본값으로 매개 변수를 선언하기:
param orgName string = 'Contoso'
"parameters": {
"orgName": {
"type": "string",
"defaultValue": "Contoso"
}
}
매개 변수 값을 가져오려면 정의한 이름을 사용합니다.
name: orgName
"name": "[parameters('orgName')]"
variables
변수를 선언하기:
var description = 'example value'
"variables": {
"description": "example value"
}
변수 값을 가져오려면 정의한 이름을 사용합니다.
workloadSetting: description
"workloadSetting": "[variables('description')]"
문자열
문자열 연결하기:
name: '${namePrefix}-vm'
"name": "[concat(parameters('namePrefix'), '-vm')]"
논리 연산자
논리적 AND를 반환하기:
isMonday && isNovember
[and(parameter('isMonday'), parameter('isNovember'))]
조건에 따라 값을 설정하기:
isMonday ? 'valueIfTrue' : 'valueIfFalse'
[if(parameters('isMonday'), 'valueIfTrue', 'valueIfFalse')]
배포 범위
배포의 대상 범위를 설정하기:
targetScope = 'subscription'
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#"
리소스
리소스를 선언하기:
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-03-01' = {
...
}
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-03-01",
...
}
]
리소스를 조건부로 배포하기:
resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-03-01' = if(deployVM) {
...
}
"resources": [
{
"condition": "[parameters('deployVM')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2024-03-01",
...
}
]
리소스 속성 설정하기:
sku: '2016-Datacenter'
"sku": "2016-Datacenter",
템플릿에서 리소스의 리소스 ID 가져오기:
nic1.id
[resourceId('Microsoft.Network/networkInterfaces', variables('nic1Name'))]
반복
배열이나 개수의 항목을 반복하기:
[for storageName in storageAccountNames: {
...
}]
"copy": {
"name": "storagecopy",
"count": "[length(parameters('storageAccountNames'))]"
},
...
리소스 종속성
Bicep의 경우 명시적 종속성을 설정할 수 있지만 이 방법은 권장되지 않습니다. 대신 암시적 종속성을 사용하세요. 암시적 종속성은 한 리소스 선언이 다른 리소스 선언의 식별자를 참조할 때 만들어집니다.
다음은 네트워크 보안 그룹에 대한 암시적 종속성이 있는 네트워크 인터페이스를 보여 줍니다. netSecurityGroup.id
를 사용하여 네트워크 보안 그룹을 참조합니다.
resource netSecurityGroup 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
...
}
resource nic1 'Microsoft.Network/networkInterfaces@2023-11-01' = {
name: nic1Name
location: location
properties: {
...
networkSecurityGroup: {
id: netSecurityGroup.id
}
}
}
명시적 의존성을 설정해야 하는 경우 다음을 사용합니다.
dependsOn: [ storageAccount ]
"dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', 'parameters('storageAccountName'))]"]
참조 리소스
템플릿의 리소스에서 속성을 가져오기:
storageAccount.properties.primaryEndpoints.blob
[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]
템플릿에 배포되지 않은 기존 리소스에서 속성을 가져오기:
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' existing = {
name: storageAccountName
}
// use later in template as often as needed
storageAccount.properties.primaryEndpoints.blob
// required every time the property is needed
"[reference(resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName')), '2019-06-01').primaryEndpoints.blob]"
Bicep에서 중첩된 접근자(::
)를 사용하여 부모 리소스 내에 중첩된 리소스의 속성을 가져옵니다.
VNet1::Subnet1.properties.addressPrefix
JSON의 경우 참조 함수를 사용합니다.
[reference(resourceId('Microsoft.Network/virtualNetworks/subnets', variables('subnetName'))).properties.addressPrefix]
출력
템플릿의 리소스에서 속성을 출력하기:
output hostname string = publicIP.properties.dnsSettings.fqdn
"outputs": {
"hostname": {
"type": "string",
"value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
},
}
조건부로 값을 출력하려면:
output hostname string = condition ? publicIP.properties.dnsSettings.fqdn : ''
"outputs": {
"hostname": {
"condition": "[variables('condition')]",
"type": "string",
"value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
}
}
Bicep 3항 연산자는 조건 속성이 아니라 ARM 템플릿 JSON의 if 함수와 동일합니다. 3항 구문은 한 값 또는 다른 값으로 평가되어야 합니다. 이전 샘플에서 조건이 false이면 Bicep은 빈 문자열이 있는 호스트 이름을 출력하지만 JSON은 값을 출력하지 않습니다.
코드 재사용
솔루션을 여러 파일로 분리하기:
다음 단계
- Bicep에 대한 자세한 내용은 Bicep 빠른 시작을 참조하세요.
- 언어 간 템플릿 변환에 대한 자세한 내용은 JSON과 Bicep 간에 ARM 템플릿 변환을 참조하세요.