Azure Resource Manager 템플릿에서 리소스를 배포하는 순서 정의Define the order for deploying resources in Azure Resource Manager Templates

주어진 리소스에 대해 해당 리소스를 배포하기 전에 존재해야 하는 다른 리소스가 있을 수 있습니다.For a given resource, there can be other resources that must exist before the resource is deployed. 예를 들어 SQL 데이터베이스를 배포하려면 SQL Server가 있어야 합니다.For example, a SQL server must exist before attempting to deploy a SQL database. 하나의 리소스를 다른 리소스에 종속된 것으로 표시하여 이 관계를 정의합니다.You define this relationship by marking one resource as dependent on the other resource. 종속성은 dependsOn 요소를 사용하거나 reference 함수를 사용하여 정의합니다.You define a dependency with the dependsOn element, or by using the reference function.

Resource Manager는 리소스 간의 종속성을 평가한 후 종속된 순서에 따라 리소스를 배포합니다.Resource Manager evaluates the dependencies between resources, and deploys them in their dependent order. 리소스가 서로 종속되어 있지 않은 경우 Resource Manager는 이를 병렬로 배포합니다.When resources aren't dependent on each other, Resource Manager deploys them in parallel. 동일한 템플릿에 배포되는 리소스에 대한 종속성만 정의하면 됩니다.You only need to define dependencies for resources that are deployed in the same template.

자습서의 경우 자습서: 종속 리소스가 있는 Azure Resource Manager 템플릿 만들기를 참조하세요.For a tutorial, see Tutorial: create Azure Resource Manager templates with dependent resources.

dependsOndependsOn

템플릿 내에서 dependsOn 요소를 사용하면 하나의 리소스를 하나 이상의 리소스에 종속된 것으로 정의할 수 있습니다.Within your template, the dependsOn element enables you to define one resource as a dependent on one or more resources. 값은 리소스 이름의 쉼표로 구분된 목록일 수 있습니다.Its value can be a comma-separated list of resource names.

다음 예제에서는 부하 분산 장치, 가상 네트워크 및 여러 저장소 계정을 만드는 루프에 종속된 가상 머신 확장 집합을 보여 줍니다.The following example shows a virtual machine scale set that depends on a load balancer, virtual network, and a loop that creates multiple storage accounts. 이러한 다른 리소스는 다음 예제에 표시되어 있지 않지만 템플릿 내 다른 곳에 존재해야 합니다.These other resources aren't shown in the following example, but they would need to exist elsewhere in the template.

{
  "type": "Microsoft.Compute/virtualMachineScaleSets",
  "name": "[variables('namingInfix')]",
  "location": "[variables('location')]",
  "apiVersion": "2016-03-30",
  "tags": {
    "displayName": "VMScaleSet"
  },
  "dependsOn": [
    "[variables('loadBalancerName')]",
    "[variables('virtualNetworkName')]",
    "storageLoop",
  ],
  ...
}

앞의 예에서 종속성은 storageLoop라는 복사 루프를 통해 생성되는 리소스에 포함됩니다.In the preceding example, a dependency is included on the resources that are created through a copy loop named storageLoop. 예제는 Azure 리소스 관리자에서 리소스의 여러 인스턴스 만들기를 참조하세요.For an example, see Create multiple instances of resources in Azure Resource Manager.

종속성을 정의할 때 모호성을 피하기 위해 리소스 공급자 네임스페이스 및 리소스 형식을 포함할 수 있습니다.When defining dependencies, you can include the resource provider namespace and resource type to avoid ambiguity. 예를 들어 다른 리소스와 동일한 이름을 가질 수 있는 부하 분산 장치 및 가상 네트워크를 명확히 하려면 다음 형식을 사용합니다.For example, to clarify a load balancer and virtual network that may have the same names as other resources, use the following format:

"dependsOn": [
  "[resourceId('Microsoft.Network/loadBalancers', variables('loadBalancerName'))]",
  "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
]

