Azure Resource Manager テンプレート (ARM テンプレート) を使用すると、リソース グループ、サブスクリプション、管理グループ、またはテナントにデプロイできます。 一般に、 ARM テンプレート関数 はすべてのスコープで同じように動作します。 この記事では、スコープに応じて一部の関数に存在する違いについて説明します。
サポートされている関数
さまざまなスコープにデプロイする場合、いくつかの重要な考慮事項があります。
resourceGroup() 関数は、リソース グループのデプロイでサポートされています。
subscription() 関数は、リソース グループとサブスクリプションのデプロイでサポートされています。
reference() 関数と list() 関数は、すべてのスコープでサポートされています。
resourceId() を使用して、リソース グループにデプロイされたリソースの ID を取得します。
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
subscriptionResourceId() 関数を使用して、サブスクリプションにデプロイされたリソースの ID を取得します。
たとえば、サブスクリプションにデプロイされているポリシー定義のリソース ID を取得するには、次を使用します。
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
管理グループの拡張機能として実装されるリソースには extensionResourceId() 関数を使用します。 管理グループにデプロイされているカスタム ポリシー定義は、管理グループの拡張機能です。
管理グループ レベルでカスタム ポリシー定義のリソース ID を取得するには、次の値を使用します。
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
tenantResourceId() 関数を使用して、テナントにデプロイされたリソースの ID を取得します。 組み込みのポリシー定義は、テナント レベルのリソースです。 管理グループ レベルで組み込みポリシーを割り当てるときは、tenantResourceId 関数を使用します。
組み込みのポリシー定義のリソース ID を取得するには、次の値を使用します。
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
スコープにおける関数の解決
複数のスコープにデプロイする場合、 resourceGroup() 関数と subscription() 関数は 、テンプレートの指定方法に基づいて異なる方法で解決されます。 外部テンプレートにリンクする場合、これらの関数は、常にそのテンプレートのスコープに解決されます。 親テンプレートの中にテンプレートを入れ子にする際には、expressionEvaluationOptions
プロパティを利用して、関数が親テンプレートのリソースグループとサブスクリプションに対応するのか、それとも入れ子になったテンプレートに対応するのかを指定します。 入れ子になったテンプレートのスコープに解決するには、このプロパティを inner
に設定します。 親テンプレートのスコープに解決するには、このプロパティを outer
に設定します。
次の表は、関数が親リソース グループと埋め込みリソース グループとサブスクリプションのどちらに解決されるかを示しています。
テンプレートの種類 | 範囲 | 解決策 |
---|---|---|
入れ子 | outer (既定値) | 親リソース グループ |
入れ子 | 内部 | サブ リソース グループ |
リンク | なし | サブ リソース グループ |
次の テンプレート例 は次のとおりです。
- 既定の (外部) スコープを持つ入れ子になったテンプレート
- 内部スコープを持つ入れ子になったテンプレート
- リンクされたテンプレート
{
"$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
次のステップ
- テンプレートでパラメーターを定義する方法については、「ARM テンプレート の構造と構文について」を参照してください。
- 一般的なデプロイ エラーの解決に関するヒントについては、「 Azure Resource Manager を使用した一般的な Azure デプロイ エラーのトラブルシューティング」を参照してください。
- SAS トークンを必要とするテンプレートをデプロイする方法については、「SAS トークンを使用してプライベート ARM テンプレートをデプロイする」を参照してください。