리소스, 속성 또는 Azure Resource Manager 템플릿의 변수 반복Resource, property, or variable iteration in Azure Resource Manager templates

이 문서에서는 Azure Resource Manager 템플릿에서 리소스, 변수 또는 속성의 둘 이상의 인스턴스를 만드는 방법을 보여 줍니다.This article shows you how to create more than one instance of a resource, variable, or property in your Azure Resource Manager template. 여러 인스턴스를 만들려면 추가 copy 템플릿에 개체입니다.To create multiple instances, add the copy object to your template.

리소스를 사용 하는 경우 복사 개체의 형식은:When used with a resource, the copy object has the following format:

"copy": {
    "name": "<name-of-loop>",
    "count": <number-of-iterations>,
    "mode": "serial" <or> "parallel",
    "batchSize": <number-to-deploy-serially>
}

변수 또는 속성을 사용 하는 경우 복사 개체의 형식은:When used with a variable or property, the copy object has the following format:

"copy": [
  {
      "name": "<name-of-loop>",
      "count": <number-of-iterations>,
      "input": <values-for-the-property-or-variable>
  }
]

모두 사용 하 여가이 문서에 자세히 설명 되어 있습니다.Both uses are described in greater detail in this article. 자습서의 경우 자습서: Resource Manager 템플릿을 사용하여 여러 리소스 인스턴스 만들기를 참조하세요.For a tutorial, see Tutorial: create multiple resource instances using Resource Manager templates.

리소스 배포 여부를 지정해야 하는 경우, 조건 요소를 참조하세요.If you need to specify whether a resource is deployed at all, see condition element.

복사 제한Copy limits

반복 횟수를 지정 하려면 count 속성에 대 한 값을 제공 합니다.To specify the number of iterations, you provide a value for the count property. 개수는 800을 초과할 수 없습니다.The count can't exceed 800.

수는 음수일 수 없습니다.The count can't be a negative number. REST API 버전을 사용 하 여 템플릿을 배포 하는 경우 2019-05-10 하거나 나중에 개수를 0으로 설정할 수 있습니다.If you deploy a template with REST API version 2019-05-10 or later, you can set count to zero. REST API의 이전 버전에는 개수에 0을 지원 하지 않습니다.Earlier versions of the REST API don't support zero for count. 현재, Azure CLI 또는 PowerShell 지원 하지 않습니다 개수에 0을 해당 지원은 향후 릴리스에 추가 될 예정입니다.Currently, Azure CLI or PowerShell don't support zero for count, but that support will be added in a future release.

신중 하 게 사용 하 여 수 모드 배포 완료 복사 합니다.Be careful using complete mode deployment with copy. 리소스 그룹에 전체 모드를 사용 하 여 다시 배포할 경우에 복사 루프를 해결 한 후 템플릿에 지정 되지 않은 모든 리소스가 삭제 됩니다.If you redeploy with complete mode to a resource group, any resources that aren't specified in the template after resolving the copy loop are deleted.

개수에 대 한 제한 리소스, 변수 또는 속성을 사용 하 여 사용 여부를 나타내는 동일 합니다.The limits for the count are the same whether used with a resource, variable, or property.

리소스 반복Resource iteration

배포 중 리소스의 인스턴스를 하나 이상 만들지 결정해야 할 경우에는 copy 요소를 리소스 종류에 추가합니다.When you must decide during deployment to create one or more instances of a resource, add a copy element to the resource type. 복사 요소에서이 루프에 대 한 이름과 반복의 수를 지정 합니다.In the copy element, specify the number of iterations and a name for this loop.

다음 형식으로 리소스를 여러 번 만듭니다.The resource to create several times takes the following format:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": 3
      }
    }
  ],
  "outputs": {}
}

각 리소스의 이름에는 copyIndex() 함수가 포함되어 있으며 이 함수는 루프에서 현재 반복을 반환합니다.Notice that the name of each resource includes the copyIndex() function, which returns the current iteration in the loop. copyIndex()는 0부터 시작합니다.copyIndex() is zero-based. 따라서 예제는 다음과 같습니다.So, the following example:

"name": "[concat('storage', copyIndex())]",

다음과 같은 이름을 만듭니다.Creates these names:

  • storage0storage0
  • storage1storage1
  • storage2storage2.

