Bicep ファイル内の共有値の繰り返しを減らします。 代わりに、Bicep ファイル内の共有 JSON ファイルからこれらの値を読み込みます。 配列を使用する場合は、共有値を Bicep コード内のデプロイ固有の値と連結します。
コンテキストと問題
Bicep コードを記述するときに、一連の Bicep ファイルで再利用する共通変数が存在する場合があります。 Bicep ファイル間で値をコピーして貼り付けるなど、リソースを宣言するたびに値を複製できます。 ただし、この方法はエラーが発生しやすく、変更を加える必要がある場合は、各リソース定義を更新して他のリソース定義と同期する必要があります。
さらに、配列として定義された変数を使用する場合は、複数の Bicep ファイルに共通の値のセットがあり、デプロイするリソースの特定の値を追加する必要があります。 共有変数とリソース固有の変数を混在させると、変数の 2 つのカテゴリの違いを誰かが理解するのが難しくなります。
解決策
共有する必要がある変数を含む JSON ファイルを作成します。
loadJsonContent()
関数を使用してファイルを読み込み、変数にアクセスします。 配列変数の場合は、 concat()
関数 を使用して、共有値を特定のリソースの任意のカスタム値と結合します。
例 1: プレフィックスの名前付け
リソースを定義する複数の Bicep ファイルがあるとします。 すべてのリソースに一貫した名前付けプレフィックスを使用する必要があります。
会社全体に適用される一般的な名前付けプレフィックスを含む JSON ファイルを定義します。
{
"storageAccountPrefix": "stg",
"appServicePrefix": "app"
}
Bicep ファイルで、共有の名前付けプレフィックスをインポートする変数を宣言します。
var sharedNamePrefixes = loadJsonContent('./shared-prefixes.json')
リソース名を定義するときは、文字列補間を使用して、共有名プレフィックスと一意の名前サフィックスを連結します。
var appServiceAppName = '${sharedNamePrefixes.appServicePrefix}-myapp-${uniqueString(resourceGroup().id)}'
var storageAccountName = '${sharedNamePrefixes.storageAccountPrefix}myapp${uniqueString(resourceGroup().id)}'
例 2: ネットワーク セキュリティ グループの規則
独自のネットワーク セキュリティ グループ (NSG) を定義する複数の Bicep ファイルがあるとします。 各 NSG に適用する必要がある一般的なセキュリティ規則のセットがあり、追加する必要があるアプリケーション固有の規則があります。
会社全体に適用される一般的なセキュリティ規則を含む JSON ファイルを定義します。
{
"securityRules": [
{
"name": "Allow_RDP_from_company_IP_address",
"properties": {
"description": "Allow inbound RDP from the company's IP address range.",
"protocol": "Tcp",
"sourceAddressPrefix": "203.0.113.0/24",
"sourcePortRange": "*",
"destinationAddressPrefix": "VirtualNetwork",
"destinationPortRange": "3389",
"access": "Allow",
"priority": 100,
"direction": "Inbound"
}
},
{
"name": "Allow_VirtualNetwork_to_Storage",
"properties": {
"description": "Allow outbound connections to the Azure Storage service tag.",
"protocol": "Tcp",
"sourceAddressPrefix": "VirtualNetwork",
"sourcePortRange": "*",
"destinationAddressPrefix": "Storage",
"destinationPortRange": "*",
"access": "Allow",
"priority": 100,
"direction": "Outbound"
}
}
// other rules here
]
}
Bicep ファイルで、共有セキュリティ規則をインポートする変数を宣言します。
var sharedRules = loadJsonContent('./shared-rules.json', 'securityRules')
この特定の NSG のカスタム 規則を表す変数配列を作成します。
var customRules = [
{
name: 'Allow_Internet_HTTPS_Inbound'
properties: {
description: 'Allow inbound internet connectivity for HTTPS only.'
protocol: 'Tcp'
sourcePortRange: '*'
destinationPortRange: '443'
sourceAddressPrefix: 'Internet'
destinationAddressPrefix: 'VirtualNetwork'
access: 'Allow'
priority: 400
direction: 'Inbound'
}
}
]
NSG リソースを定義します。
concat()
関数を使用して、2 つの配列を結合し、securityRules
プロパティを設定します。
resource nsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = {
name: nsgName
location: location
properties: {
securityRules: concat(sharedRules, customRules)
}
}
考慮事項
- この方法を使用すると、Bicep によって生成された ARM テンプレート内に JSON ファイルが含まれます。 Bicep によって生成される JSON ARM テンプレートのファイル制限は 4 MB であるため、大きな共有変数ファイルを使用しないようにすることが重要です。
- 共有変数配列が、各 Bicep ファイルで指定された配列値と競合しないようにします。 たとえば、構成セット パターンを使用してネットワーク セキュリティ グループを定義する場合は、同じ優先順位と方向を定義する複数の規則がないことを確認します。