copy 요소를 사용하여 여러 리소스 인스턴스 만들기

완료됨

지금까지는 템플릿에서 리소스 목록에 리소스를 선언했습니다. 리소스를 배포하는 경우 리소스 목록에 지정된 각 항목의 인스턴스를 가져옵니다. 특정 리소스의 인스턴스를 두 개 이상 만드는 것이 좋습니다. 예를 들어 가상 네트워크에 여러 서브넷을 만들어야 할 수도 있습니다.

여러 인스턴스를 만들고 구문을 반복하려고 하는 경우 다음 질문과 요점을 고려하세요.

  • 두 개 이상의 복사본이 필요한지 여부: 더 간단한 시나리오에서는 필요하지 않을 수도 있습니다. 서브넷 또는 가상 머신과 같은 고급 시나리오의 경우 복사본이 두 개 이상 필요한지 여부를 고려해야 할 수 있습니다.
  • 리소스에 종속되는지 여부: 일반적으로 Azure Resource Manager는 Azure Resource Manager 템플릿 내의 참조가 작동하려면 리소스가 어떤 순서로 생성되어야 하는지 잘 파악합니다. 그러나 사용자가 순서를 지정해야 하는 경우가 있습니다.
  • 명명 스키마 정의: 리소스에 의미 있는 이름을 지정해야 할 수 있습니다. 이런 이유로 배포 시 전달되는 매개 변수를 사용합니다. 복사본이 여러 개 있는 경우 더 세부적으로 제어하고 현재 복사 시퀀스의 반복 부분을 기반으로 이름을 지정해야 할 수 있습니다.
  • 리소스 만들기 구성 및 제어: 프로덕션 환경에서 생성되는 리소스 수를 제한해야 할 수 있습니다. 이렇게 하려면 리소스 만들기를 직렬 또는 병렬로 구성할 수 있습니다.
  • 다른 유형 복사: 리소스가 여러 복사본을 만들고 반복할 수 있는 유일한 항목은 아닙니다. 실제로 속성, 변수 및 출력에서 동일한 작업을 수행할 수 있습니다.
  • 부모-자식: 리소스에서 부모-자식 관계를 구성해야 할 수도 있습니다.

여러 인스턴스 만들기

루프 구문을 사용하여 키 입력을 저장할 수 있습니다. 필요한 항목이 반복되고 이름 및 형식이 매우 비슷하여 아주 약간의 차이만 있는 경우는 copy 요소를 사용하면 좋을 수 있습니다.

‘copy 요소’는 리소스, 속성, 변수, 출력 등 여러 유형의 구문에 사용할 수 있는 JSON입니다. copy 요소의 구문은 copy 키와 해당 값으로서의 배열로 구성됩니다. 예: "copy": []

배열에는 여러 개의 요소가 포함되며 각 요소는 속성 집합으로 구성된 {} 개체입니다. 이러한 속성은 사용되는 구문의 유형에 따라 달라집니다. 일반적으로 모든 copy 요소 구문에는 하나의 공통 속성 count가 있습니다. 이 속성은 특정 유형 구문의 원하는 인스턴스 수를 결정합니다. 대부분의 구문은 코드의 다른 부분에서 참조할 수 있는 참조를 제공하는 name 속성도 허용됩니다. 사용되는 다른 속성은 각 구성에 고유합니다.

선택 방법

다음과 같이 질문할 수도 있습니다. “copy 요소를 다양한 유형의 구문에서 사용할 수 있다면 어떤 유형을 언제 선택해야 하나요? 그리고 템플릿에서 둘 이상의 유형을 사용할 수 있나요?”

사용 사례에 따라 결정됩니다. ‘리소스 반복’은 리소스의 복사본을 많이 만들 수 있으므로 예를 들어 많은 스토리지 계정이 필요한 경우 사용하는 것이 좋습니다. 반면에 ‘속성 반복’은 한 리소스 내에서 많은 속성을 만들 수 있습니다. 이는 키 입력 및 시간을 절약하기 위한 것이므로 템플릿에서 반복되는 부분을 알아야 합니다.

템플릿의 여러 위치에서 copy 요소를 사용할 수 있습니다. copy 요소를 사용하여 여러 리소스를 만들 수 있을 뿐 아니라 동일한 템플릿 내에서 비슷한 변수를 많이 만들 수도 있습니다.

작동 방식

평가되고 대체된 copy 문이 copy 요소를 작동합니다. 이 대체는 사용자가 copy 필드에서 지시하는 횟수 만큼 반복되는 copy 문 내 정의의 결과입니다.

다음 예제는 copy를 사용한 정의를 보여 줍니다.

"copy": [
  {
    "name": "dataDisks",
    "count": 2,
    "input": {
      "diskSizeGB": 1023,
      "lun": "[copyIndex('dataDisks')]",
      "createOption": "Empty"
    }
  }
]

count: 2 항목을 확인합니다. 값 2는 위의 식을 두 항목으로 확장하겠다는 의미입니다. 결과는 다음과 같습니다.

