デプロイ スコープにおける 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

次のステップ