最后审核时间:2026年5月
使用原生 Terraform 构建 ADP 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
到本实验结束时,你将使用纯 Terraform 配置最小、最真实的 ADP 数据基础 — 一个 Cloud Storage 存储桶(用作数据落地区)、一个带有一个按摄取日期分区的表的 BigQuery 数据集,以及一个每小时运行一次的 BigQuery 计划查询,该查询从公共数据集读取数据并写入到表中。四个代码块;这是 GCP 分析的入门之路。
将这些代码片段放入一个 main.tf 文件中,然后逐步运行 terraform init 和 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。your-project-id。在实验范围内全部免费:
在实验数据量下,每月约 0 美元。真实的 BigQuery 工作负载按扫描的字节数计费 — 积极进行分区 + 聚类,并且只 SELECT 你需要的数据。
启用 Cloud Storage、BigQuery 和 BigQuery Data Transfer Service(支持计划查询)。
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-adp"
managed_by = "terraform"
}
}
resource "google_project_service" "storage" {
service = "storage.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "bigquery" {
service = "bigquery.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "bqdts" {
service = "bigquerydatatransfer.googleapis.com"
disable_on_destroy = false
}每个 ADP 模式的数据管道都始于一个数据落地桶——原始文件(CSV / JSON / Parquet / Avro)会投放到这里,下游作业会从中读取。该存储桶是数据湖“外部”和“内部”之间的界限。ADP 考试再次考察了存储类别的选择——对于落地层(前 30 天频繁读取),选择 Standard,并设置一个生命周期规则,在 90 天后转换为 Coldline。
统一存储桶级访问已启用(ADP 推荐的安全默认设置)。
resource "random_id" "suffix" {
byte_length = 4
}
resource "google_storage_bucket" "landing" {
name = "certlabpro-adp-landing-${random_id.suffix.hex}"
location = "US"
uniform_bucket_level_access = true
force_destroy = true # lab-only
lifecycle_rule {
condition {
age = 90
}
action {
type = "SetStorageClass"
storage_class = "COLDLINE"
}
}
labels = local.labels
depends_on = [google_project_service.storage]
}BigQuery 是 GCP 的无服务器数据仓库——查询按扫描字节付费,数据按存储字节付费。ADP 考试将分区 + 聚类作为成本控制杠杆进行考察:分区表允许查询跳过不相关的数据;聚类表将相关行存储在一起。
我们将创建:
analytics——BigQuery 容器(相当于 GCP 中的 schema / 数据库)。为方便实验清理,设置 delete_contents_on_destroy = true。events,具有摄取时间分区(_PARTITIONTIME 伪列)和 30 天的分区过期时间。生产表通常按列 (time_partitioning.field) 分区,以提高查询选择性。resource "google_bigquery_dataset" "analytics" {
dataset_id = "analytics"
location = "US"
delete_contents_on_destroy = true # lab-only
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 # lab-only
time_partitioning {
type = "DAY"
expiration_ms = 30 * 24 * 60 * 60 * 1000 # 30 days
require_partition_filter = true
}
schema = jsonencode([
{ name = "event_id", type = "STRING", mode = "REQUIRED" },
{ name = "event_type", type = "STRING", mode = "REQUIRED" },
{ name = "event_time", type = "TIMESTAMP", mode = "REQUIRED" },
{ name = "user_id", type = "STRING", mode = "NULLABLE" },
{ name = "payload", type = "JSON", mode = "NULLABLE" },
])
labels = local.labels
}计划查询是 ADP 模式中用于“以固定频率将数据从一个 BigQuery 数据集摄取到另一个数据集”的基本操作。它们运行在 BigQuery Data Transfer Service 基础设施上(独立于 bq 特别查询),并按相同的扫描字节费率计费。
我们计划了一个每小时运行的查询,它从公共数据集 bigquery-public-data.samples.shakespeare 读取数据,并写入到步骤 3 的 events 表中。MERGE 形式(upsert)是 ADP 模式中实现幂等摄取的规范答案——重复运行同一小时不会重复插入数据。
计划查询以项目默认服务账户身份运行;生产部署使用一个专用的数据传输服务账户,并在目标上授予 roles/bigquery.dataEditor 角色。
resource "google_bigquery_data_transfer_config" "hourly_load" {
display_name = "certlabpro-adp-hourly-load"
data_source_id = "scheduled_query"
location = "US"
schedule = "every 1 hours"
destination_dataset_id = google_bigquery_dataset.analytics.dataset_id
params = {
query = "INSERT INTO `${google_bigquery_dataset.analytics.dataset_id}.${google_bigquery_table.events.table_id}` (event_id, event_type, event_time, user_id, payload) SELECT GENERATE_UUID() AS event_id, \"shakespeare-line\" AS event_type, CURRENT_TIMESTAMP() AS event_time, NULL AS user_id, TO_JSON(STRUCT(word, word_count, corpus)) AS payload FROM `bigquery-public-data.samples.shakespeare` WHERE word_count > 100 LIMIT 100"
}
depends_on = [
google_project_service.bqdts,
google_bigquery_table.events,
]
}terraform destroy 会销毁所有资源。存储桶会销毁(仅限实验用途 force_destroy)。数据集会销毁(仅限实验用途 delete_contents_on_destroy)——其表也会随之销毁。计划查询会立即分离并停止运行。项目服务保持启用状态(免费)。
ADP 涵盖了本实验无法容纳的许多 GCP 数据服务——Dataflow(在专业级证书 [[gcp-pde]] 中涵盖)、Dataproc、Pub/Sub、Cloud Composer(托管式 Airflow)、Dataform(基于 BigQuery 构建的 SQL 转换 IDE)、Looker Studio、Vertex AI、Cloud Data Fusion、Database Migration Service、Datastream、整个 BigLake / BigQuery Omni 多云表面,以及 BigQuery ML(数据库内机器学习训练)。
我们坚持使用 GCS + BigQuery + 计划查询这些基本功能,因为它们是每个 ADP 模式管道的起点。Dataflow / Dataproc 将数据流式传输或批量导入 GCS 或 BigQuery。Composer / Workflows 编排上述计划查询。Looker 从 BigQuery 读取数据。打好基础;在其上构建专业引擎。
有关按服务划分的概念性覆盖范围,请参阅此证书页面的浏览、手册和 Editorial 部分。