다음을 통해 공유


템플릿에 대한 JSON 및 Bicep 비교

이 문서에서는 ARM 템플릿(Azure Resource Manager 템플릿)에 대한 JSON 구문과 Bicep 구문을 비교합니다. 대부분의 경우 Bicep은 JSON에 비해 덜 장황한 구문을 제공합니다.

JSON을 사용하여 ARM 템플릿을 개발하는 데 익숙한 경우 다음 예제를 사용하여 Bicep에 해당하는 구문에 대해 알아봅니다.

전체 파일 비교

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

예를 들어 SQL Server 및 데이터베이스를 배포하는 파일을 볼 수 있습니다. Bicep은 ARM 템플릿의 약 절반 크기입니다.

나란히 배치된 템플릿 스크린샷

표현식

식을 작성하려면 다음을 수행합니다.

func()
"[func()]"

매개 변수

기본값으로 매개 변수를 선언하려면 다음을 수행합니다.

param orgName string = 'Contoso'
"parameters": {
  "orgName": {
    "type": "string",
    "defaultValue": "Contoso"
  }
}

매개 변수 값을 얻으려면 정의한 이름을 사용합니다.

name: orgName
"name": "[parameters('orgName')]"

변수

변수를 선언하려면 다음을 수행합니다.

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@2024-05-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2024-05-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@2024-01-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 3nary 연산자는 조건 속성이 아니라 ARM 템플릿 JSON의 if 함수 와 동일합니다. 삼항 구문은 한 값 또는 다른 값으로 평가해야 합니다. 이전 샘플에서 조건이 false이면 Bicep은 빈 문자열이 있는 호스트 이름을 출력하지만 JSON은 값을 출력하지 않습니다.

코드 재사용

솔루션을 여러 파일로 분리하려면 다음을 수행합니다.

다음 단계