(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como usar loops no Bicep para criar vários recursos

João Barros 07 de July de 2026 4 min de leitura

Criar dez contas de armazenamento à mão, uma a uma, é lento e propenso a erros. Com loops no Bicep declaras o recurso uma só vez e o Azure cria tantas instâncias quantas precisares a partir de uma lista. Este guia mostra, passo a passo, como usar o loop for no Bicep para criar vários recursos de forma limpa e reutilizável.

Pré-requisitos

  • Uma subscrição do Azure ativa.
  • O Azure CLI instalado, ou o Cloud Shell dentro do portal do Azure.
  • A extensão Bicep no VS Code (opcional, mas ajuda a escrever).
  • Noções básicas de Bicep: o que são parâmetros e recursos.

Passo 1: Criar o resource group

Todos os recursos vivem dentro de um resource group. Vamos criar um só para esta demonstração, para depois ser fácil apagar tudo de uma vez. Abre um terminal e corre:

az group create \
  --name rg-bicep-loops \
  --location westeurope

Guarda o nome rg-bicep-loops: é para aqui que vamos enviar o template.

Passo 2: Criar um loop sobre uma lista

Cria um ficheiro chamado main.bicep. A ideia central é simples: declaras um array com os dados de cada conta e envolves o recurso em [for ... : { ... }]. O Bicep percorre a lista e cria uma conta por cada item.

param location string = resourceGroup().location

param contas array = [
  {
    nome: 'vendas'
    sku: 'Standard_LRS'
  }
  {
    nome: 'compras'
    sku: 'Standard_GRS'
  }
]

resource storage 'Microsoft.Storage/storageAccounts@2023-01-01' = [for conta in contas: {
  name: 'st${conta.nome}${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: conta.sku
  }
  kind: 'StorageV2'
}]

Repara em dois pormenores. O for conta in contas dá-te, em cada volta, o objeto atual da lista, e usas os seus campos (conta.nome e conta.sku) para personalizar cada recurso. A função uniqueString(resourceGroup().id) gera um sufixo previsível que ajuda a manter o nome único a nível global, uma exigência das contas de armazenamento.

O nome de uma conta de armazenamento só aceita letras minúsculas e números e tem de ter entre 3 e 24 caracteres. Como uniqueString ocupa 13 caracteres, mantém os prefixos curtos para não ultrapassar o limite.

Passo 3: Usar o índice com range()

Às vezes não tens uma lista de objetos: só queres N cópias iguais. Nesse caso, usa a função range() para gerar uma sequência de números e apanha o índice em cada volta. Esta é uma alternativa ao Passo 2:

param location string = resourceGroup().location
param numeroDeContas int = 3

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

O range(0, 3) produz os números 0, 1 e 2, por isso o Bicep cria três contas. Como o índice i entra no nome, cada conta fica com um nome diferente e válido.

Passo 4: Fazer o deploy e devolver os nomes

Com o ficheiro main.bicep pronto, envia-o para o resource group que criaste no Passo 1:

az deployment group create \
  --resource-group rg-bicep-loops \
  --template-file main.bicep

O Azure lê o loop, expande-o para vários recursos e cria todas as contas numa única operação. Voltando à versão do Passo 2 (lista de objetos), podes ainda devolver os nomes gerados juntando este output ao fim do ficheiro:

output nomesCriados array = [for i in range(0, length(contas)): storage[i].name]

Verificar o resultado

Depois de o deploy terminar, confirma que as contas existem mesmo. No terminal, lista as contas de armazenamento do resource group:

az storage account list \
  --resource-group rg-bicep-loops \
  --output table

Deves ver uma linha por cada conta que o loop criou. Em alternativa, abre o resource group no portal do Azure e confirma visualmente. Para limpar tudo no fim, apaga o resource group inteiro com az group delete --name rg-bicep-loops.

Conclusão

Com uma só declaração de recurso e um loop for, passaste a criar vários recursos a partir de uma lista, sem copiar e colar blocos quase iguais. A partir daqui, experimenta combinar o loop com uma condição (if) para criar recursos apenas quando fizer sentido, ou aplica o mesmo padrão a módulos para escalar arquiteturas inteiras. Qual vai ser o primeiro recurso repetitivo que vais transformar num loop?