루프 실행 및 중첩 루프 제어
강력한 복사 루프 기능을 사용하면 유연한 동적 템플릿을 만들 수 있습니다. 리소스를 만들 때 루프가 실행되는 방식을 제어하는 방법 및 루프를 사용하여 리소스 속성과 중첩 루프를 설정하는 방법을 이해하는 것이 중요합니다.
이 단원에서는 복사 루프의 실행을 제어하는 방법 및 Bicep에서 리소스 속성 루프와 중첩된 루프를 사용하는 방법을 알아봅니다.
참고 항목
이 단원의 명령은 개념을 설명하기 위해 표시된 것입니다. 명령을 아직 실행하지 마세요. 여기에서 학습하는 내용을 곧 연습할 예정입니다.
루프 실행 제어
기본적으로 Azure Resource Manager는 루프에서 병렬로 그리고 비결정적 순서로 리소스를 만듭니다. 이전 연습에서 루프를 만들 때 두 Azure SQL 논리 서버를 모두 동시에 만들었습니다. 이렇게 하면 루프 내의 모든 리소스가 동시에 배포되기 때문에 전체 배포 시간을 줄일 수 있습니다.
그러나 경우에 따라 루프에서 리소스를 병렬이 아닌 순차적으로 배포하거나 작은 변경 배치를 병렬로 함께 배포해야 할 수도 있습니다. 예를 들어 프로덕션 환경에 다수의 Azure App Service 앱이 있는 경우 한 번에 소수의 앱에만 변경 내용을 배포함으로써 업데이트가 모든 앱을 다시 시작하지 않도록 할 수 있습니다.
@batchSize
데코레이터를 사용하여 Bicep에서 복사 루프를 실행하는 방법을 제어할 수 있습니다. for
키워드를 사용하여 리소스 또는 모듈 선언에 데코레이터를 추가합니다.
@batchSize
데코레이터가 없는 App Service 애플리케이션 집합에 대한 Bicep 정의 예제를 살펴보겠습니다.
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
name: 'app${i}'
// ...
}]
이 루프의 모든 리소스는 동시에 병렬로 배포됩니다.
이제 2
값을 사용하여 @batchSize
데코레이터를 적용하겠습니다.
@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
name: 'app${i}'
// ...
}]
템플릿을 배포할 때 Bicep은 두 가지를 일괄 처리로 배포합니다.
참고
Bicep은 각 전체 일괄 처리가 완료되도록 기다렸다가 다음으로 진행합니다. 이전 예제에서 app2가 app1 전에 배포를 마치는 경우 Bicep은 app1이 완료될 때까지 기다린 후에 app3을 배포하기 시작합니다.
@batchSize
를 1
로 설정하여 루프를 순차적으로 실행하도록 Bicep에 알릴 수도 있습니다.
@batchSize(1)
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
name: 'app${i}'
// ...
}]
템플릿을 배포하면 Bicep은 리소스 배포가 완료될 때까지 기다린 후에 다음 작업을 시작합니다.
리소스 속성과 함께 루프 사용
루프를 사용하여 리소스 속성을 설정할 수 있습니다. 예를 들어 가상 네트워크를 배포하는 경우 해당 서브넷을 지정해야 합니다. 서브넷에는 두 가지 중요한 정보, 즉 이름 및 주소 접두사가 있어야 합니다. 각 환경에 대해 다른 서브넷을 지정할 수 있도록 개체의 배열과 함께 매개 변수를 사용할 수 있습니다.
param subnetNames array = [
'api'
'worker'
]
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
name: 'teddybear'
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/16'
]
}
subnets: [for (subnetName, i) in subnetNames: {
name: subnetName
properties: {
addressPrefix: '10.0.${i}.0/24'
}
}]
}
}
이 예제에서 for
루프는 subnets
속성 값을 기준으로 리소스 정의 내에 표시됩니다.
중첩된 루프
일부 시나리오에서는 다른 루프 내의 루프, 즉 ‘중첩된 루프’를 사용해야 합니다. Bicep을 사용하여 중첩된 루프를 만들 수 있습니다.
언급한 곰 인형 회사의 경우 곰 인형이 출시되는 모든 국가/지역에서 가상 네트워크를 배포해야 합니다. 모든 가상 네트워크에는 다른 주소 공간과 두 개의 서브넷이 필요합니다. 먼저 가상 네트워크를 루프로 배포해 보겠습니다.
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
var subnetCount = 2
resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for (location, i) in locations : {
name: 'vnet-${location}'
location: location
properties: {
addressSpace:{
addressPrefixes:[
'10.${i}.0.0/16'
]
}
}
}]
이 루프는 각 위치에 대한 가상 네트워크를 배포하고 루프 인덱스를 사용하여 가상 네트워크에 대해 addressPrefix
를 설정함으로써 각 가상 네트워크가 서로 다른 주소 접두사를 갖도록 합니다.
중첩된 루프를 사용하여 각 가상 네트워크 내에서 서브넷을 배포할 수 있습니다.
resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-01-01' = [for (location, i) in locations : {
name: 'vnet-${location}'
location: location
properties: {
addressSpace:{
addressPrefixes:[
'10.${i}.0.0/16'
]
}
subnets: [for j in range(1, subnetCount): {
name: 'subnet-${j}'
properties: {
addressPrefix: '10.${i}.${j}.0/24'
}
}]
}
}]
중첩된 루프는 range()
함수를 사용하여 두 개의 서브넷을 만듭니다.
템플릿을 배포할 때 다음 가상 네트워크 및 서브넷을 가져옵니다.
가상 네트워크 이름 | Location | 주소 접두사 | 서브넷 |
---|---|---|---|
vnet-westeurope |
westeurope |
10.0.0.0/16 |
10.0.1.0/24 , 10.0.2.0/24 |
vnet-eastus2 |
eastus2 |
10.1.0.0/16 |
10.1.1.0/24 , 10.1.2.0/24 |
vnet-eastasia |
eastasia |
10.2.0.0/16 |
10.2.1.0/24 , 10.2.2.0/24 |