共有変数ファイル パターン
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)
}
}
注意事項
- この方法を使用すると、JSON ファイルは Bicep によって生成される ARM テンプレート内に含められます。 Bicep によって生成される JSON ARM テンプレートのファイル制限は 4 MB なので、大きな共有変数ファイルを使わないようにすることが重要です。
- 共有変数の配列が、各 Bicep ファイルで指定されている配列の値と競合しないようにします。 たとえば、構成セット パターンを使用してネットワーク セキュリティ グループを定義する場合は、同じ優先順位と方向を定義している規則が複数存在しないようにします。