인덱스 값을 오프셋하려면 copyIndex() 함수에 값을 전달하면 됩니다.To offset the index value, you can pass a value in the copyIndex() function. 반복 횟수는 복사 요소에서 지정 되지만 copyIndex의 값이 지정된 된 값 만큼 오프셋 됩니다.The number of iterations is still specified in the copy element, but the value of copyIndex is offset by the specified value. 따라서 예제는 다음과 같습니다.So, the following example:

"name": "[concat('storage', copyIndex(1))]",

다음과 같은 이름을 만듭니다.Creates these names:

  • storage1storage1
  • storage2storage2
  • storage3storage3

복사 작업은 배열의 각 요소를 반복할 수 있으므로 배열을 사용할 때 유용합니다.The copy operation is helpful when working with arrays because you can iterate through each element in the array. 배열의 length 함수를 사용하여 반복 횟수를 지정하고, copyIndex를 사용하여 배열의 현재 인덱스를 검색합니다.Use the length function on the array to specify the count for iterations, and copyIndex to retrieve the current index in the array. 따라서 예제는 다음과 같습니다.So, the following example:

"parameters": { 
  "org": { 
    "type": "array", 
    "defaultValue": [ 
      "contoso", 
      "fabrikam", 
      "coho" 
    ] 
  }
}, 
"resources": [ 
  { 
    "name": "[concat('storage', parameters('org')[copyIndex()])]", 
    "copy": { 
      "name": "storagecopy", 
      "count": "[length(parameters('org'))]" 
    }, 
    ...
  } 
]

다음과 같은 이름을 만듭니다.Creates these names:

  • storagecontosostoragecontoso
  • storagefabrikamstoragefabrikam
  • storagecohostoragecoho

기본적으로 Resource Manager는 병렬로 리소스를 만듭니다.By default, Resource Manager creates the resources in parallel. 생성되는 순서는 정해져 있지 않습니다.The order in which they're created isn't guaranteed. 그러나 그 결과로 리소스가 배포되도록 지정하려고 합니다.However, you may want to specify that the resources are deployed in sequence. 예를 들어 프로덕션 환경을 업데이트할 때 특정 수를 한 번에 업데이트하도록 업데이트를 늦추려고 할 수 있습니다.For example, when updating a production environment, you may want to stagger the updates so only a certain number are updated at any one time.

리소스의 여러 인스턴스를 직렬로 배포하려면 mode직렬로 설정하고 batchSize를 한 번에 배포할 인스턴스 수로 설정합니다.To serially deploy more than one instance of a resource, set mode to serial and batchSize to the number of instances to deploy at a time. Resource Manager는 직렬 모드에서 루프에 이전 인스턴스의 종속성을 만듭니다. 따라서 이전 일괄 처리가 완료될 때까지 하나의 일괄 처리를 시작하지 않습니다.With serial mode, Resource Manager creates a dependency on earlier instances in the loop, so it doesn't start one batch until the previous batch completes.

예를 들어 저장소 계정을 한 번에 두 개씩 직렬로 배포하려면 다음을 사용합니다.For example, to serially deploy storage accounts two at a time, use:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": 4,
        "mode": "serial",
        "batchSize": 2
      }
    }
  ],
  "outputs": {}
}

모드 속성은 기본 값인 병렬을 수용합니다.The mode property also accepts parallel, which is the default value.

중첩 된 템플릿을 사용 하 여 복사를 사용 하는 방법에 대 한 내용은 복사본을 사용 하 여입니다.For information about using copy with nested templates, see Using copy.

속성 반복Property iteration

리소스의 속성에 대해 여러 값을 만들려면 속성 요소에서 copy 배열을 추가합니다.To create more than one value for a property on a resource, add a copy array in the properties element. 이 배열에는 개체가 포함되어 있으며 각 개체에는 다음 속성이 포함되어 있습니다.This array contains objects, and each object has the following properties:

  • name - 여러 값을 만들 속성의 이름name - the name of the property to create several values for
  • count - 만들 값 수count - the number of values to create.
  • input - 속성에 할당할 값이 포함된 개체input - an object that contains the values to assign to the property

다음 예제는 가상 머신에서 copy를 dataDisks 속성에 적용하는 방법을 보여 줍니다.The following example shows how to apply copy to the dataDisks property on a virtual machine:

