Data Engineering Zoomcamp 第 1 周实战:Terraform + GCP 环境搭建与基础设施即代码(IaC)完整指南
【免费下载链接】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
本篇指南面向 Data Engineering Zoomcamp 2027 队列第 1 周(Containerization and Infrastructure as Code)的学员,以仓库中 Terraform 与 GCP 环境搭建文档 为核心骨架,系统讲解从 Terraform 客户端安装、GCP 账号与项目创建、服务账号与 IAM 权限配置,到用 Terraform 在 GCP 上创建 Data Lake(GCS 存储桶)与 Data Warehouse(BigQuery 数据集)的完整流程。读完本文,你将能够独立完成本课程的云基础设施环境准备,并通过terraform init / plan / apply / destroy四条命令安全地创建与销毁课程所需的全部云资源。
一、前置条件:安装 Terraform 与准备云账号
在开始任何基础设施配置之前,需要完成两件最基础的工作,这也是整个课程后续所有云上实操的前提。
1. 安装 Terraform 客户端
Terraform 是 HashiCorp 出品的开源基础设施即代码(Infrastructure-as-Code, IaC)工具。安装方式为从 Terraform 官方下载页获取与操作系统匹配的安装包,将其解压并放入系统PATH环境变量即可通过命令行调用。安装完成后,可以通过terraform version命令验证是否可用。
提示:本仓库中 terraform_with_variables 的 main.tf 声明了
required_providers中 google provider 的版本为5.6.0,而 terraform_basic 的 main.tf 使用4.51.0。建议使用与示例配置兼容的 Terraform 版本,并在执行前先运行terraform version确认环境。
2. 注册云服务商账号
本课程使用 Google Cloud Platform(GCP)。课程设计使用免费版本(约 300 美元额度),因此建议使用你的 Google 邮箱注册一个 GCP 账号,并在 Google Cloud Console 中创建你的第一个项目(例如命名为 "DTC DE Course")。创建项目后请务必记下Project ID——后续部署 Terraform 基础设施时需要通过-var="project=<你的 Project ID>"显式传入。
二、Terraform 核心概念速览
在动手执行之前,理解 Terraform 的基本概念能帮助你明白每一步在做什么。以下是本课程中会用到的核心知识,详细讲解参见 Terraform Overview 文档。
1. 什么是基础设施即代码(IaC)
- Terraform:HashiCorp 开发的开源工具,用于配置(provisioning)基础设施资源,支持 DevOps 变更管理最佳实践。
- IaC:通过可版本化、可复用、可共享的资源配置文件来安全、一致、可重复地构建、变更和管理基础设施。
- 核心优势:
- 基础设施生命周期管理;
- 配置可纳入版本控制(Git commit);
- 非常适合基于 Stack 的部署,支持 AWS、GCP、Azure、K8s 等主流云平台;
- 基于 State(状态)的方式追踪部署过程中的资源变更。
2. Terraform 的组成文件
一个典型的 Terraform 配置目录包含:
| 文件 | 作用 |
|---|---|
main.tf | 主配置文件,定义 provider、resource 等核心内容 |
variables.tf | 声明输入变量及其默认值 |
resources.tf/output.tf(可选) | 拆分资源定义与输出定义 |
terraform.tfstate | 状态文件,记录真实资源与配置的映射关系(本地后端时生成) |
3. 关键声明块
terraform块:配置 Terraform 基础设置,包括:required_version:本配置要求的最低 Terraform 版本;backend:存储 Terraform "state" 快照,用于将真实世界资源映射到配置;local表示将状态文件本地存储为terraform.tfstate;required_providers:指定当前模块所需的 provider(如hashicorp/google)。
provider块:添加一组 Terraform 可管理的资源类型和数据源。Terraform Registry 是主要 provider 的公共目录。resource块:定义基础设施的具体组件。本项目涉及的核心资源为google_storage_bucket(GCS 存储桶)、google_bigquery_dataset(BigQuery 数据集)和google_bigquery_table(BigQuery 表)。variable与locals:分别对应运行时参数与常量。
4. 四条核心执行命令
terraform init:初始化并配置后端,安装 provider 插件,必要时从版本控制检出已有配置;terraform plan:将本地变更与远端状态进行比对/预览,生成执行计划(Execution Plan);terraform apply:请求批准计划并应用到云端;terraform destroy:从云端移除整个 Stack。
三、GCP 初始化设置(第一次使用必做)
这部分对应 GCP Overview 文档 中的 "Initial Setup",包含五个步骤。
1. 创建项目
登录 Google Cloud Console 并创建你的第一个项目(如 "DTC DE Course"),记下Project ID。它是后续所有云资源归属的标识。
2. 创建服务账号并完成认证
- 为项目创建服务账号(Service Account),并下载对应的密钥文件(
.json); - 认证配置方法参见 GCP 官方认证入门文档;
- 建议先将
Viewer角色授予该服务账号(后续小节会补充更多角色)。
3. 下载并安装 Google Cloud SDK
从 GCP 官方 SDK 快速入门页面下载并安装 Cloud SDK,它提供gcloud、gsutil、bq等命令行工具。
4. 设置环境变量指向密钥文件
export GOOGLE_APPLICATION_CREDENTIALS="<path/to/your/service-account-authkeys>.json"5. 刷新令牌并验证认证
# 刷新 token/session,并验证认证 gcloud auth application-default login四、为服务账号配置访问权限(IAM 与 API)
本部分对应 GCP Overview 文档 中的 "Setup for Access"。配置不当是 Terraform 部署失败最常见的根因(典型报错如Error 403: ... does not have storage.buckets.create access)。
1. 追加 IAM 角色
进入IAM & Admin的IAM页面(https://console.cloud.google.com/iam-admin/iam),点击服务账号对应的编辑主体(Edit principal)图标,在Viewer之外追加以下角色:
- Storage Admin
- Storage Object Admin
- BigQuery Admin
2. 启用所需 API
在 APIs & Services 页面为项目启用以下两个 API:
https://console.cloud.google.com/apis/library/iam.googleapis.com(IAM API)https://console.cloud.google.com/apis/library/iamcredentials.googleapis.com(IAM Service Account Credentials API)
3. 再次确认环境变量
export GOOGLE_APPLICATION_CREDENTIALS="<path/to/your/service-account-authkeys>.json"确保该环境变量在当前终端会话中已正确设置,Terraform 的 google provider 会读取它来完成认证。
五、Windows 用户专属配置(纯 Windows 环境)
如果你在 Windows 上且不使用 WSL,需要参考 Terraform 与 GCP on Windows 专属文档 完成额外配置(使用 WSL 的用户可跳过本节)。
1. 准备 Linux 风格环境与 SDK
- 需要一个类 Linux 环境,例如 GitBash、MinGW 或 Cygwin(PowerShell 也可用,但需要自行调整命令);
- 以 zip 形式下载 Google Cloud SDK(
google-cloud-sdk.zip),解压后运行其中的install.sh脚本; - 安装时若提示无法自动更新系统 PATH,请手动将
C:\tools\google-cloud-sdk\bin加入PATH(可写入.bashrc或系统级环境变量); - 若使用 Anaconda 的 Python,需指定
export CLOUDSDK_PYTHON=~/Anaconda3/python; - 通过
gcloud version验证 SDK 是否正常(输出中应包含 Google Cloud SDK 版本号及 bq、core、gsutil 组件版本)。
2. SDK 认证
将下载的服务账号密钥放到固定位置(例如~/.gc/ny-rides.json),然后:
export GOOGLE_APPLICATION_CREDENTIALS=~/.gc/ny-rides.json # 方式一:使用服务账号密钥直接激活 gcloud auth activate-service-account --key-file $GOOGLE_APPLICATION_CREDENTIALS # 方式二:OAuth 应用默认登录(与视频演示一致) gcloud auth application-default login如果遇到quota exceeded类警告(如 "Cannot find a quota project to add to ADC"),执行:
PROJECT_NAME="ny-rides-alexey" # 替换为你的项目名 gcloud auth application-default set-quota-project ${PROJECT_NAME}3. Windows 上的 Terraform 使用
- 下载 Terraform 并放入
PATH中的目录; - 在 Terraform 配置文件所在目录执行
terraform init; - 可选:在
variables.tf中直接配置项目 ID:
variable "project" { description = "Your GCP Project ID" default = "ny-rides-alexey" type = string }- 随后按 Terraform Overview 文档的执行步骤 依次运行
terraform plan与terraform apply。
故障排查:如果出现
Error: googleapi: Error 403: ... does not have storage.buckets.create access,说明服务账号缺少权限,请回到第四节,确保所有必需角色都已授予。
六、Terraform Workshop:在 GCP 上创建基础设施
环境就绪后,进入仓库中的 terraform 目录 执行部署。该目录按学习进度提供了多套示例配置。
1. 三套参考配置的结构
- terraform_basic/main.tf:最简入门版。声明
hashicorp/googleprovider(版本4.51.0),直接硬编码project与region(us-central1),并定义两个核心资源:google_storage_bucket.data-lake-bucket:STANDARD存储类、开启uniform_bucket_level_access与版本管理(versioning)、配置 30 天自动删除的生命周期规则、force_destroy = true;google_bigquery_dataset.dataset:指定dataset_id、project与location(US)。
- terraform_with_variables/:引入
variables.tf变量化改造,provider 版本升级为5.6.0,资源定义全部引用变量。variables.tf中可配置项包括:
| 变量 | 默认值 | 说明 |
|---|---|---|
credentials | <Path to your Service Account json file> | 服务账号 JSON 密钥路径,provider 通过credentials = file(var.credentials)读取 |
project | <Your Project ID> | GCP 项目 ID |
region | us-central1 | 资源区域 |
location | US | 资源位置(Bucket/Dataset 均为多区域 US) |
bq_dataset_name | demo_dataset | BigQuery 数据集名称 |
gcs_bucket_name | terraform-demo-terra-bucket | GCS 存储桶名称(需全局唯一) |
gcs_storage_class | STANDARD | 存储桶存储类 |
- terraform_with_variable_AWS/:面向 AWS 的变量化示例(含
terraform.tfvars),用于对比理解不同云厂商 provider 的写法,本课程主流程以 GCP 为准。
2. 执行步骤(完整命令序列)
terraform 目录的 README 给出了官方执行序列:
# 1. 刷新服务账号的 auth-token(当前会话) gcloud auth application-default login # 2. 初始化状态文件(.tfstate)并下载 provider 插件 terraform init # 3. 预览对基础设施的变更,生成执行计划 terraform plan -var="project=<your-gcp-project-id>"# 4. 创建新基础设施(会请求确认) terraform apply -var="project=<your-gcp-project-id>"# 5. 工作完成后删除基础设施,避免运行中服务的费用 terraform destroy3. 组织策略限制下的后备方案(Impersonation)
部分组织禁止直接生成服务账号密钥文件。此时可使用"服务账号模拟(impersonation)"方式绕过,步骤如下:
- 为用户授予目标服务账号的
roles/iam.serviceAccountTokenCreator角色:
gcloud iam service-accounts add-iam-policy-binding \ <SERVICE_ACCOUNT_EMAIL> \ --member="user:YOUR_EMAIL@gmail.com" \ --role="roles/iam.serviceAccountTokenCreator"- 在 main 配置中加入以下数据块与第二个 provider:
# 使用 ADC(身份验证)连接 GCP provider "google" { project = var.project region = var.region zone = var.zone } # 获取服务账号的临时 token data "google_service_account_access_token" "default" { provider = google target_service_account = "<SERVICE_ACCOUNT_EMAIL>" scopes = ["https://www.googleapis.com/auth/cloud-platform"] lifetime = "3600s" } # 第二个 provider 使用临时 token 执行实际操作 provider "google" { alias = "impersonated" access_token = data.google_service_account_access_token.default.access_token project = var.project region = var.region zone = var.zone }- 完成配置后,即可按上文"执行步骤"正常执行
terraform init / plan / apply。
4. 重要提醒:.gitignore 与安全
在把 Terraform 配置发布到 GitHub 等代码托管平台前,务必使用合适的.gitignore(可参考官方 Terraform.gitignore 模板)。重点排除terraform.tfstate、*.tfstate.*、.terraform/、*.tfvars(尤其包含服务账号密钥或敏感默认值时)等文件,避免泄露云资源状态与服务账号凭据。
七、与课程其他环节的衔接
本模块的 Terraform 配置围绕课程的数据平台架构展开:GCS(Google Cloud Storage)充当 Data Lake(数据湖),BigQuery 充当 Data Warehouse(数据仓库)。后续 Week 2(数据摄取)将把数据从 GCS 加载到 BigQuery,因此本模块创建的两个资源是整条数据管线的云侧地基。
关于 Docker 容器化数据管道(Week 1 前半部分)、Kestra 工作流编排(Week 2)与本模块的衔接方式,可继续阅读 01-docker-terraform 模块 README 与 pipeline 目录;完成基础设施创建后,即可回到 Terraform 目录 对照配置逐条验证本指南中的每一步。
八、常见问题速查
| 现象 | 原因与解决 |
|---|---|
terraform命令不存在 | Terraform 未安装或未加入PATH,重新安装并检查环境变量 |
Error 403: does not have storage.buckets.create access | 服务账号缺少 Storage/BigQuery 相关 IAM 角色,按第四节补齐 |
quota exceeded / Cannot find a quota project | 使用gcloud auth application-default set-quota-project <PROJECT_NAME>指定配额项目 |
| 服务账号密钥无法生成(组织策略) | 使用第六节的服务账号模拟(impersonation)后备方案 |
plan时提示项目错误 | 确认-var="project=..."传入的是正确的 Project ID |
以上每一步均可对照仓库中的 setup 文档、Terraform Overview、GCP Overview 与 Windows 专属指南 进行交叉验证,配合 terraform 示例配置 逐行理解,即可顺利完成 Week 1 的云基础设施搭建任务。
【免费下载链接】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),仅供参考