루프 실행 및 중첩 루프 제어

완료됨

강력한 복사 루프 기능을 사용하면 유연한 동적 템플릿을 만들 수 있습니다. 리소스를 만들 때 루프가 실행되는 방식을 제어하는 방법 및 루프를 사용하여 리소스 속성과 중첩 루프를 설정하는 방법을 이해하는 것이 중요합니다.

이 단원에서는 복사 루프의 실행을 제어하는 방법 및 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}'
  // ...
}]

이 루프의 모든 리소스는 동시에 병렬로 배포됩니다.

동시에 배포될 app1, app2, app3이 세로로 누적되고 가로 축에 시간을 보여 주는 다이어그램.

이제 2 값을 사용하여 @batchSize 데코레이터를 적용하겠습니다.

@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

템플릿을 배포할 때 Bicep은 두 가지를 일괄 처리로 배포합니다.

단일 일괄 처리로 실행할 app1 및 app2가 누적되고 app3을 두 번째 일괄 처리로 실행하도록 가로 축에 시간을 보여 주는 다이어그램.

참고

Bicep은 각 전체 일괄 처리가 완료되도록 기다렸다가 다음으로 진행합니다. 이전 예제에서 app2app1 전에 배포를 마치는 경우 Bicep은 app1이 완료될 때까지 기다린 후에 app3을 배포하기 시작합니다.

@batchSize1로 설정하여 루프를 순차적으로 실행하도록 Bicep에 알릴 수도 있습니다.

@batchSize(1)
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

템플릿을 배포하면 Bicep은 리소스 배포가 완료될 때까지 기다린 후에 다음 작업을 시작합니다.

app1, app2, app3이 순차적으로 배포되고 가로 축에 시간을 보여 주는 다이어그램.

리소스 속성과 함께 루프 사용

루프를 사용하여 리소스 속성을 설정할 수 있습니다. 예를 들어 가상 네트워크를 배포하는 경우 해당 서브넷을 지정해야 합니다. 서브넷에는 두 가지 중요한 정보, 즉 이름 및 주소 접두사가 있어야 합니다. 각 환경에 대해 다른 서브넷을 지정할 수 있도록 개체의 배열과 함께 매개 변수를 사용할 수 있습니다.

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