{
  "name": "examplevm",
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2017-03-30",
  "properties": {
    "storageProfile": {
      "copy": [{
        "name": "dataDisks",
        "count": 3,
        "input": {
          "lun": "[copyIndex('dataDisks')]",
          "createOption": "Empty",
          "diskSizeGB": "1023"
        }
      }],
      ...

속성 반복 내에서 copyIndex를 사용하는 경우 반복의 이름을 제공해야 합니다.Notice that when using copyIndex inside a property iteration, you must provide the name of the iteration. 리소스 반복과 함께 사용할 경우 이름을 제공할 필요가 없습니다.You don't have to provide the name when used with resource iteration.

Resource Manager는 배포 중 copy 배열을 확장합니다.Resource Manager expands the copy array during deployment. 배열 이름은 속성의 이름이 됩니다.The name of the array becomes the name of the property. 입력 값은 개체 속성이 됩니다.The input values become the object properties. 배포된 템플릿은 다음과 같습니다.The deployed template becomes:

{
  "name": "examplevm",
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2017-03-30",
  "properties": {
    "storageProfile": {
      "dataDisks": [
        {
          "lun": 0,
          "createOption": "Empty",
          "diskSizeGB": "1023"
        },
        {
          "lun": 1,
          "createOption": "Empty",
          "diskSizeGB": "1023"
        },
        {
          "lun": 2,
          "createOption": "Empty",
          "diskSizeGB": "1023"
        }
      ],
      ...

copy 요소는 배열이므로 리소스에 대해 1 초과 속성을 지정할 수 있습니다.The copy element is an array so you can specify more than one property for the resource. 만들려는 각 속성에 대해 개체를 추가합니다.Add an object for each property to create.

{
  "name": "string",
  "type": "Microsoft.Network/loadBalancers",
  "apiVersion": "2017-10-01",
  "properties": {
    "copy": [
      {
        "name": "loadBalancingRules",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      },
      {
        "name": "probes",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      }
    ]
  }
}

리소스 및 속성 반복을 함께 사용할 수 있습니다.You can use resource and property iteration together. 이름별로 속성 반복을 참조하세요.Reference the property iteration by name.

{
  "type": "Microsoft.Network/virtualNetworks",
  "name": "[concat(parameters('vnetname'), copyIndex())]",
  "apiVersion": "2018-04-01",
  "copy":{
    "count": 2,
    "name": "vnetloop"
  },
  "location": "[resourceGroup().location]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[parameters('addressPrefix')]"
      ]
    },
    "copy": [
      {
        "name": "subnets",
        "count": 2,
        "input": {
          "name": "[concat('subnet-', copyIndex('subnets'))]",
          "properties": {
            "addressPrefix": "[variables('subnetAddressPrefix')[copyIndex('subnets')]]"
          }
        }
      }
    ]
  }
}

변수 반복Variable iteration

변수의 여러 인스턴스를 만들려면 변수 섹션에서 copy 속성을 사용합니다.To create multiple instances of a variable, use the copy property in the variables section. input 속성의 값에서 생성된 요소 배열을 만듭니다.You create an array of elements constructed from the value in the input property. 변수 내부 또는 변수 섹션의 최상위 수준에서 copy 속성을 사용할 수 있습니다.You can use the copy property within a variable, or at the top level of the variables section. 변수 반복 내부에 copyIndex를 사용하는 경우 반복의 이름을 제공해야 합니다.When using copyIndex inside a variable iteration, you must provide the name of the iteration.

문자열 값의 배열을 만드는 간단한 예제를 보려면 copy 배열 템플릿을합니다.For a simple example of creating an array of string values, see copy array template.

다음 예제에서는 동적으로 생성된 요소로 배열 변수를 만드는 여러 가지 방법을 보여 줍니다.The following example shows several different ways to create array variables with dynamically constructed elements. 변수 내부에 copy를 사용하여 개체 및 문자열의 배열을 만드는 방법을 보여 줍니다.It shows how to use copy inside a variable to create arrays of objects and strings. 또한 최상위 수준에서 copy를 사용하여 개체, 문자열 및 정수의 배열을 만드는 방법을 보여 줍니다.It also shows how to use copy at the top level to create arrays of objects, strings, and integers.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {
    "disk-array-on-object": {
      "copy": [
        {
          "name": "disks",
          "count": 5,
          "input": {
            "name": "[concat('myDataDisk', copyIndex('disks', 1))]",
            "diskSizeGB": "1",
            "diskIndex": "[copyIndex('disks')]"
          }
        },
        {
          "name": "diskNames",
          "count": 5,
          "input": "[concat('myDataDisk', copyIndex('diskNames', 1))]"
        }
      ]
    },
    "copy": [
      {
        "name": "top-level-object-array",
        "count": 5,
        "input": {
          "name": "[concat('myDataDisk', copyIndex('top-level-object-array', 1))]",
          "diskSizeGB": "1",
          "diskIndex": "[copyIndex('top-level-object-array')]"
        }
      },
      {
        "name": "top-level-string-array",
        "count": 5,
        "input": "[concat('myDataDisk', copyIndex('top-level-string-array', 1))]"
      },
      {
        "name": "top-level-integer-array",
        "count": 5,
        "input": "[copyIndex('top-level-integer-array')]"
      }
    ]
  },
  "resources": [],
  "outputs": {
    "exampleObject": {
      "value": "[variables('disk-array-on-object')]",
      "type": "object"
    },
    "exampleArrayOnObject": {
      "value": "[variables('disk-array-on-object').disks]",
      "type" : "array"
    },
    "exampleObjectArray": {
      "value": "[variables('top-level-object-array')]",
      "type" : "array"
    },
    "exampleStringArray": {
      "value": "[variables('top-level-string-array')]",
      "type" : "array"
    },
    "exampleIntegerArray": {
      "value": "[variables('top-level-integer-array')]",
      "type" : "array"
    }
  }
}

생성 되는 변수의 형식이 입력된 개체에 따라 달라 집니다.The type of variable that gets created depends on the input object. 예를 들어, 명명 된 변수의 최상위-level-개체-배열 앞의 예제를 반환 합니다.For example, the variable named top-level-object-array in the preceding example returns:

[
  {
    "name": "myDataDisk1",
    "diskSizeGB": "1",
    "diskIndex": 0
  },
  {
    "name": "myDataDisk2",
    "diskSizeGB": "1",
    "diskIndex": 1
  },
  {
    "name": "myDataDisk3",
    "diskSizeGB": "1",
    "diskIndex": 2
  },
  {
    "name": "myDataDisk4",
    "diskSizeGB": "1",
    "diskIndex": 3
  },
  {
    "name": "myDataDisk5",
    "diskSizeGB": "1",
    "diskIndex": 4
  }
]

및 명명 된 변수의 최상위-level-문자열-배열 반환 합니다.And, the variable named top-level-string-array returns:

[
  "myDataDisk1",
  "myDataDisk2",
  "myDataDisk3",
  "myDataDisk4",
  "myDataDisk5"
]

루프의 리소스에 따라 달라짐Depend on resources in a loop

dependsOn 요소를 사용하여 어떤 리소스를 다른 리소스 다음에 배포하도록 지정합니다.You specify that a resource is deployed after another resource by using the dependsOn element. 루프의 리소스 컬렉션에 따라 달라지는 리소스를 배포하려면 dependsOn 요소에 복사 루프의 이름을 제공합니다.To deploy a resource that depends on the collection of resources in a loop, provide the name of the copy loop in the dependsOn element. 다음 예제에서는 Virtual Machine을 배포하기 전에 저장소 계정 3개를 배포하는 방법을 보여줍니다.The following example shows how to deploy three storage accounts before deploying the Virtual Machine. 전체 Virtual Machine 정의는 표시되지 않습니다.The full Virtual Machine definition isn't shown. 참고로 copy 요소의 name은 storagecopy로 설정되고 Virtual Machines에 대한 dependsOn 요소도 storagecopy로 설정되었습니다.Notice that the copy element has name set to storagecopy and the dependsOn element for the Virtual Machines is also set to storagecopy.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": [
    {
      "apiVersion": "2016-01-01",
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {},
      "copy": {
        "name": "storagecopy",
        "count": 3
      }
    },
    {
      "apiVersion": "2015-06-15", 
      "type": "Microsoft.Compute/virtualMachines", 
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",  
      "dependsOn": ["storagecopy"],
      ...
    }
  ],
  "outputs": {}
}