"dataDisks": [
{
  "lun": 0,
  "createOption": "Empty",
  "diskSizeGB": 1023
},
{
  "lun": 1,
  "createOption": "Empty",
  "diskSizeGB": 1023
}

name 속성의 값이 속성 이름이 되고, input 속성의 내용은 JSON에서 반복되는 부분이 된 것을 알 수 있습니다.

참고

copy 식 및 해당 출력은 사용되는 식의 유형에 따라 다릅니다. 위의 예제는 식이 일련의 반복된 문으로 변환될 때 발생하는 상황을 이해하는 데 도움이 됩니다.

복사할 수 있는 크기에는 제한이 있습니다. 현재 한도는 800개 항목입니다.

중요

정확한 제한 사항에 대한 자세한 내용은 Resource iteration in ARM templates(ARM 템플릿의 리소스 반복)를 참조하세요.

반복 제어

배열에서 특정 인덱스를 참조하는 데 도움이 되는 도우미 함수가 있습니다. copyIndex() 함수는 현재 인덱스를 반환합니다. 예를 들어 세 번째 반복된 항목의 경우 copyIndex()는 값 2를 반환합니다. copyIndex() 구문은 다음과 같습니다.

copyIndex(loopName, offset)

copyIndex() 함수에는 두 개의 입력 매개 변수 loopNameoffset이 있습니다. offset 매개 변수는 항상 선택적이며 현재 인덱스로부터 오프셋하는 데 사용됩니다. offset 값으로 추가하는 값은 무엇이든 현재 인덱스에 추가됩니다. 1을 오프셋으로 지정하고 현재 인덱스가 2를 반환하는 경우 copyIndex() 함수는 3을 반환합니다.

loopName 매개 변수는 사용되는 위치에 따라 선택적이거나 필수입니다. properties 구문 내에서 사용되는 경우 필수이고, resources 배열에서 사용되는 경우 선택적입니다. 다음은 필수인 경우의 예입니다.

"properties": {
    "storageProfile": {
      "copy": [
        {
          "name": "dataDisks",
          "count": "[parameters('numberOfDataDisks')]",
          "input": {
            "diskSizeGB": 1023,
            "lun": "[copyIndex('dataDisks')]",
            "createOption": "Empty"
          }
        }
      ]
    }
}

copy 요소가 properties 구문 내에서 사용되고 copyIndex()에서 loopNamecopyIndex('dataDisks')로 지정된 방법을 확인합니다.

다음은 loopName이 필수가 아닌 경우의 예입니다.

{
  "type": "Microsoft.Network/virtualNetworks",
  "apiVersion": "2018-04-01",
  "name": "[concat(parameters('vnetname'), copyIndex())]",
}

여기서는 선언되는 리소스를 보여 주며, copyIndex()는 리소스 컨텍스트에서 사용되므로 매개 변수 없이 호출됩니다.

배포 구성

리소스에 대해 copy 요소를 사용하는 경우 비슷한 리소스를 많이 만들 수 있습니다.

때로는 리소스를 만드는 방법 및 순서를 제어해야 할 수 있습니다. 순서를 제어하는 이유는 다음과 같습니다.

  • 환경 제한. 리소스를 배포하는 환경에 따라 배포가 환경에 미치는 영향을 제한해야 할 수 있습니다. 프로덕션 환경에서는 한 번에 영향을 받는 리소스의 수를 제한하는 것이 좋습니다. ‘배포 모드’를 구성하여 동시에 배포되는 리소스의 수를 제어할 수 있습니다.
  • 종속성. 필요한 리소스를 만들기 전에 이미 존재하는 항목에 종속되어 있을 수도 있습니다. 이러한 종속성을 표현하기 위해 dependsOn이라는 구문이 있습니다.

배포 모드 및 copy

copy 구문을 통해 생성된 리소스 집합이 모두 다른 항목보다 먼저 생성되도록 해야 할 수 있습니다. 해당하는 경우 이 상황을 표현해야 합니다. 기억하겠지만 여기서 필요한 것이 Resource Manager가 사용하는 배포 모드입니다. 두 가지 모드가 지원됩니다.

  • 직렬. 리소스를 이 배포 모드로 설정하면 해당 리소스가 하나씩 생성됩니다. 이 모드에서는 이 모드를 사용하여 배포하는 리소스의 수를 결정하는 batchSize 속성을 설정해야 합니다. 이전 일괄 처리를 완료하기 전에는 새 일괄 처리를 시작할 수 없습니다. 예를 들어 한 시점에 영향을 받는 리소스의 수를 제한해야 하는 프로덕션 환경에서 이런 방식으로 제한해야 할 수도 있습니다.
  • 병렬. 이 모드가 기본 배포 모드입니다. 장점은 높은 처리량으로, 템플릿이 더 빠르게 처리됩니다. 단점은 순서를 보장할 수 없다는 것으로, 프로덕션 환경에서는 사용하지 않는 것이 좋을 수 없습니다.

종속성

copy 요소의 컨텍스트에서는 종속성을 갖는 리소스에 필요한 섹션을 알려야 합니다. 이 종속성은 다음 JSON을 사용하여 이름으로 참조하여 수행합니다.

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2015-06-15",
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",
      "dependsOn": ["storagecopy"],
    }
  ]

copy 요소에 storagecopy 값을 가진 name 속성이 있는 것을 확인합니다. 종속 리소스(스토리지 계정)가 copy 요소 작업이 완료되기를 기다리고 있습니다. "dependsOn": ["storagecopy"]으로 표현되어 있습니다.

따라서 ARM 템플릿은 이 두 리소스 간의 직렬 배포 모드로 전환됩니다. 이는 배포 처리량 속도에 영향을 줄 수 있지만 특정 배포 순서를 고려하여 이제 우선적으로 적용됩니다.