Функции шаблонов ARM в областях развертывания

С помощью шаблонов Azure Resource Manager (ARM) можно выполнять развертывание в группах ресурсов, подписках, группах управления или клиентах. Как правило, функции шаблонов ARM работают одинаково для всех областей. Эта статья описывает различия, которые существуют для некоторых функций в зависимости от области.

Поддерживаемые функции

При развертывании в разных областях необходимо учитывать следующие аспекты:

  • Функция resourceGroup()поддерживается для развертываний в группах ресурсов.

  • Функция subscription()поддерживается для развертываний в группах ресурсов и подписках.

  • Функции reference() и list()поддерживаются для всех областей.

  • Используйте resourceId(), чтобы получить идентификатор для ресурса, развернутого в группе ресурсов.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Используйте функцию subscriptionResourceId(), чтобы получить идентификатор для ресурса, развернутого в подписке.

    Например, чтобы получить идентификатор ресурса для определения политики, развернутого в подписке, используйте следующее:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Используйте функцию extensionResourceId() для ресурсов, реализованных в виде расширений группы управления. Определения настраиваемой политики, развернутые в группе управления, являются расширениями группы управления.

    Чтобы получить идентификатор ресурса для определения пользовательской политики на уровне группы управления, используйте следующее:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Используйте функцию tenantResourceId(), чтобы получить идентификатор для ресурса, развернутого в клиенте. Определения встроенных политик — это ресурсы уровня клиента. При назначении встроенной политики на уровне группы управления используйте функцию tenantResourceId.

    Чтобы получить идентификатор ресурса для определения встроенной политики, используйте следующее:

    "policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    

Разрешение функций в областях

При развертывании в нескольких областях результат выполнения функций resourceGroup() и subscription() зависит от способа указания шаблона. При указании ссылки на внешний шаблон функции всегда разрешаются в области этого шаблона. Если шаблон вложен в родительский шаблон, свойство expressionEvaluationOptions позволяет указать, где будут разрешаться функции: в группе ресурсов и подписке родительского шаблона или вложенного шаблона. Задайте для свойства значение inner, чтобы использовать область вложенного шаблона. Задайте для свойства значение 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

Дальнейшие действия