자식 리소스에 대한 반복Iteration for a child resource

자식 리소스에 대해 복사 루프를 사용할 수 없습니다.You can't use a copy loop for a child resource. 일반적으로 다른 리소스 내에 중첩된 것으로 정의된 여러 인스턴스를 만들려면 대신 해당 리소스를 최상위 리소스로 만들어야 합니다.To create more than one instance of a resource that you typically define as nested within another resource, you must instead create that resource as a top-level resource. 형식 및 이름 속성을 통해 부모 리소스와의 관계를 정의합니다.You define the relationship with the parent resource through the type and name properties.

예를 들어, 데이터 세트를 데이터 팩터리 내에 자식 리소스로 정의한다고 가정합니다.For example, suppose you typically define a dataset as a child resource within a data factory.

"resources": [
{
  "type": "Microsoft.DataFactory/datafactories",
  "name": "exampleDataFactory",
  ...
  "resources": [
    {
      "type": "datasets",
      "name": "exampleDataSet",
      "dependsOn": [
        "exampleDataFactory"
      ],
      ...
    }
  ]

둘 이상의 데이터 세트를 만들려면 데이터 팩터리의 외부로 이동합니다.To create more than one data set, move it outside of the data factory. 데이터 세트는 데이터 팩터리와 같은 수준에 있어야 하지만 여전히 데이터 팩터리의 자식 리소스입니다.The dataset must be at the same level as the data factory, but it's still a child resource of the data factory. 형식 및 이름 속성을 통해 데이터 집합과 데이터 팩터리 간의 관계를 유지합니다.You preserve the relationship between data set and data factory through the type and name properties. 템플릿의 해당 위치에서 형식을 더 이상 유추할 수 없으므로 {resource-provider-namespace}/{parent-resource-type}/{child-resource-type} 형식으로 정규화된 형식을 제공해야 합니다.Since type can no longer be inferred from its position in the template, you must provide the fully qualified type in the format: {resource-provider-namespace}/{parent-resource-type}/{child-resource-type}.

데이터 팩터리 인스턴스로 부모/자식 관계를 설정하려면 부모 리소스 이름을 포함하는 데이터 집합에 대해 이름을 제공합니다.To establish a parent/child relationship with an instance of the data factory, provide a name for the data set that includes the parent resource name. 사용할 형식: {parent-resource-name}/{child-resource-name}.Use the format: {parent-resource-name}/{child-resource-name}.

다음 예제에서는 구현을 보여줍니다.The following example shows the implementation:

"resources": [
{
  "type": "Microsoft.DataFactory/datafactories",
  "name": "exampleDataFactory",
  ...
},
{
  "type": "Microsoft.DataFactory/datafactories/datasets",
  "name": "[concat('exampleDataFactory', '/', 'exampleDataSet', copyIndex())]",
  "dependsOn": [
    "exampleDataFactory"
  ],
  "copy": {
    "name": "datasetcopy",
    "count": "3"
  },
  ...
}]

예제 템플릿Example templates

다음 예제에서는 여러 리소스 또는 속성 인스턴스를 만들기 위한 일반적인 시나리오를 보여 줍니다.The following examples show common scenarios for creating more than one instance of a resource or property.

TemplateTemplate 설명Description
저장소 복사Copy storage 이름의 인덱스 번호를 사용하여 여러 스토리지 계정을 배포합니다.Deploys more than one storage account with an index number in the name.
저장소 직렬 복사Serial copy storage 여러 스토리지 계정을 한 번에 하나씩 배포합니다.Deploys several storage accounts one at time. 이름에는 인덱스 번호가 포함됩니다.The name includes the index number.
배열을 사용하여 저장소 복사Copy storage with array 여러 스토리지 계정을 배포합니다.Deploys several storage accounts. 이름에는 배열의 값이 포함됩니다.The name includes a value from an array.
가변적인 수의 데이터 디스크를 사용한 VM 배포VM deployment with a variable number of data disks 가상 머신을 사용하여 여러 데이터 디스크를 배포합니다.Deploys several data disks with a virtual machine.
변수 복사Copy variables 변수를 반복하는 다양한 방법을 보여 줍니다.Demonstrates the different ways of iterating on variables.
다중 보안 규칙Multiple security rules 네트워크 보안 그룹에 여러 보안 규칙을 배포합니다.Deploys several security rules to a network security group. 매개 변수에서 보안 규칙을 구성합니다.It constructs the security rules from a parameter. 매개 변수는 여러 NSG 매개 변수 파일을 참조합니다.For the parameter, see multiple NSG parameter file.

다음 단계Next steps