デプロイ スコープにおける ARM テンプレートの関数
Azure Resource Manager テンプレート (ARM テンプレート) を使用すると、リソース グループ、サブスクリプション、管理グループ、またはテナントにデプロイできます。 一般に、ARM テンプレート関数は、すべてのスコープで同じように機能します。 この記事では、スコープによって異なる一部の関数について説明します。
サポートされる関数
異なるスコープにデプロイする場合に考慮する必要がある事項を以下に示します。
resourceGroup () 関数は、リソース グループへのデプロイ用にサポートされています。
subscription() 関数は、リソース グループへのデプロイとサブスクリプションへのデプロイ用にサポートされています。
reference() および list() の各関数は、すべてのスコープ用にサポートされています。
リソース グループにデプロイされたリソースの ID を取得するには、resourceId () を使用します。
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
サブスクリプションにデプロイされたリソースの ID を取得するには、subscriptionResourceId() 関数を使用します。
たとえば、サブスクリプションにデプロイされているポリシー定義のリソース ID を取得するには、次のように使用します。
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
管理グループの拡張機能として実装されているリソースに対しては、extensionResourceId 関数を使用します。 管理グループにデプロイされているカスタム ポリシー定義は、管理グループの拡張機能です。
管理グループ レベルでカスタム ポリシー定義のリソース ID を取得するには、次を使用します。
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
テナントにデプロイされているリソースの ID を取得するには、tenantResourceId() 関数を使用します。 組み込みのポリシー定義は、テナント レベルのリソースです。 組み込みポリシーを管理グループ レベルで割り当てる場合は、tenantResourceId 関数を使用します。
組み込みのポリシー定義のリソース ID を取得するには、次を使用します。
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
スコープにおける関数の解決
複数のスコープにデプロイする場合、resourceGroup() および subscription() 関数は、テンプレートをどのように指定するかに基づいて異なった方法で解決されます。 外部テンプレートにリンクする場合、これらの関数は、常にそのテンプレートのスコープに解決されます。 親テンプレート内でテンプレートを入れ子にする場合は、expressionEvaluationOptions
プロパティを使用して、これらの関数が親テンプレートと入れ子になったテンプレートのどちらのリソース グループおよびサブスクリプションに解決されるかを指定します。 入れ子になったテンプレートのスコープに解決されるようにするには、このプロパティを inner
に設定します。 親テンプレートのスコープに解決されるようにするには、このプロパティを outer
に設定します。
次の表は、これらの関数が親と埋め込みのどちらのリソース グループおよびサブスクリプションに解決されるかを示しています。
テンプレートの種類 | Scope | 解像度 |
---|---|---|
入れ子 | outer (既定) | 親リソース グループ |
入れ子 | inner | サブ リソース グループ |
リンク済み | 該当なし | サブ リソース グループ |
次のテンプレートの例は、次のものを示しています。
- 既定の (outer) スコープを持つ入れ子になったテンプレート
- inner スコープを持つ入れ子になったテンプレート
- リンク済みテンプレート
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "defaultScopeTemplate",
"resourceGroup": "inlineGroup",
"properties": {
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"resourceGroupOutput": {
"type": "string",
"value": "[resourceGroup().name]"
}
}
}
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "innerScopeTemplate",
"resourceGroup": "inlineGroup",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"resourceGroupOutput": {
"type": "string",
"value": "[resourceGroup().name]"
}
}
}
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "linkedTemplate",
"resourceGroup": "linkedGroup",
"properties": {
"mode": "Incremental",
"parameters": {},
"templateLink": {
"contentVersion": "1.0.0.0",
"uri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/resourcegroupname.json"
}
}
}
],
"outputs": {
"parentRG": {
"type": "string",
"value": "[format('Parent resource group is {0}', resourceGroup().name)]"
},
"defaultScopeRG": {
"type": "string",
"value": "[format('Default scope resource group is {0}', reference('defaultScopeTemplate').outputs.resourceGroupOutput.value)]"
},
"innerScopeRG": {
"type": "string",
"value": "[format('Inner scope resource group is {0}', reference('innerScopeTemplate').outputs.resourceGroupOutput.value)]"
},
"linkedRG": {
"type": "string",
"value": "[format('Linked resource group is {0}', reference('linkedTemplate').outputs.resourceGroupOutput.value)]"
}
}
}
前のテンプレートをテストし、その結果を確認するには、PowerShell または Azure CLI を使用します。
New-AzResourceGroup -Name parentGroup -Location southcentralus
New-AzResourceGroup -Name inlineGroup -Location southcentralus
New-AzResourceGroup -Name linkedGroup -Location southcentralus
New-AzResourceGroupDeployment `
-ResourceGroupName parentGroup `
-TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json
前の例からの出力は次のようになります。
Name Type Value
=============== ========================= ==========
parentRG String Parent resource group is parentGroup
defaultScopeRG String Default scope resource group is parentGroup
innerScopeRG String Inner scope resource group is inlineGroup
linkedRG String Linked resource group is linkedgroup
次のステップ
- テンプレートでパラメーターを定義する方法については、「Azure Resource Manager テンプレートの構造と構文の詳細」を参照してください。
- 一般的なデプロイ エラーを解決するうえでのヒントについては、「Azure Resource Manager を使用した Azure へのデプロイで発生する一般的なエラーのトラブルシューティング」を参照してください。
- SAS トークンを必要とするテンプレートをデプロイする方法については、「SAS トークンを使用してプライベート ARM テンプレートをデプロイする」を参照してください。