Início Rápido: criar várias instâncias de recursos no Bicep

Saiba como usar sintaxes for diferentes para criar várias instâncias de recursos no Bicep. Embora este artigo mostre apenas a criação de várias instâncias de recursos, os mesmos métodos podem ser usados para definir cópias de módulo, variável, propriedade ou saída. Para saber mais, confira as Loops do Bicep.

Este artigo inclui as seções a seguir:

Pré-requisitos

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Para configurar seu ambiente para o desenvolvimento do Bicep, confira Instalar ferramentas do Bicep. Depois de concluir essas etapas, você terá o Visual Studio Code e a extensão Bicep. Você também terá a CLI do Azure mais recente ou o módulo do Azure PowerShell mais recente.

Criar uma única instância

Nesta seção, você define um arquivo Bicep para criar uma conta de armazenamento e, em seguida, implanta o arquivo Bicep. As seções subsequentes fornecem as amostras Bicep para diferentes sintaxes for. Você pode usar o mesmo método de implantação para implantar e experimentar essas amostras. Se sua implantação falhar, provavelmente será uma das duas causas:

  • O nome da conta de armazenamento é muito longo. Os nomes da conta de armazenamento devem ter entre 3 e 24 caracteres e podem conter apenas números e letras minúsculas.
  • O nome da conta de armazenamento não é exclusivo. O nome da sua conta de armazenamento deve ser exclusivo no Azure.

O seguinte arquivo Bicep define uma conta de armazenamento:

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'
}

Salve o arquivo Bicep localmente e use a CLI do Azure ou o Azure PowerShell para implantar o arquivo 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

Usar índice de número inteiro

Um loop para com um índice é usado na amostra a seguir para criar duas contas de armazenamento:

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
} ]

O número de índice é usado como parte do nome da conta de armazenamento. Depois de implantar o arquivo Bicep, você obterá duas contas de armazenamento semelhantes a:

Usar índice de inteiros com 0 como o número inicial

Dentro do intervalo(), o primeiro número é o número inicial e o segundo número é o número de vezes que o loop será executado. Portanto, se você alterá-lo para intervalo(3,2), também receberá duas contas de armazenamento:

Usar índice de inteiros com 3 como o número inicial

A saída da amostra anterior mostra como fazer referência aos recursos criados em um loop. A saída deverá ser semelhante a:

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

Usar elemento de matriz

Você pode fazer loop por meio de uma matriz. A amostra a seguir mostra uma matriz de cadeias de caracteres.

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'
}]

O loop usa todas as cadeias de caracteres na matriz como parte dos nomes de conta de armazenamento. Nesse caso, ele cria duas contas de armazenamento:

Usar uma matriz de cadeias de caracteres

Você também pode fazer loop através de uma matriz de objetos. O loop não apenas personaliza os nomes de conta de armazenamento, mas também configura as SKUs.

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'
}]

O loop cria duas contas de armazenamento. A SKU da conta de armazenamento com o nome começando com fabrikam é Premium_LRS.

Usar uma matriz de cadeias de caracteres

Usar matriz e índice

Nos mesmos casos, talvez você queira combinar um loop de matriz com um loop de índice. A amostra a seguir mostra como usar a matriz e o número de índice da convenção de nomenclatura.

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'
}]

Depois de implantar a amostra anterior, crie duas contas de armazenamento semelhantes a:

Usar uma matriz de cadeias de caracteres e número de índice

Usar objeto de dicionário

Para iterar sobre elementos em um objeto de dicionário, use a função Itens, que converte o objeto em uma matriz. Use a propriedade value para obter propriedades sobre os objetos.

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'
}]

O loop cria duas contas de armazenamento. A SKU da conta de armazenamento com o nome começando com fabrikam é Premium_LRS.

Usar um objeto de dicionário

Loop com condição

Em recursos e módulos, é possível adicionar uma expressão if com a sintaxe de loop para implantar condicionalmente a coleção.

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'
}]

Para obter mais informações, confira Implantação condicional no Bicep.

Limpar os recursos

Quando os recursos do Azure não forem mais necessários, use o módulo da CLI do Azure ou do Azure PowerShell para excluir o grupo de recursos de início rápido.

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

az group delete --name $resourceGroupName

Próximas etapas