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()
함수에는 두 개의 입력 매개 변수 loopName
및 offset
이 있습니다. 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()
에서 loopName
이 copyIndex('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 템플릿은 이 두 리소스 간의 직렬 배포 모드로 전환됩니다. 이는 배포 처리량 속도에 영향을 줄 수 있지만 특정 배포 순서를 고려하여 이제 우선적으로 적용됩니다.