JSON 및 Bicep의 템플릿 비교

이 문서에서는 Azure Resource Manager 템플릿(ARM 템플릿)에서 Bicep 구문과 JSON 구문을 비교합니다. 대부분의 경우 Bicep는 JSON의 경우 보다 자세한 정보가 적은 구문을 제공합니다.

JSON을 사용하여 ARM 템플릿을 개발하는 방법을 잘 알고 있는 경우, 다음 예제를 사용하여 Bicep의 해당 구문에 대해 알아보세요.

전체 파일 비교

Bicep 플레이그라운드를 사용하면 Bicep 및 이에 상응하는 JSON을 나란히 볼 수 있습니다. 동일한 인프라의 구현을 비교할 수 있습니다.

예를 들어 파일을 보고 SQL 서버 및 데이터베이스를 배포할 수 있습니다. Bicep는 ARM 템플릿의 절반 정도 크기입니다.

Screenshot of side by side templates

식 만들기:

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@2023-03-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-06-01",
    ...
  }
]

리소스를 조건부로 배포하기:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = if(deployVM) {
  ...
}
"resources": [
  {
    "condition": "[parameters('deployVM')]",
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2023-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@2022-11-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2022-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@2022-09-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은 값을 출력하지 않습니다.

코드 재사용

솔루션을 여러 파일로 분리하기:

다음 단계