次の方法で共有


デプロイ スコープの ARM テンプレート関数

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

次のステップ