dependsOn을 사용하여 리소스 간의 관계를 매핑하도록 선택할 수 있지만 왜 그렇게 하는지에 대한 이유를 이해하는 것이 중요합니다.While you may be inclined to use dependsOn to map relationships between your resources, it's important to understand why you're doing it. 예를 들어, 리소스가 상호 연결되는 방식을 문서화하려면, dependsOn은 올바른 접근 방법이 아닙니다.For example, to document how resources are interconnected, dependsOn isn't the right approach. 배포 후 dependsOn 요소에 어떤 리소스가 정의되었는지 쿼리할 수 없습니다.You can't query which resources were defined in the dependsOn element after deployment. dependsOn을 사용하면 Resource Manager는 종속성이 있는 두 리소스를 병렬로 배포하지 않으므로 배포 시간에 잠재적으로 영향을 줍니다.By using dependsOn, you potentially impact deployment time because Resource Manager doesn't deploy in parallel two resources that have a dependency.

자식 리소스Child resources

resources 속성을 사용하면 정의되는 리소스에 관련된 자식 리소스를 지정할 수 있습니다.The resources property allows you to specify child resources that are related to the resource being defined. 자식 리소스는 5개 수준 깊이까지만 정의할 있습니다.Child resources can only be defined five levels deep. 자식 리소스 및 부모 리소스 간에 암시적 배포 종속성을 만들어지지 않습니다는 두는 것이 반드시 합니다.It's important to note that an implicit deployment dependency isn't created between a child resource and the parent resource. 부모 리소스 다음에 자식 리소스를 배포해야 하는 경우 dependsOn 속성을 사용하여 해당 종속성을 확실하게 명시해야 합니다.If you need the child resource to be deployed after the parent resource, you must explicitly state that dependency with the dependsOn property.

각 부모 리소스는 특정 리소스 종류만 자식 리소스로 허용합니다.Each parent resource accepts only certain resource types as child resources. 허용되는 리소스 종류는 부모 리소스의 템플릿 스키마에서 지정됩니다.The accepted resource types are specified in the template schema of the parent resource. 자식 리소스 종류의 이름에는 부모 리소스 종류의 이름이 포함됩니다. 예를 들어 Microsoft.Web/sites/configMicrosoft.Web/sites/extensions는 둘 다 Microsoft.Web/sites의 자식 리소스입니다.The name of child resource type includes the name of the parent resource type, such as Microsoft.Web/sites/config and Microsoft.Web/sites/extensions are both child resources of the Microsoft.Web/sites.

다음 예제에서는 SQL Server 및 SQL 데이터베이스를 보여 줍니다.The following example shows a SQL server and SQL database. 데이터베이스가 서버의 자식인 경우에도 SQL 데이터베이스와 SQL Server 간에 명시적 종속성이 정의되어 있습니다.Notice that an explicit dependency is defined between the SQL database and SQL server, even though the database is a child of the server.

"resources": [
  {
    "name": "[variables('sqlserverName')]",
    "type": "Microsoft.Sql/servers",
    "location": "[resourceGroup().location]",
    "tags": {
      "displayName": "SqlServer"
    },
    "apiVersion": "2014-04-01-preview",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "name": "[parameters('databaseName')]",
        "type": "databases",
        "location": "[resourceGroup().location]",
        "tags": {
          "displayName": "Database"
        },
        "apiVersion": "2014-04-01-preview",
        "dependsOn": [
          "[variables('sqlserverName')]"
        ],
        "properties": {
          "edition": "[parameters('edition')]",
          "collation": "[parameters('collation')]",
          "maxSizeBytes": "[parameters('maxSizeBytes')]",
          "requestedServiceObjectiveName": "[parameters('requestedServiceObjectiveName')]"
        }
      }
    ]
  }
]

reference 및 list 함수reference and list functions

