다음을 통해 공유


배포 범위의 ARM 템플릿 함수

ARM 템플릿(Azure Resource Manager 템플릿)을 사용하여 리소스 그룹, 구독, 관리 그룹 또는 테넌트에 배포할 수 있습니다. 일반적으로 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

다음 단계