最后审核时间:2026年5月
使用原生 Terraform 构建 PCD 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,您将使用纯 Terraform 预置最小但真实的 PCD 事件驱动应用程序基础 — 一个用于托管容器镜像的 Artifact Registry Docker 仓库,一个作为异步消息骨干的 Pub/Sub 主题 + 订阅,一个运行占位符镜像的 Cloud Run 服务,以及用于应用程序密钥的 Secret Manager。共五个模块;每个 PCD 考试场景都基于此基础构建。
将这些代码片段放入一个 main.tf 文件中,然后逐步运行 terraform init 和 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。your-project-id。在实验范围内,所有服务都是免费或接近免费的:
min_instances = 0 — 无闲置成本。在实验用量下每月约为 $0。 min_instances = 0 的 Cloud Run 是 PCD 推荐的默认设置 — 没有闲置计费。
启用 Cloud Run、Artifact Registry、Pub/Sub 和 Secret Manager API。
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-pcd"
managed_by = "terraform"
}
}
resource "google_project_service" "run" {
service = "run.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "artifactregistry" {
service = "artifactregistry.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "pubsub" {
service = "pubsub.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "secretmanager" {
service = "secretmanager.googleapis.com"
disable_on_destroy = false
}Artifact Registry 是 GCP 的容器 + 包注册表 — 替代已弃用的 Container Registry (gcr.io) 的现代方案。PCD 考试会考察这种 推送到 Artifact Registry → 从 Artifact Registry 部署 的模式,作为规范的 CI/CD 形态。
我们创建一个区域性的 Docker 格式仓库。在 terraform apply 后通过以下命令推送镜像:
gcloud auth configure-docker us-central1-docker.pkg.dev
docker tag my-app:latest us-central1-docker.pkg.dev/$PROJECT/certlabpro-pcd-images/my-app:latest
docker push us-central1-docker.pkg.dev/$PROJECT/certlabpro-pcd-images/my-app:latest
resource "google_artifact_registry_repository" "images" {
repository_id = "certlabpro-pcd-images"
location = "us-central1"
format = "DOCKER"
description = "PCD lab Docker images"
labels = local.labels
depends_on = [google_project_service.artifactregistry]
}Pub/Sub 是 GCP 的托管消息服务 — 所有 PCD 模式事件驱动应用程序的基础。主题是发布目标;订阅是消费者端点(拉取或推送)。PCD 考试会考察至少一次交付 + 幂等消费者作为承重语义。
我们创建:
orders — 生产者在此发布。orders-worker — 消费者从此拉取。生产部署通常会使用推送订阅到 Cloud Run 端点(PCD 规范的事件驱动形式:Pub/Sub 推送 → Cloud Run);此处我们保持拉取模式以简化 IAM。ack_deadline_seconds = 60 给予消费者 60 秒来确认;这比 Cloud Run 默认的请求超时时间长,也是 PCD 考试中一个常见的调整项。
resource "google_pubsub_topic" "orders" {
name = "orders"
labels = local.labels
depends_on = [google_project_service.pubsub]
}
resource "google_pubsub_subscription" "orders_worker" {
name = "orders-worker"
topic = google_pubsub_topic.orders.id
ack_deadline_seconds = 60
message_retention_duration = "604800s" # 7 days (max)
retry_policy {
minimum_backoff = "10s"
maximum_backoff = "600s"
}
labels = local.labels
}Cloud Run 是 GCP 的容器即服务 — 在 Google 的无服务器基础设施上运行 Docker 容器,并可缩放到零。PCD 推荐的模式:每个 Cloud Run 服务都作为其自己的服务账号运行,绝不使用默认的 Compute 服务账号。
我们部署一个运行公共 hello 镜像作为占位符的服务,并为其附加一个每个服务专用的服务账号,该账号对第 3 步中的主题具有 roles/pubsub.subscriber 角色,并授予 roles/run.invoker 给 allUsers 以实现未经身份验证的访问。生产环境请切换为 IAM 门控的调用者 — PCD 考试会考察这种 allUsers ↔ 特定身份的转换。
resource "google_service_account" "worker" {
account_id = "certlabpro-pcd-worker"
display_name = "PCD lab Cloud Run worker"
}
resource "google_pubsub_subscription_iam_member" "worker_subscriber" {
subscription = google_pubsub_subscription.orders_worker.name
role = "roles/pubsub.subscriber"
member = "serviceAccount:${google_service_account.worker.email}"
}
resource "google_cloud_run_v2_service" "worker" {
name = "certlabpro-pcd-worker"
location = "us-central1"
template {
service_account = google_service_account.worker.email
scaling {
min_instance_count = 0 # scale-to-zero — no idle billing
max_instance_count = 5
}
containers {
image = "us-docker.pkg.dev/cloudrun/container/hello"
resources {
limits = {
cpu = "1"
memory = "512Mi"
}
}
}
}
labels = local.labels
depends_on = [google_project_service.run]
}
resource "google_cloud_run_v2_service_iam_member" "public_invoker" {
name = google_cloud_run_v2_service.worker.name
location = google_cloud_run_v2_service.worker.location
role = "roles/run.invoker"
member = "allUsers" # lab-only; production = specific identity
}Secret Manager 是 GCP 的密钥存储服务 — 提供版本控制的值、IAM 控制的访问权限和自动轮换钩子。PCD 推荐的模式:非密钥的应用程序配置放在环境变量中;密钥类应用程序配置(API 密钥、数据库密码、OAuth 令牌)放在 Secret Manager 中,由 Cloud Run 服务引用。
我们创建一个密钥和初始版本,然后授予第 4 步中的 Cloud Run 服务账号 roles/secretmanager.secretAccessor 权限。要将密钥作为环境变量接入 Cloud Run,您需要在服务模板中添加一个 env { name = "..."; value_source { secret_key_ref { ... } } } 块(此处故意省略,以使本步骤更集中)。
resource "google_secret_manager_secret" "db_password" {
secret_id = "certlabpro-pcd-db-password"
replication {
auto {}
}
labels = local.labels
depends_on = [google_project_service.secretmanager]
}
resource "google_secret_manager_secret_version" "db_password_v1" {
secret = google_secret_manager_secret.db_password.id
secret_data = "lab-placeholder-rotate-me"
}
resource "google_secret_manager_secret_iam_member" "worker_reader" {
secret_id = google_secret_manager_secret.db_password.id
role = "roles/secretmanager.secretAccessor"
member = "serviceAccount:${google_service_account.worker.email}"
}terraform destroy 会销毁所有资源。Cloud Run 服务会被销毁(min_instances = 0 时它已经没有成本)。Artifact Registry 仓库会被销毁(由于实验没有推送任何镜像,因此 force_destroy 是隐式的)。Pub/Sub 和 Secret Manager 资源会干净地销毁。
PCD 涵盖了本实验无法涵盖的许多 GCP 应用程序开发者服务 — Cloud Functions(Cloud Run 的较旧/较轻量替代方案)、Cloud Tasks(持久异步队列)、Cloud Scheduler(cron 即服务)、Cloud Endpoints / API Gateway(位于 Cloud Run 前方的托管 API 接口)、Cloud Trace + Cloud Profiler + Cloud Debugger(应用程序性能遥测 — [[gcp-pcde]] 层级)、Firebase(移动/网络应用程序平台)、Cloud Storage(用作 SPA 的静态资产托管)、Cloud Build(CI/CD — [[gcp-pcde]])、Cloud Deploy(CD — [[gcp-pcde]])、Eventarc(将 GCP 服务事件路由到 Cloud Run / Functions)、Workflows(编排)、Firestore(应用程序的 NoSQL 数据库)、Memorystore(Redis)、用于应用程序内 GenAI 的 Vertex AI,以及整个 App Engine 产品(旧版但仍在 PCD 考试大纲中)。
我们坚持使用 Artifact Registry + Pub/Sub + Cloud Run + Secret Manager 的基本组合,因为它们是 PCD 规范的事件驱动应用程序核心。Cloud Functions + Cloud Run 共享相同的 Artifact Registry 镜像基础。Eventarc 将事件路由到 Cloud Run / Functions。Cloud Tasks 是 Pub/Sub 的同步 RPC 变体。掌握了基础,其他替代方案自然就能融入。
有关各个服务的概念性介绍,请参阅此认证页面的浏览、手册和 Editorial 部分。