Última revisão: maio de 2026
Construa os serviços da AWS do exame DP-900 com Terraform puro — um bloco de cada vez, cada um vinculado a um domínio do exame. O mesmo código funciona no OpenTofu.
Ao final deste laboratório, você terá provisionado, com Terraform puro, as três formas de plataforma de dados que o DP-900 testa — uma conta de Armazenamento do Azure para dados de blob/analíticos com uma política de ciclo de vida, um Banco de Dados SQL do Azure relacional em um servidor de camada Básica e uma conta Cosmos DB sem servidor para JSON não relacional. Uma pilha, três substratos, cada um ligado a um domínio DP-900.
Cada recurso é Terraform puro. Solte os trechos em um único main.tf, execute terraform init e, em seguida, terraform apply passo a passo.
>= 1.5 ou OpenTofu >= 1.6.az login).Cenário misto — dois baratos, um com custo real:
A pilha completa custa aproximadamente $5–8/mês em execução. Destrua prontamente quando terminar — o Banco de Dados SQL é o único item que cobra 24/7, independentemente de você estar usando-o.
Abertura padrão do Azure consolidada em um bloco: fixar azurerm ~> 4.0, registrar os provedores random e random_password (usaremos ambos — random_id para nomes de recursos únicos, random_password para a senha do administrador SQL) e criar o Grupo de Recursos.
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 = 2
}
locals {
tags = {
Project = "certlabpro-dp-900"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-dp-900-rg"
location = "eastus"
tags = local.tags
}O Armazenamento do Azure é o substrato de dados analíticos que toda questão do DP-900 assume (camadas Hot / Cool / Archive, a política de ciclo de vida que transiciona dados frios automaticamente). Ativamos o namespace hierárquico (is_hns_enabled = true) que converte a conta em Azure Data Lake Storage Gen2 — a versão que o Azure Synapse, Databricks e Fabric esperam para cargas de trabalho analíticas.
A política de ciclo de vida é o mecanismo de otimização de custos do DP-900 mais testado: camada Hot para dados ativos, Cool após 30 dias, Archive após 90 dias. Três camadas, três janelas de retenção — o exame mencionará esses números em cenários.
resource "azurerm_storage_account" "analytics" {
name = "dp900data${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"
is_hns_enabled = true # Data Lake Storage Gen2
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
tags = local.tags
}
resource "azurerm_storage_management_policy" "analytics" {
storage_account_id = azurerm_storage_account.analytics.id
rule {
name = "tier-cold-data"
enabled = true
filters {
blob_types = ["blockBlob"]
prefix_match = ["raw/"]
}
actions {
base_blob {
tier_to_cool_after_days_since_modification_greater_than = 30
tier_to_archive_after_days_since_modification_greater_than = 90
}
}
}
}Dados relacionais no Azure significam Banco de Dados SQL do Azure (PaaS, totalmente gerenciado). O DP-900 testa a distinção entre SQL Database (banco de dados único, sem servidor ou baseado em DTU, PaaS) versus SQL Managed Instance (compatibilidade quase 100% com SQL Server, PaaS de grande instância) versus SQL Server em VM (IaaS, controle total).
Nós provisionamos um contêiner lógico do SQL Server (o endpoint da string de conexão) mais um banco de dados abaixo dele na camada Básica — o SKU pago mais barato. A criptografia em trânsito (TLS 1.2) é sempre imposta. A regra de firewall permite que os serviços do Azure se conectem (a típica pergunta do DP-900 "como meu Serviço de Aplicativo se comunica com meu SQL?" — esta regra é a resposta).
resource "random_password" "sql_admin" {
length = 24
special = true
min_upper = 2
min_lower = 2
min_numeric = 2
}
resource "azurerm_mssql_server" "main" {
name = "certlabpro-dp-900-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
version = "12.0"
administrator_login = "sqladmin"
administrator_login_password = random_password.sql_admin.result
minimum_tls_version = "1.2"
public_network_access_enabled = true
tags = local.tags
}
resource "azurerm_mssql_database" "main" {
name = "certlabpro-dp-900-db"
server_id = azurerm_mssql_server.main.id
sku_name = "Basic"
max_size_gb = 2
zone_redundant = false
tags = local.tags
}
resource "azurerm_mssql_firewall_rule" "allow_azure_services" {
name = "AllowAzureServices"
server_id = azurerm_mssql_server.main.id
start_ip_address = "0.0.0.0"
end_ip_address = "0.0.0.0" # 0.0.0.0/0.0.0.0 = "allow Azure services" sentinel
}Dados não relacionais no Azure significam Azure Cosmos DB, um banco de dados multi-API distribuído globalmente. O DP-900 testa especificamente a distinção da API — NoSQL (API Core / SQL, a mais comum), MongoDB, Cassandra, Gremlin e Table. Usamos a API SQL Core + modo de capacidade sem servidor (pagamento por solicitação, sem cobrança por ociosidade — a pergunta de anti-padrão de custo do DP-900 para sem servidor versus provisionado).
O consistency_level = "Session" é o padrão do Cosmos DB e o nível de consistência mais testado no DP-900: linearizabilidade por sessão com ótima latência. Os outros quatro — Forte, Limitação de defasagem (Bounded staleness), Eventual, Prefixo consistente — são tópicos conceituais de exame.
Com os três substratos de dados em vigor (blob na Etapa 2, SQL na Etapa 3, Cosmos na Etapa 4), o domínio Conceitos de Dados Essenciais do DP-900 ganha forma tátil: "qual serviço do Azure para qual forma de dados" é respondido por esses três recursos.
resource "azurerm_cosmosdb_account" "main" {
name = "certlabpro-dp-900-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
offer_type = "Standard"
kind = "GlobalDocumentDB" # Core (SQL) API
capabilities {
name = "EnableServerless"
}
consistency_policy {
consistency_level = "Session"
}
geo_location {
location = azurerm_resource_group.main.location
failover_priority = 0
}
tags = local.tags
}Um terraform destroy padrão derruba tudo neste laboratório. Duas notas:
random_password — ela é armazenada no estado do Terraform. Se você enviar o estado para o git, você terá enviado a senha. Use um backend de estado remoto (Azure Storage com versionamento + soft delete) em qualquer configuração não trivial.O DP-900 abrange muitos serviços de dados que este laboratório não pode incluir — Azure Synapse Analytics (abordado no DP-600/DP-700), Azure Databricks, Azure Data Factory, Microsoft Fabric, Azure Stream Analytics, Event Hubs, Azure SQL Managed Instance, Azure Database for PostgreSQL / MySQL / MariaDB, Power BI e os serviços de análise do Azure que cobram caro enquanto ociosos (pools SQL dedicados do Synapse, pools Spark dedicados).
Nós nos concentramos nas três formas de dados principais (blob/analítico, relacional, não relacional) porque o DP-900 é fundamentalmente um exame sobre qual serviço para qual forma. Uma vez que você internaliza os três substratos que este laboratório provisiona, todas as outras questões do DP-900 se tornam perguntas de camadas sobre eles.
Para cobertura serviço a serviço, consulte as seções Navegar, Guia e Editorial desta página de certificação.