Google Cloud Platform 概览与 Terraform 基础设施初始化:data-engineering-zoomcamp 的 GCS 数据湖 + BigQuery 数据仓库搭建指南
2026/9/12 1:14:47 网站建设 项目流程

Google Cloud Platform 概览与 Terraform 基础设施初始化:data-engineering-zoomcamp 的 GCS 数据湖 + BigQuery 数据仓库搭建指南

【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 👇🏼项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp

本篇指南聚焦>export GOOGLE_APPLICATION_CREDENTIALS="<path/to/your/service-account-authkeys>.json" # 刷新 token/会话,并验证认证 gcloud auth application-default login

gcloud auth application-default login生成的是 Application Default Credentials(ADC),它会被 gcloud 客户端以及 Terraform 的 google provider 自动读取。这也解释了为什么仓库 terraform_basic/main.tf 的 provider 块中credentials一行被注释掉——只要环境变量已设置,provider 就能自动完成身份识别:

provider "google" { # Credentials only needs to be set if you do not have the GOOGLE_APPLICATION_CREDENTIALS set # credentials = project = "<Your Project ID>" region = "us-central1" }

访问权限设置(Setup for Access):IAM 角色与 API 启用

仅有Viewer角色无法创建存储桶和数据集,还必须为服务账号追加管理类权限,分三步完成:

1. 追加 IAM 角色

进入 Console 的IAM & Admin → IAM页面(https://console.cloud.google.com/iam-admin/iam),找到你的服务账号,点击Edit principal(编辑主体)图标,在已有的Viewer基础上追加以下三个角色:

角色用途
Storage Admin管理 GCS 存储桶及其对象的创建、删除与权限
Storage Object Admin管理桶内对象的读写与访问控制
BigQuery Admin管理 BigQuery 数据集、表及查询作业

这三个角色正好覆盖 Terraform 配置中要创建的两类资源:google_storage_bucketgoogle_bigquery_dataset。若缺少对应权限,terraform apply会以 403 错误失败(详见下文"常见错误排查")。

2. 启用项目相关 API

在 Console 的 APIs & Services 库中启用以下两个 API(也可直接访问对应链接):

  • IAM API:https://console.cloud.google.com/apis/library/iam.googleapis.com
  • IAM Service Account Credentials API:https://console.cloud.google.com/apis/library/iamcredentials.googleapis.com

后者服务于服务账号令牌签发/模拟(impersonation)场景,在无法直接下载密钥文件时会用到(参见下文"无密钥文件时的降级方案")。

3. 确认环境变量仍然生效

每次打开新的终端会话,都需要重新确认GOOGLE_APPLICATION_CREDENTIALS已设置:

export GOOGLE_APPLICATION_CREDENTIALS="<path/to/your/service-account-authkeys>.json"

用 Terraform 创建 GCP 基础设施:从配置到执行

认证与授权就绪后,即可进入仓库的 Terraform 工作坊。本节结合仓库真实配置文件,拆解每一步的含义。

工作坊目录结构

仓库terraform/terraform/下提供了三个渐进式示例:

  • terraform_basic/:单文件最简部署(main.tf),所有值硬编码;
  • terraform_with_variables/:引入变量文件抽离可配置项(main.tf + variables.tf);
  • terraform_with_variable_AWS/:同一套数据湖语义的 AWS 实现(S3 + Glue),供偏好 AWS 的学习者对照理解。

核心资源块解析

terraform_basic/main.tf为例,它声明了课程基础设施的两块基石:

(1)GCS 数据湖存储桶google_storage_bucket

resource "google_storage_bucket" "data-lake-bucket" { name = "<Your Unique Bucket Name>" location = "US" # 推荐设置: storage_class = "STANDARD" uniform_bucket_level_access = true versioning { enabled = true } lifecycle_rule { action { type = "Delete" } condition { age = 30 // days } } force_destroy = true }

各参数作用:

  • storage_class = "STANDARD":标准存储类别,适合课程数据集(如不需要冷归档);
  • uniform_bucket_level_access = true:启用统一桶级访问控制(Uniform Bucket Level Access),以 IAM 取代细粒度 ACL,安全性更好;
  • versioning { enabled = true }:开启对象版本管理,便于回滚被覆盖/删除的对象;
  • lifecycle_rule:设置对象生命周期规则——超过 30 天的对象自动删除,避免免费额度内产生存储费用;
  • force_destroy = true:即使桶内还有对象,terraform destroy也能强制删除桶,避免清理基础设施时被非空桶卡住。

(2)BigQuery 数据集google_bigquery_dataset

resource "google_bigquery_dataset" "dataset" { dataset_id = "<The Dataset Name You Want to Use>" project = "<Your Project ID>" location = "US" }

注意dataset_id只是数据集的逻辑名(后续 dbt 建模时引用),而真正的表(如yellow_taxi_trips)通常在数据接入阶段由外部表或 dbt 模型创建。

用变量抽离配置

terraform_with_variables/示例将所有可配置项提升为变量。以 variables.tf 为例,变量默认值即课程推荐取值:

  • credentials:服务账号 JSON 密钥文件路径(如./keys/my-creds.json);
  • project:你的 GCP 项目 ID;
  • region:默认us-central1
  • location:存储桶/数据集所在地域,默认US(多区域);
  • bq_dataset_name:BigQuery 数据集名,默认demo_dataset
  • gcs_bucket_name:存储桶名,默认terraform-demo-terra-bucket注意 GCS 桶名全局唯一,撞名会导致创建失败);
  • gcs_storage_class:默认STANDARD

对应的 main.tf 通过var.*引用这些值,例如 provider 块中credentials = file(var.credentials)project = var.project,资源块中name = var.gcs_bucket_namedataset_id = var.bq_dataset_name。这样做的好处是:同一份.tf配置可以通过不同.tfvars或命令行-var参数复用到不同环境(测试 / 生产)。

执行四步曲

在 terraform 目录下按顺序执行(命令来自 terraform/README.md):

# 1. 刷新服务账号的 auth-token(本会话有效) gcloud auth application-default login # 2. 初始化:下载 provider 插件、初始化后端与 .tfstate 状态文件 terraform init # 3. 计划:对比本地配置与远端状态,预览即将执行的变更 terraform plan -var="project=<your-gcp-project-id>"
# 4. 应用:确认计划后真正在 GCP 上创建资源 terraform apply -var="project=<your-gcp-project-id>"
# 5. 清理:实验结束后删除全部基础设施,避免产生费用 terraform destroy

补充说明:

  • terraform init会依据required_providers安装指定版本的 google provider——terraform_basic示例固定为4.51.0terraform_with_variables示例固定为5.6.0,版本锁定可保证可复现性;
  • terraform planapply中用-var传入项目 ID,覆盖 variables.tf 中的默认值;
  • terraform destroy在有force_destroy = true的桶上能直接清理,是避免免费额度超支的常规收尾动作;
  • 若打算把 Terraform 配置发布到 GitHub,务必先添加 Terraform 专用的.gitignore,防止.tfstate状态文件(内含敏感资源信息)被误提交。

常见错误与排查

课程与仓库文档中记录了几类高频问题:

1. 403 Forbidden——服务账号缺少存储权限

Error: googleapi: Error 403: terraform@ny-rides-alexey.iam.gserviceaccount.com does not have storage.buckets.create access to the Google Cloud project., forbidden

原因:服务账号尚未获得创建桶的权限。解决办法:回到 IAM 页面,按上文"Setup for Access"补齐Storage Admin/Storage Object Admin/BigQuery Admin角色后重试apply

2. quota exceeded / API not enabled 警告

gcloud auth application-default login后若出现:

Cannot find a quota project to add to ADC. You might receive a "quota exceeded" or "API not enabled" error.

说明 ADC 缺少配额项目绑定,执行:

PROJECT_NAME="ny-rides-alexey" gcloud auth application-default set-quota-project ${PROJECT_NAME}

将当前项目设为配额项目即可。

3. 组织策略禁止下载服务账号密钥

部分企业环境不允许生成/下载 service account key 文件。仓库提供降级方案(见 terraform/README.md):

  1. 为本人账号授予目标服务账号的roles/iam.serviceAccountTokenCreator角色:
gcloud iam service-accounts add-iam-policy-binding \ <SERVICE_ACCOUNT_EMAIL> \ --member="user:YOUR_EMAIL@gmail.com" \ --role="roles/iam.serviceAccountTokenCreator"
  1. 在 Terraform 配置中通过google_service_account_access_token数据源获取临时令牌,并用alias = "impersonated"的第二个 provider 块承载实际操作(该机制依赖前面启用的 IAM Service Account Credentials API)。

Windows 用户专项说明

使用原生 Windows(非 WSL)的同学,仓库提供了完整的替代流程 windows.md,要点如下:

  • 需要 Linux 风格环境,推荐 GitBash / MinGW / Cygwin;
  • 下载 SDK zip 包后运行install.sh,若 PATH 未自动写入,需手工把google-cloud-sdk\bin加入 PATH;
  • 使用 Anaconda 时通过export CLOUDSDK_PYTHON=~/Anaconda3/python指定 Python 解释器,并用gcloud version验证安装;
  • 服务账号密钥可存放于如~/.gc/ny-rides.json,再export GOOGLE_APPLICATION_CREDENTIALS=~/.gc/ny-rides.json
  • 认证方式二选一:gcloud auth activate-service-account --key-file $GOOGLE_APPLICATION_CREDENTIALS(服务账号直连)或gcloud auth application-default login(OAuth 方式);
  • 之后照常执行terraform initterraform planterraform apply

扩展到其他云:AWS 等价实现

仓库还提供了与 GCP 版本语义等价的 AWS 实现 terraform_with_variable_AWS/README.md,帮助学习者理解云无关的数据工程概念,其服务映射为:

GCP 服务AWS 等价服务用途
Google Cloud Storage (GCS)Amazon S3数据湖存储
Uniform Bucket Level AccessS3 Public Access Block安全访问控制
Object Lifecycle RulesS3 Lifecycle Configuration对象自动过期
BigQuery DatasetAWS Glue Catalog Database元数据与查询层

其 main.tf 中aws_s3_bucketaws_s3_bucket_versioningaws_s3_bucket_public_access_blockaws_s3_bucket_lifecycle_configurationaws_glue_catalog_database五个资源,正好一一对应 GCP 版存储桶与数据集的语义;可配置项集中在 variables.tf(区域默认eu-north-1、桶名默认全局唯一值、数据集名默认ny_taxi_database),具体取值写入 terraform.tfvars。

小结与下一步

至此,你已经完成:GCP 账号与项目创建 → 服务账号与 IAM 角色授权 → SDK 与 ADC 认证 → 用 Terraform 创建 GCS 数据湖与 BigQuery 数据集。这套"云侧前置准备"是课程后续所有数据接入与建模工作的地基。

下一步动作:

  • 若对 Terraform 的声明式概念(terraform块、providerresourcevariable与执行步骤)还不熟悉,请先阅读 1_terraform_overview.md;
  • 进入 terraform 工作坊目录 按 README 实际执行一遍创建与销毁;
  • 之后回到模块一的 Docker + Postgres 部分,用注入脚本把纽约出租车数据写入这套基础设施。

【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 👇🏼项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询