Dağıtım kapsamlarındaki ARM şablonu işlevleri

Azure Resource Manager şablonları (ARM şablonları) ile kaynak gruplarına, aboneliklere, yönetim gruplarına veya kiracılara dağıtabilirsiniz. ARM şablonu işlevleri genellikle tüm kapsamlar için aynı şekilde çalışır. Bu makalede, kapsama bağlı olarak bazı işlevler için var olan farklar açıklanmaktadır.

Desteklenen işlevler

Farklı kapsamlara dağıtım yaparken dikkat edilmesi gereken bazı önemli noktalar vardır:

  • resourceGroup() işlevi kaynak grubu dağıtımları için desteklenir.

  • subscription() işlevi kaynak grubu ve abonelik dağıtımları için desteklenir.

  • reference() ve list() işlevleri tüm kapsamlar için desteklenir.

  • Kaynak grubunda dağıtılan bir kaynağın kimliğini almak için resourceId() kullanın.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Abonelikte dağıtılan bir kaynağın kimliğini almak için subscriptionResourceId() işlevini kullanın.

    Örneğin, aboneliğe dağıtılan bir ilke tanımının kaynak kimliğini almak için şunu kullanın:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Yönetim grubunun uzantıları olarak uygulanan kaynaklar için extensionResourceId() işlevini kullanın. Yönetim grubuna dağıtılan özel ilke tanımları, yönetim grubunun uzantılarıdır.

    Bir özel ilke tanımının kaynak kimliğini yönetim grubu düzeyinde almak için şunu kullanın:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Kiracıda dağıtılan bir kaynağın kimliğini almak için tenantResourceId() işlevini kullanın. Yerleşik ilke tanımları kiracı düzeyinde kaynaklardır. Yönetim grubu düzeyinde yerleşik ilke atarken tenantResourceId işlevini kullanın.

    Yerleşik ilke tanımının kaynak kimliğini almak için şunu kullanın:

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

Kapsamlarda işlev çözümlemesi

Birden fazla kapsama dağıttığınızda resourceGroup() ve subscription() işlevleri, şablonu nasıl belirttiğinize bağlı olarak farklı şekilde çözümleniyor. Dış şablona bağlandığınızda işlevler her zaman bu şablonun kapsamına çözümlenmektedir. Bir şablonu üst şablon içinde iç içe yerleştirdiğinizde, işlevlerin expressionEvaluationOptions üst şablon için kaynak grubuna ve aboneliğe mi yoksa iç içe şablona mı çözümleneceğini belirtmek için özelliğini kullanın. İç içe şablonun kapsamına çözümlenmesi için özelliğini inner olarak ayarlayın. Üst şablonun kapsamına çözümlenmesi için özelliğini outer olarak ayarlayın.

Aşağıdaki tabloda işlevlerin üst veya eklenmiş kaynak grubu ve aboneliğine çözümlenip çözümlenmeyeceği gösterilmektedir.

Şablon türü Kapsam Çözüm
Iç içe dış (varsayılan) Üst kaynak grubu
Iç içe Alt kaynak grubu
Bağlantılı Yok Alt kaynak grubu

Aşağıdaki örnek şablonda gösterilmiştir:

  • varsayılan (dış) kapsamlı iç içe şablon
  • iç kapsama sahip iç içe şablon
  • bağlı şablon
{
  "$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)]"
    }
  }
}

Önceki şablonu test etmek ve sonuçları görmek için PowerShell veya Azure CLI kullanın.

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

Önceki örnekten alınan çıkış:

 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

Sonraki adımlar