最后审核时间:2026年5月
使用原生 Terraform 构建 ACE 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
通过本实验,您将使用纯 Terraform 部署最小且实际的 ACE 风格的 GCP 管理基础架构——一个带有一个区域子网的自定义模式 VPC,两条防火墙规则(允许内部访问 + IAP SSH),一个运行着具有最小权限 IAM 的服务账号的 Compute Engine VM,以及一个在配额错误时发出警报的 Cloud Logging 警报策略。这是第一天 IaaS 管理员的配置。
将代码片段放入单个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。gcloud auth application-default login。your-project-id 替换为您的实际项目 ID。gcloud compute ssh certlabpro-ace-vm --tunnel-through-iap。e2-micro:在 us-central1 大约每月 6.50 美元(如果符合条件,每个账户有一个始终免费层级)。VM 运行时每月约 6.50 美元。不使用时请停止或销毁 VM——运行中的 VM 是 GCP 上实验室成本意外的头号原因。
启用 Compute Engine、IAM 和 Cloud Logging API。ACE 考试会反复测试这种“为每个资源启用 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"
zone = "us-central1-a"
}
locals {
labels = {
project = "certlabpro-ace"
managed_by = "terraform"
}
}
resource "google_project_service" "compute" {
service = "compute.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "iam" {
service = "iam.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "logging" {
service = "logging.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "monitoring" {
service = "monitoring.googleapis.com"
disable_on_destroy = false
}GCP 网络是全球性的——一个 VPC 跨越所有区域,子网是从中划分出来的区域性基本单元。这是 ACE 考试中反复出现的考点:AWS 有区域性 VPC;Azure 有区域性 VNet;而 GCP 拥有一个带有区域性子网的全球性 VPC。
我们禁用了 auto_create_subnetworks(自定义模式 VPC,ACE 推荐的默认设置),并在 us-central1 中划分了一个单一的 /24 子网,启用了 Private Google Access,这样没有外部 IP 的 VM 仍然可以访问 GCP API。
resource "google_compute_network" "main" {
name = "certlabpro-ace-vpc"
auto_create_subnetworks = false
routing_mode = "REGIONAL"
depends_on = [google_project_service.compute]
}
resource "google_compute_subnetwork" "main" {
name = "certlabpro-ace-subnet"
ip_cidr_range = "10.10.1.0/24"
region = "us-central1"
network = google_compute_network.main.id
private_ip_google_access = true
}GCP 防火墙规则是VPC 范围的(而不是每个子网的),并且具有明确的方向:入站(默认)或出站。默认入站是拒绝所有;默认出站是允许所有。ACE 考试会无情地测试这种“方向 + 默认拒绝”的不变性。
我们添加:
10.10.1.0/24 子网中 VM 之间的 TCP/UDP/ICMP 通信。35.235.240.0/20) 的 TCP/22 流量,这样您可以在不将 VM 暴露给互联网的情况下进行 SSH 连接。IAP-SSH 规则是 ACE 推荐的模式——它要求 VM 上具有 roles/iap.tunnelResourceAccessor 角色(绑定在步骤 4 中处理)。
resource "google_compute_firewall" "allow_internal" {
name = "certlabpro-ace-allow-internal"
network = google_compute_network.main.name
direction = "INGRESS"
source_ranges = ["10.10.1.0/24"]
allow {
protocol = "tcp"
}
allow {
protocol = "udp"
}
allow {
protocol = "icmp"
}
}
resource "google_compute_firewall" "allow_iap_ssh" {
name = "certlabpro-ace-allow-iap-ssh"
network = google_compute_network.main.name
direction = "INGRESS"
source_ranges = ["35.235.240.0/20"] # IAP gateway range
allow {
protocol = "tcp"
ports = ["22"]
}
}Compute Engine VM 运行带有一个附加服务账号——这相当于 AWS EC2 实例配置文件或 Azure VM 托管标识在 GCP 中的对应物。ACE 推荐的模式是:永远不要使用默认的 Compute 服务账号(权限过高);始终为每个工作负载创建一个仅具有工作负载所需 IAM 角色的服务账号。
我们创建一个服务账号,授予它 roles/logging.logWriter + roles/monitoring.metricWriter 角色(Ops Agent 发送日志/指标所需的最低权限),并将其附加到一个没有外部 IP 的 e2-micro Debian VM。步骤 3 中的 IAP-SSH 防火墙规则允许您通过隧道访问它。
resource "google_service_account" "vm" {
account_id = "certlabpro-ace-vm-sa"
display_name = "ACE lab VM service account"
}
resource "google_project_iam_member" "vm_log_writer" {
project = data.google_project.current.project_id
role = "roles/logging.logWriter"
member = "serviceAccount:${google_service_account.vm.email}"
}
resource "google_project_iam_member" "vm_metric_writer" {
project = data.google_project.current.project_id
role = "roles/monitoring.metricWriter"
member = "serviceAccount:${google_service_account.vm.email}"
}
data "google_project" "current" {}
resource "google_compute_instance" "vm" {
name = "certlabpro-ace-vm"
machine_type = "e2-micro"
zone = "us-central1-a"
boot_disk {
initialize_params {
image = "debian-cloud/debian-12"
}
}
network_interface {
subnetwork = google_compute_subnetwork.main.id
# No access_config block = no external IP. SSH via IAP only.
}
service_account {
email = google_service_account.vm.email
scopes = ["cloud-platform"] # API scope; IAM does the real gating
}
labels = local.labels
}ACE 推荐的可观测性模式是:一个基于日志的指标计算 Cloud Logging 过滤器的匹配项,然后当指标超过阈值时,一个 Cloud Monitoring 警报策略会触发。我们监视此项目中任何 GCE VM 发出的 severity >= ERROR 日志行,每分钟计数一次,并在 5 分钟内命中超过 5 次时发出警报。
通知渠道是隐式的——警报策略需要一个 notification_channels 数组,但渠道本身(电子邮件、Slack、PagerDuty)通常在控制台中为每个项目配置一次。ACE 考试将这种“日志指标 → 警报策略 → 通知渠道”的三角关系作为标准可观测性基本单元进行测试。
resource "google_logging_metric" "vm_errors" {
name = "certlabpro_ace_vm_errors"
filter = "resource.type=\"gce_instance\" AND severity >= ERROR"
metric_descriptor {
metric_kind = "DELTA"
value_type = "INT64"
}
depends_on = [google_project_service.logging]
}
resource "google_monitoring_alert_policy" "vm_error_burst" {
display_name = "ACE lab — VM error burst"
combiner = "OR"
conditions {
display_name = "More than 5 ERROR lines per 5 minutes"
condition_threshold {
filter = "metric.type=\"logging.googleapis.com/user/${google_logging_metric.vm_errors.name}\" AND resource.type=\"gce_instance\""
duration = "300s"
comparison = "COMPARISON_GT"
threshold_value = 5
aggregations {
alignment_period = "60s"
per_series_aligner = "ALIGN_DELTA"
}
}
}
# notification_channels = [] # add channels via the console or as a separate TF resource
depends_on = [google_project_service.monitoring]
}terraform destroy 将销毁所有资源。VM 在销毁后立即停止计费(磁盘也会随之销毁)。服务账号会被销毁;IAM 绑定会解除。VPC + 子网 + 防火墙会干净地销毁。基于日志的指标 + 警报策略会干净地解除。项目服务保持启用状态(免费保留)。
ACE 涵盖了本实验无法容纳的许多 GCP 管理方面——Cloud Load Balancing(全球 HTTP(S) LB、区域内部 LB、网络 LB)、Managed Instance Groups + 自动扩缩、Cloud Run、GKE clusters、Cloud Storage(在 [[gcp-cdl]] 中涵盖)、Cloud SQL、Cloud Spanner、Cloud Bigtable、Pub/Sub、Cloud Functions、Cloud Scheduler、Cloud Tasks、Cloud KMS、VPC Peering / Shared VPC([[gcp-pcne]])、Cloud NAT、Cloud VPN / Interconnect、Cloud DNS、Cloud Armor、IAM 自定义角色、Resource Manager 层级(文件夹 + 组织)、Cloud Asset Inventory、Cloud Deployment Manager(已弃用,转而支持 Terraform)。
我们专注于 VPC + GCE + IAM + Logging 这些基本单元,因为它们是所有更高级 GCP 管理模式的基础。MIGs 扩缩 GCE 实例;LBs 位于 MIGs 前端;GKE / Cloud Run 运行在计算资源之上;所有事物都写入 Cloud Logging。
有关按服务划分的概念性覆盖,请参阅此认证页面的浏览、手册和 Editorial 部分。