Última revisão: maio de 2026
Construa os serviços da AWS do exame AZ-204 com Terraform puro — um bloco de cada vez, cada um vinculado a um domínio do exame. O mesmo código funciona no OpenTofu.
Até o final deste laboratório, você terá provisionado, com Terraform puro, o aplicativo web PaaS canônico do Azure — um Plano do Serviço de Aplicativo + Aplicativo Web Linux com identidade gerenciada, uma conta Cosmos DB para estado, um workspace do Application Insights para telemetria e uma Conta de Armazenamento que o aplicativo pode usar para trabalho com blobs/arquivos. Cinco blocos; a arquitetura de referência AZ-204.
Solte os snippets em um único main.tf, execute terraform init, e então terraform apply passo a passo.
>= 1.5 ou OpenTofu >= 1.6.az login).az webapp deploy). Este laboratório provisiona o shell da infraestrutura — a implantação de código é o domínio Implementar DevOps do AZ-204 e reside fora do Terraform.O custo ocioso da pilha completa é de aproximadamente ~$13/mês com o plano B1. Mude para F1 para testes gratuitos (remova a identidade gerenciada na Etapa 3) ou destrua prontamente.
Início padrão do Azure. Os nomes dos aplicativos web do App Service devem ser globalmente únicos (publicados no DNS como <name>.azurewebsites.net) — random_id evita colisões.
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = { source = "hashicorp/azurerm", version = "~> 4.0" }
random = { source = "hashicorp/random", version = "~> 3.6" }
}
}
provider "azurerm" {
features {}
}
resource "random_id" "suffix" {
byte_length = 3
}
locals {
tags = {
Project = "certlabpro-az-204"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-204-rg"
location = "eastus"
tags = local.tags
}O AZ-204 espera que você use o Cosmos DB sempre que a pergunta disser milissegundos de um dígito em escala, distribuído globalmente ou NoSQL com consulta semelhante a SQL. O modo de capacidade serverless é o padrão de otimização de custos — pague por RU, $0 ocioso, testado no exame como a escolha certa para ambientes de baixo volume / desenvolvimento.
Nós criamos a conta, um banco de dados e um contêiner com uma chave de partição. A escolha da chave de partição (/userId aqui) é a pergunta mais testada do Cosmos do AZ-204 — chaves de partição ruins causam partições quentes; boas distribuem a carga uniformemente. O exame testa este padrão com cenários de cardinalidade.
resource "azurerm_cosmosdb_account" "main" {
name = "certlabpro-az-204-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
offer_type = "Standard"
kind = "GlobalDocumentDB"
capabilities {
name = "EnableServerless"
}
consistency_policy {
consistency_level = "Session"
}
geo_location {
location = azurerm_resource_group.main.location
failover_priority = 0
}
tags = local.tags
}
resource "azurerm_cosmosdb_sql_database" "app" {
name = "appdb"
resource_group_name = azurerm_resource_group.main.name
account_name = azurerm_cosmosdb_account.main.name
}
resource "azurerm_cosmosdb_sql_container" "users" {
name = "users"
resource_group_name = azurerm_resource_group.main.name
account_name = azurerm_cosmosdb_account.main.name
database_name = azurerm_cosmosdb_sql_database.app.name
partition_key_paths = ["/userId"]
}Os domínios Implementar Segurança do Azure e Monitorar, Solucionar Problemas e Otimizar do AZ-204 ambos dependem do Application Insights — o serviço APM para rastreamentos distribuídos, rastreamento de dependências, captura de exceções e métricas em tempo real. Instâncias modernas do App Insights exigem um workspace do Log Analytics como seu backend de dados (o modo baseado em workspace; o modo clássico está obsoleto).
Criamos ambos e a chave de instrumentação + string de conexão são obtidas como atributos do App Insights — conectados ao Serviço de Aplicativo na Etapa 4 via configurações do aplicativo.
resource "azurerm_log_analytics_workspace" "main" {
name = "certlabpro-az-204-logs"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "PerGB2018"
retention_in_days = 30
tags = local.tags
}
resource "azurerm_application_insights" "main" {
name = "certlabpro-az-204-appi"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
workspace_id = azurerm_log_analytics_workspace.main.id
application_type = "web"
tags = local.tags
}O Serviço de Aplicativo é o host web PaaS preferido do AZ-204. O Plano do Serviço de Aplicativo é o contêiner de computação (pense em EC2 sob a abstração); os aplicativos web dentro dele compartilham a computação do plano. Usamos um plano Linux B1 e um único Aplicativo Web com o tempo de execução Node.js 20 — mude para python, dotnet, java ou php para corresponder à sua pilha.
A identidade gerenciada atribuída ao sistema é a resposta do AZ-204 para credenciais sem senha para o aplicativo acessar outros serviços do Azure (Key Vault, Storage, Cosmos DB). Uma vez concedidas as funções RBAC nesses recursos, o Serviço de Aplicativo os chama com tokens emitidos pelo Entra — sem strings de conexão nas configurações do aplicativo.
O bloco app_settings injeta variáveis de ambiente: string de conexão do App Insights, endpoint do Cosmos e um sinalizador. O aplicativo web começa como um shell vazio — o código é implantado separadamente. O laboratório trata de acertar a infraestrutura.
resource "azurerm_service_plan" "main" {
name = "certlabpro-az-204-plan"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
os_type = "Linux"
sku_name = "B1"
tags = local.tags
}
resource "azurerm_linux_web_app" "main" {
name = "certlabpro-az-204-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_service_plan.main.location
service_plan_id = azurerm_service_plan.main.id
https_only = true
site_config {
always_on = true
application_stack {
node_version = "20-lts"
}
}
identity {
type = "SystemAssigned"
}
app_settings = {
APPLICATIONINSIGHTS_CONNECTION_STRING = azurerm_application_insights.main.connection_string
COSMOS_ENDPOINT = azurerm_cosmosdb_account.main.endpoint
WEBSITES_ENABLE_APP_SERVICE_STORAGE = "false"
}
tags = local.tags
}
# Grant the web app's managed identity Cosmos DB data-plane access
# (Cosmos DB Built-in Data Contributor — the AZ-204 password-less pattern).
resource "azurerm_cosmosdb_sql_role_assignment" "webapp" {
resource_group_name = azurerm_resource_group.main.name
account_name = azurerm_cosmosdb_account.main.name
role_definition_id = "${azurerm_cosmosdb_account.main.id}/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002"
principal_id = azurerm_linux_web_app.main.identity[0].principal_id
scope = azurerm_cosmosdb_account.main.id
}Todo aplicativo web PaaS do Azure eventualmente precisa de armazenamento de blob/arquivo — arquivos enviados, avatares de usuário, PDFs gerados, imagens processadas. Provisionamos a conta com padrões de segurança padrão e concedemos à identidade gerenciada do aplicativo Storage Blob Data Contributor para que o aplicativo possa ler/gravar blobs sem uma string de conexão.
Isso fecha o ciclo do AZ-204 Desenvolver Soluções de Computação do Azure: aplicativo + estado (Cosmos) + telemetria (App Insights) + armazenamento de blob, tudo conectado via identidade gerenciada em vez de segredos. Cada padrão AZ-204 adicional (fila do Service Bus, tópico do Event Grid, segredos do Key Vault, integração do Logic App) se anexa da mesma forma — dê à identidade gerenciada a função correta no escopo correto.
resource "azurerm_storage_account" "app_blobs" {
name = "az204app${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
tags = local.tags
}
resource "azurerm_role_assignment" "webapp_blobs" {
scope = azurerm_storage_account.app_blobs.id
role_definition_name = "Storage Blob Data Contributor"
principal_id = azurerm_linux_web_app.main.identity[0].principal_id
}terraform destroy derruba tudo. O Plano do Serviço de Aplicativo B1 é o item de linha que cobra 24/7 (~$13/mês). O plano permanece no RG mesmo depois que o aplicativo web é removido se você fizer o scale-in incorretamente — terraform destroy remove ambos. O Cosmos DB serverless e o App Insights param de cobrar imediatamente após a destruição.
O AZ-204 abrange mais serviços de desenvolvedor que este laboratório não pode incluir — Azure Functions (serverless orientado a eventos), Container Apps, AKS, Service Bus, Event Grid, Event Hubs, Logic Apps, Durable Functions, API Management, Front Door, CDN, Notification Hubs, SignalR e Azure Key Vault para armazenamento de segredos (um acompanhamento comum do AZ-204 após a identidade gerenciada).
Nós nos mantemos na linha de base App Service + Cosmos + App Insights + Storage porque é a forma de aplicativo web PaaS mais testada no exame — e todos os outros padrões AZ-204 (Functions, Service Bus, Key Vault) se conectam a esta base via identidade gerenciada + RBAC.
Para as superfícies acima, consulte as seções Navegar, Guia e Editorial desta página de certificação.