Se você já trabalhou com ARM Templates na Azure, sabe bem o quanto pode ser frustrante: arquivos JSON verbosos, difíceis de ler e ainda mais difíceis de manter. O Bicep chegou para resolver exatamente isso, uma linguagem de domínio específico (DSL) criada pela Microsoft para declarar infraestrutura no Azure de forma limpa, simples e poderosa.
O que é o Bicep?
Bicep é uma linguagem de IaC (Infrastructure as Code) desenvolvida pela Microsoft que compila diretamente para ARM Templates. Ou seja, por baixo dos panos, a Azure ainda usa ARM, mas você escreve um código muito mais legível e produtivo.
"Bicep é o ARM Template que você sempre quis escrever."
Lançado em 2021 como GA (Generally Available), o Bicep é hoje a forma recomendada pela Microsoft para definir recursos Azure via código.
Por que usar Bicep e não ARM Templates puro?
Veja a diferença para criar um simples Storage Account:
ARM Template (JSON):
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string"
}
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[parameters('storageAccountName')]",
"location": "[resourceGroup().location]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
Bicep (equivalente):
param storageAccountName string
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: storageAccountName
location: resourceGroup().location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
Muito mais limpo, não é? Menos linhas, sem JSON aninhado e sem aquelas funções [parameters(...)] espalhadas por todo lado.
Bicep vs ARM vs Terraform: qual escolher?
| Característica | Bicep | ARM Template | Terraform |
|---|---|---|---|
| Sintaxe | Limpa, DSL própria | JSON verboso | HCL |
| Multi-cloud | ❌ Apenas Azure | ❌ Apenas Azure | ✅ Sim |
| Suporte a recursos Azure | ✅ Primeiro dia | ✅ Primeiro dia | ⚠️ Depende do provider |
| Curva de aprendizado | Baixa | Alta | Média |
| State file | ❌ Não precisa | ❌ Não precisa | ✅ Necessário |
| Módulos | ✅ Sim | ⚠️ Linked templates | ✅ Sim |
| Integração nativa Azure DevOps/GitHub | ✅ Nativa | ✅ Nativa | Requer setup |
Resumo prático:
- Se você trabalha exclusivamente com Azure → Bicep é a melhor escolha
- Se precisa de multi-cloud → Terraform
- Se está migrando ARM existente → Bicep (tem conversor automático!)
Instalação
Pré-requisitos
- Azure CLI instalado
Instalar o Bicep CLI
# Via Azure CLI (recomendado)
az bicep install
# Verificar versão
az bicep version
Extensão para VS Code
Instale a extensão oficial Bicep da Microsoft no VS Code. Ela oferece:
- IntelliSense completo
- Validação em tempo real
- Autocompletar de tipos de recursos e propriedades
- Visualização do diagrama de dependências
Conceitos Fundamentais
1. Parâmetros (param)
@description('Nome do ambiente')
@allowed(['dev', 'staging', 'prod'])
param environment string = 'dev'
@minLength(3)
@maxLength(24)
param storageAccountName string
Os decorators (@description, @allowed, @minLength) substituem as validações que no ARM eram feitas dentro do JSON.
2. Variáveis (var)
var location = resourceGroup().location
var tags = {
environment: environment
project: 'meu-projeto'
managedBy: 'bicep'
}
3. Recursos (resource)
resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
name: 'plan-${environment}'
location: location
tags: tags
sku: {
name: 'B1'
tier: 'Basic'
}
}
4. Outputs (output)
output appServicePlanId string = appServicePlan.id
output storageAccountEndpoint string = storageAccount.properties.primaryEndpoints.blob
Exemplo Prático: Web App com Storage
Vamos criar um arquivo Bicep que provisiona um App Service + Storage Account completo:
// main.bicep
@description('Prefixo para os recursos')
param prefix string
@description('Ambiente de deploy')
@allowed(['dev', 'staging', 'prod'])
param environment string = 'dev'
var location = resourceGroup().location
var tags = {
environment: environment
managedBy: 'bicep'
}
// Storage Account
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: '${prefix}${environment}st'
location: location
tags: tags
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
supportsHttpsTrafficOnly: true
minimumTlsVersion: 'TLS1_2'
}
}
// App Service Plan
resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
name: '${prefix}-${environment}-plan'
location: location
tags: tags
sku: {
name: environment == 'prod' ? 'S1' : 'B1'
}
}
// Web App
resource webApp 'Microsoft.Web/sites@2022-03-01' = {
name: '${prefix}-${environment}-app'
location: location
tags: tags
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
siteConfig: {
appSettings: [
{
name: 'STORAGE_CONNECTION'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
]
}
}
}
output webAppUrl string = 'https://${webApp.properties.defaultHostName}'
output storageAccountName string = storageAccount.name
Deploy
# Criar Resource Group
az group create --name rg-meu-projeto-dev --location brazilsouth
# Preview do que será criado (What-If)
az deployment group what-if \
--resource-group rg-meu-projeto-dev \
--template-file main.bicep \
--parameters prefix=meuprojeto environment=dev
# Deploy
az deployment group create \
--resource-group rg-meu-projeto-dev \
--template-file main.bicep \
--parameters prefix=meuprojeto environment=dev
Módulos: reutilizando código
Uma das funcionalidades mais poderosas do Bicep são os módulos, que permitem quebrar a infraestrutura em partes reutilizáveis:
// modules/storage.bicep
param name string
param location string = resourceGroup().location
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: name
location: location
sku: { name: 'Standard_LRS' }
kind: 'StorageV2'
}
output id string = storageAccount.id
// main.bicep — usando o módulo
module storage './modules/storage.bicep' = {
name: 'storageDeployment'
params: {
name: 'mystorageaccount'
}
}
output storageId string = storage.outputs.id
Você também pode referenciar módulos diretamente de um Bicep Registry (ACR) para compartilhar entre times:
module storage 'br:meuregistry.azurecr.io/bicep/storage:v1.0' = {
name: 'storageDeployment'
params: {
name: 'mystorageaccount'
}
}
Convertendo ARM Templates existentes para Bicep
Se você já tem ARM Templates, a migração é simples:
# Decompila ARM Template para Bicep
az bicep decompile --file template.json
# Converte Bicep de volta para ARM (útil para debug)
az bicep build --file main.bicep
Dicas e Boas Práticas
-
Use parâmetros com defaults para ambientes distintos (
dev,staging,prod) - Adicione tags em todos os recursos para facilitar o custo e governança
-
Use
what-ifantes de todo deploy em produção - Organize em módulos desde o início evita refatorações grandes depois
- Versione no Git junto ao código da aplicação (mesmo repositório)
- Use o Bicep Registry (Azure Container Registry) para compartilhar módulos entre projetos e times
Próximos passos
- Documentação oficial do Bicep
- Bicep Playground — teste Bicep no browser
- Azure Verified Modules — módulos Bicep oficiais e auditados pela Microsoft
O Bicep é, sem dúvida, a evolução natural para quem trabalha com IaC na Azure. Se você ainda usa ARM Templates puros, vale muito a pena considerar a migração, pois a curva de aprendizado é baixa e os ganhos em produtividade e manutenibilidade são imediatos.
E você, já está usando Bicep nos seus projetos? Deixa nos comentários!
Top comments (0)