Data Engineering Zoomcamp:用 Terraform 在 GCP 上搭建数据湖与数据仓库基础设施的完整实战指南
Data Engineering Zoomcamp用 Terraform 在 GCP 上搭建数据湖与数据仓库基础设施的完整实战指南【免费下载链接】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 年课程中cohorts/2027/01-docker-terraform/terraform/目录为核心系统讲解如何借助 TerraformHashiCorp 的开源 IaC 工具在 Google Cloud Platform 上以代码方式编排数据工程基础设施——包括 Google Cloud Storage数据湖与 BigQuery数据仓库。读完本文你将掌握 GCP 服务账号认证、Terraform 的init/plan/apply/destroy完整生命周期以及在企业组织中无法直接生成服务账号密钥文件时的服务账号模拟impersonation方案。Terraform 与基础设施即代码IaC基础什么是 Terraform根据课程文档 12-terraform-overview.md 的定义Terraform 是 HashiCorp 推出的开源工具专门用于基础设施资源的编排provisioning。它支持 DevOps 的最佳实践——变更管理通过将配置文件纳入源码控制为测试环境与生产环境维护一个理想的基础设施供给状态。什么是 IaCIaCInfrastructure-as-Code基础设施即代码的核心思想是通过定义可版本化、可复用、可共享的资源配置以安全、一致、可重复的方式构建、变更和管理你的基础设施。相对于在云控制台上手工点击创建资源IaC 带来的主要优势包括基础设施生命周期管理资源从创建、变更到销毁都有明确、可审计的路径版本控制提交每一次基础设施变更都像代码一样进入 Git 历史可回滚、可评审多栈部署友好非常适合基于堆栈stack-based的部署场景并可对接 AWS、GCP、Azure、Kubernetes 等主流云平台基于状态state的资源追踪Terraform 通过状态文件跟踪资源在整个部署周期中的变化从而做到只增删改真正发生了漂移的资源。Terraform 的核心文件与声明课程在terraform/目录下提供了多套可直接对照学习的配置骨架典型文件结构如下文件作用main.tf核心资源定义声明 provider 与需要创建的云资源variables.tf输入变量的声明与默认值resources.tf/output.tf可选资源拆分文件 / 输出变量文件terraform.tfstateTerraform 状态文件由工具自动生成terraform.tfvars环境相关的变量赋值文件Terraform 配置中常见的顶层声明块包括terraform块配置 Terraform 的基础设置。required_version指定本配置所需的最低 Terraform 版本backend存放 Terraform 状态快照用于把真实世界中的资源映射回你的配置local表示状态文件保存在本地terraform.tfstaterequired_providers声明当前模块需要的 provider 及其版本。provider块为 Terraform 引入一组可管理的资源类型和/或数据源Terraform Registry 是获取各大云平台公开 provider 的主要目录。resource块定义基础设施的具体组件。在本课程项目中核心资源包括google_storage_bucketGCS 存储桶、google_bigquery_datasetBigQuery 数据集、google_bigquery_tableBigQuery 表。variable与locals分别用于声明运行时参数与常量。动手前的 GCP 准备项目、服务账号与 IAM 权限在运行任何 Terraform 命令之前需要先完成 GCP 侧的初始化。课程文档 13-gcp-overview.md 给出了完整流程本课程使用 GCP 免费额度最高可享 EUR 300 积分使用 Google 邮箱注册账号在 Google Cloud Console 创建第一个项目例如 DTC DE Course并记下Project ID后续 Terraform 部署时通过-varproject...传入为该项目的服务账号完成认证设置先授予Viewer角色并下载服务账号密钥文件.json用于本地认证安装 Google Cloud SDK 用于本地命令行操作设置环境变量指向下载的密钥文件并刷新会话令牌export GOOGLE_APPLICATION_CREDENTIALSpath/to/your/service-account-authkeys.json # Refresh token/session, and verify authentication gcloud auth application-default login服务账号的 IAM 角色与 API 启用为了能让 Terraform 顺利创建数据湖与数据仓库资源服务账号在基础Viewer角色之外还需要追加以下角色在 Console 的IAM 与管理员→IAM页面点击服务账号的修改主账号进行配置Storage AdminStorage Object Admin管理 GCS 存储桶及桶内对象BigQuery Admin管理 BigQuery 数据集与表。同时需要在项目中启用以下两个 APIIAM APIhttps://console.cloud.google.com/apis/library/iam.googleapis.comIAM Service Account Credentials APIhttps://console.cloud.google.com/apis/library/iamcredentials.googleapis.com最后再次确认GOOGLE_APPLICATION_CREDENTIALS环境变量已经指向正确的服务账号密钥文件。说明上述配置一旦完成Terraform 即可通过 Application Default CredentialsADC识别你的身份若企业组织策略禁止直接下载密钥文件请直接跳转到本文末尾的Fallback 方案。仓库中的三套 Terraform 配置对照课程在cohorts/2027/01-docker-terraform/terraform/下提供了三套可直接参考的配置覆盖了从写死参数到变量化再到跨云移植的完整演进路径。1. terraform_basic最简 GCP 数据湖 数据仓库terraform_basic/main.tf 是课程的起点配置声明了 Google providerhashicorp/google版本4.51.0并创建两类资源GCS 存储桶数据湖google_storage_bucket data-lake-bucketstorage_class STANDARD标准存储等级uniform_bucket_level_access true启用统一桶级访问控制versioning { enabled true }开启对象版本管理便于恢复lifecycle_rule对超过 30 天的对象执行Delete操作控制存储成本force_destroy true允许在删除桶时强制清空其中对象避免terraform destroy时因桶非空而失败。BigQuery 数据集数据仓库google_bigquery_dataset dataset指定dataset_id、project与location US。该配置中的项目 ID、桶名、数据集名均为占位符需要手动替换为实际值。2. terraform_with_variables参数变量化为了不再每次修改配置terraform_with_variables 将全部可调参数提升为变量main.tf 中通过credentials file(var.credentials)直接读取服务账号 JSON 文件路径并将project、region、桶名、数据集名等全部替换为var.*引用provider 版本升级到5.6.0variables.tf 为每个变量声明了description与defaultcredentials默认Path to your Service Account json file可设置为类似./keys/my-creds.json的相对路径projectGCP 项目 IDregion默认us-central1location默认USbq_dataset_nameBigQuery 数据集名默认demo_datasetgcs_bucket_nameGCS 桶名默认terraform-demo-terra-bucket需全局唯一gcs_storage_class默认STANDARD。该版本的桶还配置了lifecycle_rule对未完成的分片上传对象AbortIncompleteMultipartUpload在 1 天后自动清理。3. terraform_with_variable_AWSGCP → AWS 的等价映射课程还提供了一个面向 AWS 学习者的变体 terraform_with_variable_AWS/README.md帮助理解数据工程概念与云厂商无关。其核心映射关系如下GCP 服务AWS 等价服务用途Google Cloud Storage (GCS)Amazon S3数据湖存储统一桶级访问控制S3 Public Access Block安全管控桶访问对象生命周期规则S3 Lifecycle Configuration数据自动过期BigQuery DatasetAWS Glue Catalog Database元数据与查询层TerraformGoogle providerTerraformAWS provider基础设施即代码对应的 main.tf 使用hashicorp/aws~ 5.0依次创建了 S3 桶aws_s3_bucket、版本管理aws_s3_bucket_versioning、公共访问阻断aws_s3_bucket_public_access_block四个开关全部开启、30 天过期生命周期规则aws_s3_bucket_lifecycle_configuration以及 Glue Catalog 数据库aws_glue_catalog_database。变量定义在 variables.tf实际取值写在 terraform.tfvars 中例如bucket_name my-unique-data-lake-bucket-12345、dataset_name ny_taxi_dataset。Terraform 执行四步曲init、plan、apply、destroycohorts/2027/01-docker-terraform/terraform/README.md给出了本课程标准的执行序列与 12-terraform-overview.md 中讲解的四个执行步骤一一对应terraform init初始化并配置后端安装 provider 插件必要时从版本控制中检出已有配置terraform plan把本地变更与远端状态比对预览差异并生成执行计划Execution Planterraform apply请求批准后执行计划把变更应用到云端terraform destroy从云端移除整套资源栈。第一步刷新 ADC 会话令牌Terraform 的 Google provider 依赖 Application Default Credentials 完成身份认证因此在执行 Terraform 命令前先刷新当前会话的认证令牌# Refresh service-accounts auth-token for this session gcloud auth application-default login第二步初始化状态文件# Initialize state file (.tfstate) terraform init该命令会创建.tfstate状态文件本地后端并下载所需的 provider 插件。状态文件把真实云端资源与 HCL 配置一一对应是后续plan/apply/destroy正确性的基础。第三步预览变更计划# Check changes to new infra plan terraform plan -varprojectyour-gcp-project-idplan是只读操作会输出 Terraform 将要创建/修改/删除的资源清单不会真正触碰云端。通过-var命令行参数注入project变量——这种方式优先于variables.tf中的默认值适合临时覆盖或 CI 场景。如果你的变量名不叫project请按 variables.tf 中的实际变量名调整。第四步应用创建基础设施# Create new infra terraform apply -varprojectyour-gcp-project-idapply会重新计算计划并要求你输入yes确认随后在 GCP 上依次创建 GCS 桶、BigQuery 数据集等资源。执行成功后你的数据湖与数据仓库即已就绪可以进入后续数据摄入ingestion环节。第五步用完即销毁避免持续计费# Delete infra after your work, to avoid costs on any running services terraform destroy课程文档特别强调工作完成后执行destroy删除基础设施以避免任何运行中服务产生持续费用。destroy同样会先输出将要删除的资源计划确认后才会执行。版本控制注意事项务必配置 .gitignoreterraform/README.md给出了一条重要警告在把代码发布到 GitHub 之前请务必使用合适的.gitignore文件例如 GitHub 官方维护的Terraform.gitignore。原因在于.tfstate状态文件中可能包含敏感信息如资源标识、部分配置上下文且本地密钥 JSON 文件同样不应入库。一个典型的 Terraform.gitignore至少应排除# Local .terraform directories **/.terraform/* # .tfstate files *.tfstate *.tfstate.* # Crash log files crash.log # Ignore override files override.tf override.tf.json # Include override files you do wish to add using negated pattern !example_override.tf # Ignore CLI configuration files .terraformrc terraform.rcFallback 方案组织策略禁止生成服务账号密钥文件怎么办部分企业组织出于安全策略会禁止下载服务账号密钥.json文件此时GOOGLE_APPLICATION_CREDENTIALS方案无法生效。terraform/README.md提供了完整的替代方案——利用服务账号模拟Service Account Impersonation获取临时令牌完成认证步骤如下。第 1 步授予自己令牌创建者角色在目标服务账号上为自己个人邮箱授予roles/iam.serviceAccountTokenCreator角色gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_EMAIL \ --memberuser:YOUR_EMAILgmail.com \ --roleroles/iam.serviceAccountTokenCreator第 2 步在主配置中添加模拟相关块把以下内容追加到你的主 Terraform 配置例如main.tf中第一个provider google块保持原样用于身份验证ADC随后通过数据源获取目标服务账号的临时访问令牌再用alias impersonated创建第二个 provider让真正的资源创建工作使用该令牌完成# Connect to gcp using ADC (identity verification) provider google { project var.project region var.region zone var.zone } /* add these data blocks */ # This data source gets a temporary token for the service account 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 } # This second provider block uses that temporary token and does the real work provider google { alias impersonated access_token data.google_service_account_access_token.default.access_token project var.project region var.region zone var.zone }关键点说明data google_service_account_access_token是一个data source数据源运行时动态读取信息而不创建资源它通过 ADC 身份向目标服务账号申请一个有效期最长3600s1 小时的临时访问令牌scopes声明令牌的授权范围此处为cloud-platform云平台全量权限第二个provider块通过alias别名区分并把access_token指向上述数据源的输出需要模拟身份创建的resource块中应通过provider google.impersonated显式指定该 provider具体资源内如何挂接可对照 terraform_basic/main.tf 中的资源写法扩展。第 3 步按标准流程继续执行完成上述配置后即可按本文执行四步曲中的init、plan、apply、destroy正常推进无需再提供服务账号密钥文件。常见问题与排错要点结合课程文档与仓库配置梳理几个高频问题plan阶段提示权限不足通常是服务账号缺少角色。请复查 13-gcp-overview.md 中列出的 Storage Admin、Storage Object Admin、BigQuery Admin 以及两个 API 是否已启用。桶名冲突导致apply失败GCS 桶名全局唯一variables.tf中的默认名如terraform-demo-terra-bucket可能已被占用请换成带唯一后缀的名字。destroy卡在桶删除桶内仍有对象时删除会失败terraform_basic配置通过force_destroy true规避该问题若自行编写的配置未开启可先在 Console 清空桶内对象。组织策略禁止下载密钥直接使用本文的 Fallback 模拟方案或参考 13-gcp-overview.md 中Setup for Access一节的 ADC 认证路径。版本不匹配注意terraform_basic使用 provider4.51.0terraform_with_variables使用5.6.0若在旧版 Terraform 上运行请先确认required_providers的版本约束。继续深入课程中的相关资源概念讲解12-terraform-overview.mdIaC、文件结构、声明块、执行步骤GCP 环境准备13-gcp-overview.mdWindows 环境下的 Terraform/GCP 配置指引terraform-on-windows.md最简 GCP 配置terraform/terraform_basic/main.tf变量化 GCP 配置terraform/terraform_with_variables/main.tf 与 variables.tfAWS 等价实现terraform/terraform_with_variable_AWS/README.md本周作业cohorts/2027/01-docker-terraform/homework.md至此你已掌握用 Terraform 在 GCP 上以代码方式搭建数据湖GCS与数据仓库BigQuery的完整链路包括认证、初始化、预览、应用与销毁的每一个环节以及组织级安全策略下的服务账号模拟方案。下一步即可将这套基础设施用于课程后续的数据摄入Week 2与数据仓库建模环节。【免费下载链接】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),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →