Última revisão: maio de 2026
Construa os serviços da AWS do exame PDE 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, o pipeline de streaming canônico do PDE — um bucket de ingestão do Cloud Storage, um tópico do Pub/Sub como entrada de eventos, um conjunto de dados + tabela do BigQuery particionado + agrupado para controle de custo de consulta, e um trabalho Dataflow Flex Template transmitindo Pub/Sub → BigQuery. Cinco blocos; o padrão Pub/Sub → Dataflow → BigQuery que o PDE testa em todos os exames.
Solte os trechos de código em um único main.tf, execute terraform init, depois terraform apply passo a passo.
>= 1.5 ou OpenTofu >= 1.6.your-project-id no bloco do provedor.Dataflow é o item a ser observado:
n1-standard-1): ~$50/mês enquanto em execução. Destrua prontamente após cada sessão de laboratório.~$50/mês enquanto o trabalho do Dataflow estiver em execução. Interrompa-o via gcloud dataflow jobs cancel se não pretender deixá-lo em execução.
Habilite as APIs do Cloud Storage, Pub/Sub, BigQuery e Dataflow.
terraform {
required_version = ">= 1.5"
required_providers {
google = { source = "hashicorp/google", version = "~> 6.0" }
}
}
provider "google" {
project = "your-project-id" # REPLACE
region = "us-central1"
}
locals {
labels = {
project = "certlabpro-pde"
managed_by = "terraform"
}
}
resource "google_project_service" "storage" {
service = "storage.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "pubsub" {
service = "pubsub.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "bigquery" {
service = "bigquery.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "dataflow" {
service = "dataflow.googleapis.com"
disable_on_destroy = false
}Os trabalhos do Dataflow precisam de um bucket de staging do GCS para arquivos temporários (Python wheels, uploads JAR, estado intermediário). Padrão recomendado pelo PDE: um bucket por domínio de dados, com subpastas para staging/, temp/ e templates/ para manter o estado operacional separado dos dados reais.
resource "random_id" "suffix" {
byte_length = 4
}
resource "google_storage_bucket" "ingest" {
name = "certlabpro-pde-ingest-${random_id.suffix.hex}"
location = "US"
uniform_bucket_level_access = true
force_destroy = true # lab-only
labels = local.labels
depends_on = [google_project_service.storage]
}Entrada de streaming canônica do PDE: publishers (clickstream, IoT, CDC) enviam eventos para um tópico do Pub/Sub; o Dataflow se inscreve e grava no BigQuery. O Pub/Sub oferece entrega durável e pelo menos uma vez, além da camada de desacoplamento que permite alterar os consumidores sem tocar nos produtores.
Criamos o tópico events + uma assinatura events-to-bq de propriedade do Dataflow. O ack_deadline_seconds = 60 da assinatura é a configuração do Dataflow recomendada pelo PDE; mais longo do que a cadência típica de emissão de janelas do Dataflow.
resource "google_pubsub_topic" "events" {
name = "events"
labels = local.labels
depends_on = [google_project_service.pubsub]
}
resource "google_pubsub_subscription" "events_to_bq" {
name = "events-to-bq"
topic = google_pubsub_topic.events.id
ack_deadline_seconds = 60
message_retention_duration = "604800s" # 7 days
labels = local.labels
}O exame PDE testa essa escolha de partição + cluster implacavelmente. Criamos a tabela events particionada por event_time (granularidade DIA, a escolha canônica recorrente do PDE) e agrupada por event_type — cada consulta que filtra por event_time pula partições irrelevantes, cada consulta que filtra por event_type pula blocos irrelevantes dentro da partição.
require_partition_filter = true força as consultas a incluir uma cláusula WHERE event_time >= ... — o recurso de proteção recomendado pelo PDE contra varreduras de tabela completas acidentalmente caras.
resource "google_bigquery_dataset" "analytics" {
dataset_id = "analytics"
location = "US"
delete_contents_on_destroy = true
labels = local.labels
depends_on = [google_project_service.bigquery]
}
resource "google_bigquery_table" "events" {
dataset_id = google_bigquery_dataset.analytics.dataset_id
table_id = "events"
deletion_protection = false
time_partitioning {
type = "DAY"
field = "event_time"
require_partition_filter = true
}
clustering = ["event_type"]
schema = jsonencode([
{ name = "event_time", type = "TIMESTAMP", mode = "REQUIRED" },
{ name = "event_type", type = "STRING", mode = "REQUIRED" },
{ name = "event_id", type = "STRING", mode = "REQUIRED" },
{ name = "payload", type = "JSON", mode = "NULLABLE" },
])
labels = local.labels
}Dataflow Flex Templates são a forma de trabalho canônica do PDE como recurso — o Google fornece modelos pré-construídos para padrões comuns (Pub/Sub → BigQuery, Pub/Sub → GCS, JDBC → BigQuery, etc.) e você os inicia com parâmetros.
Lançamos o modelo Pubsub_Subscription_to_BigQuery fornecido pelo Google contra a assinatura da Etapa 3 e a tabela da Etapa 4. O trabalho começa imediatamente após terraform apply; ele aparecerá em Dataflow → Jobs. Cancele-o quando terminar via gcloud dataflow jobs cancel <job-id> --region us-central1 para parar o faturamento do worker de ~$50/mês.
data "google_project" "current" {}
resource "google_dataflow_flex_template_job" "pubsub_to_bq" {
provider = google-beta
name = "certlabpro-pde-pubsub-to-bq"
container_spec_gcs_path = "gs://dataflow-templates-us-central1/latest/flex/PubSub_Subscription_to_BigQuery"
region = "us-central1"
parameters = {
inputSubscription = google_pubsub_subscription.events_to_bq.id
outputTableSpec = "${data.google_project.current.project_id}:${google_bigquery_dataset.analytics.dataset_id}.${google_bigquery_table.events.table_id}"
}
temp_location = "gs://${google_storage_bucket.ingest.name}/temp"
staging_location = "gs://${google_storage_bucket.ingest.name}/staging"
on_delete = "cancel"
depends_on = [google_project_service.dataflow]
}terraform destroy derruba tudo. O trabalho do Dataflow é cancelado (on_delete = "cancel") e o faturamento do worker para em poucos minutos. Os recursos Pub/Sub + BigQuery + GCS são destruídos de forma limpa. A tabela do BigQuery que contém os eventos ingeridos é excluída junto com o conjunto de dados (delete_contents_on_destroy).
O PDE abrange muitas superfícies de dados do GCP que este laboratório não consegue incluir — Dataproc (Hadoop / Spark gerenciado), Cloud Composer (Airflow gerenciado para orquestração de lotes), Cloud Data Fusion (ETL visual), Database Migration Service (DMS), Datastream (CDC de Oracle / MySQL / Postgres → BigQuery), Cloud Storage Transfer Service, BigQuery Omni / BigLake (tabelas multi-nuvem / externas), BigQuery ML (ML no banco de dados), BigQuery BI Engine (camada de consulta em cache para Looker), Looker / Looker Studio, Cloud Pub/Sub Lite (mais barato, mas mais limitado), Spanner / Bigtable / Firestore para dados de camada de aplicativo (coberto em [[gcp-pcdoe]]), Vertex AI Pipelines / Feature Store / Workbench (coberto em [[gcp-pmle]]), Cloud DLP / Sensitive Data Protection para redação de PII.
Nós nos limitamos aos primitivos GCS + Pub/Sub + Dataflow + BigQuery porque eles são o pipeline de streaming canônico do PDE em que cada cenário de exame se baseia. O Composer orquestra as mesmas formas em lote. O Dataproc é o mecanismo de computação alternativo para cargas de trabalho Spark que gravam no mesmo BigQuery. O Datastream é uma variante CDC gerenciada da mesma forma Pub/Sub → Dataflow → BigQuery. Domine o pipeline canônico; as alternativas se encaixam.
Para cobertura conceitual serviço a serviço, consulte as seções Navegar, Guia e Editorial desta página de certificação.