빠른 시작: Bicep에서 여러 리소스 인스턴스 만들기

여러 for 구문을 사용하여 Bicep에서 여러 리소스 인스턴스를 만드는 방법을 알아봅니다. 이 문서에서는 여러 리소스 인스턴스를 만드는 것만 보여주지만 동일한 메서드를 사용하여 모듈, 변수, 속성 또는 출력의 복사본을 정의할 수 있습니다. 자세한 내용은 Bicep 루프를 참조하세요.

이 문서의 토픽은 다음과 같습니다.

필수 조건

Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.

Bicep 개발 환경을 설정하려면 Bicep 도구 설치를 참조하세요. 해당 단계를 완료한 후 Visual Studio CodeBicep 확장을 사용할 수 있습니다. 최신 Azure CLI 또는 최신 Azure PowerShell 모듈을 사용할 수도 있습니다.

단일 인스턴스 만들기

이 섹션에서는 스토리지 계정을 만들기 위한 Bicep 파일을 정의한 다음, Bicep 파일을 배포합니다. 후속 섹션에서는 다양한 for 구문에 대한 Bicep 샘플을 제공합니다. 동일한 배포 방법을 사용하여 이러한 샘플을 배포하고 실험할 수 있습니다. 배포가 실패하면 다음 두 가지 원인 중 하나일 수 있습니다.

  • 스토리지 계정 이름이 너무 깁니다. Storage 계정 이름은 3자에서 24자 사이여야 하고 숫자 및 소문자만 포함할 수 있습니다.
  • 스토리지 계정 이름이 고유하지 않습니다. 스토리지 계정 이름은 Azure 내에서 고유해야 합니다.

다음 Bicep 파일은 하나의 스토리지 계정을 정의합니다.

param rgLocation string = resourceGroup().location

resource createStorage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

Bicep 파일을 로컬로 저장한 다음, Azure CLI 또는 Azure PowerShell을 사용하여 Bicep 파일을 배포합니다.

resourceGroupName = "{provide-a-resource-group-name}"
templateFile="{provide-the-path-to-the-bicep-file}"

az group create --name $resourceGroupName --location eastus

az deployment group create --resource-group $resourceGroupName --template-file $templateFile

정수 인덱스 사용

인덱스가 있는 for 루프는 스토리지 계정 2개를 만드는 다음 샘플에 사용됩니다.

param rgLocation string = resourceGroup().location
param storageCount int = 2

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for i in range(0, storageCount): {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output names array = [for i in range(0,storageCount) : {
  name: createStorages[i].name
} ]

인덱스 번호는 스토리지 계정 이름의 일부로 사용됩니다. Bicep 파일을 배포하면 다음과 같이 비슷한 스토리지 계정 2개를 얻게 됩니다.

Use integer index with 0 as the starting number

range() 내부의 첫 번째 숫자는 시작 번호이고, 두 번째 숫자는 루프가 실행되는 횟수입니다. 따라서 range(3,2)로 변경하면 다음과 같은 스토리지 계정 2개도 얻게 됩니다.

Use integer index with 3 as the starting number

위의 샘플의 출력은 루프에서 만든 리소스를 참조하는 방법을 보여줍니다. 는 다음과 유사하게 출력됩니다.

"outputs": {
  "names": {
    "type": "Array",
    "value": [
      {
        "name": "0storage52iyjssggmvue"
      },
      {
        "name": "1storage52iyjssggmvue"
      }
    ]
  }
},

배열 요소 사용

배열을 통해 반복할 수 있습니다. 다음 샘플은 문자열 배열을 보여줍니다.

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for name in storageNames: {
  name: '${name}str${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

이 루프는 배열의 모든 문자열을 스토리지 계정 이름의 일부로 사용합니다. 이 예에서는 다음과 같은 2개의 스토리지 계정을 만듭니다.

Use an array of strings

개체 배열을 반복할 수도 있습니다. 루프는 스토리지 계정 이름을 사용자 지정할 뿐만 아니라 SKU를 구성합니다.

param rgLocation string = resourceGroup().location
param storages array = [
  {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
]

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for storage in storages: {
  name: '${storage.name}obj${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: storage.skuName
  }
  kind: 'StorageV2'
}]

이 루프는 2개의 스토리지 계정을 만듭니다. 이름이 fabrikam으로 시작하는 스토리지 계정의 SKU는 Premium_LRS입니다.

Use an array of strings

배열 및 인덱스 사용

동일한 예에서 배열 루프를 인덱스 루프와 결합할 수 있습니다. 다음 샘플은 배열 및 인덱스 번호를 이름 규칙에 사용하는 방법을 보여줍니다.

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for (name, i) in storageNames: {
  name: '${i}${name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

이전 샘플을 배포한 후, 다음과 같이 유사한 스토리지 계정 2개를 만듭니다.

Use an array of strings and index number

사전 개체 사용

사전 개체의 요소를 반복하려면 개체를 배열로 변환하는 items 함수를 사용합니다. value 속성을 사용하여 개체의 속성을 가져옵니다.

param rgLocation string = resourceGroup().location

param storageConfig object = {
  storage1: {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  storage2: {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
}

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for config in items(storageConfig): {
  name: '${config.value.name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: config.value.skuName
  }
  kind: 'StorageV2'
}]

이 루프는 2개의 스토리지 계정을 만듭니다. 이름이 fabrikam으로 시작하는 스토리지 계정의 SKU는 Premium_LRS입니다.

Use a dictionary object

조건이 있는 루프

리소스 및 모듈의 경우 루프 구문과 함께 if 표현식을 추가하여 조건부로 컬렉션을 배포할 수 있습니다.

param rgLocation string = resourceGroup().location
param storageCount int = 2
param createNewStorage bool = true

resource createStorages 'Microsoft.Storage/storageAccounts@2022-09-01' = [for i in range(0, storageCount): if(createNewStorage) {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

자세한 내용은 Bicep의 조건부 배포를 참조하세요.

리소스 정리

Azure 리소스가 더 이상 필요 없으면 Azure CLI 또는 Azure PowerShell 모듈을 사용하여 빠른 시작 리소스 그룹을 삭제합니다.

resourceGroupName = "{provide-the-resource-group-name}"

az group delete --name $resourceGroupName

다음 단계