惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
The Cloudflare Blog
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
L
LangChain Blog
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
I
InfoQ
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
H
Help Net Security
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Bicep: A Linguagem Moderna de IaC para Azure
Luis Cruz · 2026-06-03 · via DEV Community

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

Enter fullscreen mode Exit fullscreen mode

Bicep (equivalente):

param storageAccountName string

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

Enter fullscreen mode Exit fullscreen mode

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

Instalar o Bicep CLI

# Via Azure CLI (recomendado)
az bicep install

# Verificar versão
az bicep version

Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode

3. Recursos (resource)

resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: 'plan-${environment}'
  location: location
  tags: tags
  sku: {
    name: 'B1'
    tier: 'Basic'
  }
}

Enter fullscreen mode Exit fullscreen mode

4. Outputs (output)

output appServicePlanId string = appServicePlan.id
output storageAccountEndpoint string = storageAccount.properties.primaryEndpoints.blob

Enter fullscreen mode Exit fullscreen mode


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

Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode


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

Enter fullscreen mode Exit fullscreen mode

// main.bicep — usando o módulo
module storage './modules/storage.bicep' = {
  name: 'storageDeployment'
  params: {
    name: 'mystorageaccount'
  }
}

output storageId string = storage.outputs.id

Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode


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

Enter fullscreen mode Exit fullscreen mode


Dicas e Boas Práticas

  1. Use parâmetros com defaults para ambientes distintos (dev, staging, prod)
  2. Adicione tags em todos os recursos para facilitar o custo e governança
  3. Use what-if antes de todo deploy em produção
  4. Organize em módulos desde o início evita refatorações grandes depois
  5. Versione no Git junto ao código da aplicação (mesmo repositório)
  6. Use o Bicep Registry (Azure Container Registry) para compartilhar módulos entre projetos e times

Próximos passos

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!