この記事では、Bicep 構文と Azure Resource Manager テンプレート (ARM テンプレート) の JSON 構文を比較します。 ほとんどの場合、Bicep は JSON の同等の構文よりも簡潔な構文を提供します。
JSON を使用して ARM テンプレートを開発する方法に慣れている場合は、次の例を使用して、Bicep の同等の構文について学習します。
完全なファイルを比較する
Bicep Playground を使用すると、Bicep と同等の JSON を並べて表示できます。 同じインフラストラクチャの実装を比較できます。
たとえば、 SQL サーバーとデータベースをデプロイするファイルを表示できます。 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 三項演算子は、条件プロパティではなく、ARM テンプレート JSON の if 関数 と同等です。 三項構文は、どちらかの値に評価される必要があります。 前のサンプルで条件が false の場合、Bicep は空の文字列を含むホスト名を出力しますが、JSON は値を出力しません。
コードの再利用
ソリューションを複数のファイルに分割するには:
- Bicep の場合は、 モジュールを使用します。
- ARM テンプレートの場合は、 リンクされたテンプレートを使用します。
次のステップ
- Bicep の詳細については、Bicep のクイックスタートを参照してください。
- 言語間でのテンプレートの変換については、 JSON と Bicep の間での ARM テンプレートの変換に関するページを参照してください。