reference 함수 를 사용하면 식을 다른 JSON 이름 및 값 쌍 또는 런타임 리소스에서 해당 값을 파생시키는 식을 작성할 수 있습니다.The reference function enables an expression to derive its value from other JSON name and value pairs or runtime resources. list* 함수는 목록 작업에서 리소스에 대한 값을 반환합니다.The list* functions return values for a resource from a list operation. 참조 및 목록 식은 참조된 리소스가 동일한 템플릿에 배포되고 해당 이름(리소스 ID 아님)에 따라 참조되는 경우 한 리소스가 다른 리소스에 종속되도록 암시적으로 선언합니다.Reference and list expressions implicitly declare that one resource depends on another, when the referenced resource is deployed in the same template and referred to by its name (not resource ID). 리소스 ID를 reference 또는 list 함수로 전달하는 경우 암시적 참조가 생성되지 않습니다.If you pass the resource ID into the reference or list functions, an implicit reference isn't created.

reference 함수의 일반 형식은 다음과 같습니다.The general format of the reference function is:

reference('resourceName').propertyPath

listKeys 함수의 일반 형식은 다음과 같습니다.The general format of the listKeys function is:

listKeys('resourceName', 'yyyy-mm-dd')

다음 예제에서 CDN 엔드포인트는 CDN 프로필에 명시적으로 종속되고 웹앱에 암시적으로 종속됩니다.In the following example, a CDN endpoint explicitly depends on the CDN profile, and implicitly depends on a web app.

{
    "name": "[variables('endpointName')]",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "apiVersion": "2016-04-02",
    "dependsOn": [
            "[variables('profileName')]"
    ],
    "properties": {
        "originHostHeader": "[reference(variables('webAppName')).hostNames[0]]",
        ...
    }

이 요소 또는 dependsOn 요소를 사용하여 종속성을 지정할 수 있지만 같은 종속 리소스에 대해 두 가지를 모두 사용할 필요는 없습니다.You can use either this element or the dependsOn element to specify dependencies, but you don't need to use both for the same dependent resource. 가능하면 불필요한 종속성을 추가하지 않도록 암시적 참조를 사용합니다.Whenever possible, use an implicit reference to avoid adding an unnecessary dependency.

자세한 내용은 reference 함수를 참조하세요.To learn more, see reference function.

순환적 종속성Circular dependencies

Resource Manager는 템플릿의 유효성을 검사하는 동안 순환적 종속성을 식별합니다.Resource Manager identifies circular dependencies during template validation. 순환적 종속성이 존재한다는 오류가 표시되면 템플릿을 평가하여 불필요한 종속성이 있는지, 제거할 수 있는지를 확인합니다.If you receive an error stating that a circular dependency exists, evaluate your template to see if any dependencies aren't needed and can be removed. 종속성을 제거하는 것으로 해결되지 않는다면 일부 배포 작업을 순환적 종속성이 있는 리소스 다음에 배포된 자식 리소스로 이동하여 순환적 종속성을 피할 수 있습니다.If removing dependencies doesn't work, you can avoid circular dependencies by moving some deployment operations into child resources that are deployed after the resources that have the circular dependency. 예를 들어 두 개의 가상 머신을 배포하지만 각 컴퓨터에 서로를 참조하는 속성을 설정해야 한다고 가정합니다.For example, suppose you're deploying two virtual machines but you must set properties on each one that refer to the other. 이런 경우 다음과 같은 순서로 배포할 수 있습니다.You can deploy them in the following order:

  1. vm1vm1
  2. vm2vm2
  3. vm1의 확장은 vm1 및 vm2에 종속됩니다.Extension on vm1 depends on vm1 and vm2. 이 확장은 vm2에서 얻은 값을 vm1에 설정합니다.The extension sets values on vm1 that it gets from vm2.
  4. vm2의 확장은 vm1 및 vm2에 종속됩니다.Extension on vm2 depends on vm1 and vm2. 이 확장은 vm1에서 얻은 값을 vm2에 설정합니다.The extension sets values on vm2 that it gets from vm1.

배포 순서를 평가하고 종속성 오류를 해결하는 방법에 대한 자세한 내용은 Azure Resource Manager를 사용한 일반적인 Azure 배포 오류 해결을 참조하세요.For information about assessing the deployment order and resolving dependency errors, see Troubleshoot common Azure deployment errors with Azure Resource Manager.

다음 단계Next steps