ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Data Engineering Zoomcamp 实战:Terraform + GCP 一键搭建数据湖与数据仓库基础设施

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 课程中 01-docker-terraform/terraform 模块为核心系统讲解如何在 GCP 上使用 TerraformIaC以代码方式创建数据工程课程所需的核心云基础设施——Google Cloud Storage数据湖与 BigQuery数据仓库。读者学完后将掌握GCP 账号与服务的初始化流程、Terraform 核心概念与配置文件结构、完整的init → plan → apply → destroy生命周期命令以及如何用变量、tfvars、IAM 角色与凭据管理让基础设施配置可复用、可版本化、可安全销毁从而为后续数据管道搭建打下坚实基础。一、课程基础设施蓝图GCS 数据湖 BigQuery 数据仓库在开始编写 Terraform 配置之前先明确本课程在 GCP 上要构建的两个核心基础设施模块参见 GCP 概览文档模块GCP 服务在课程中的角色Data LakeGoogle Cloud StorageGCS存放原始数据如出租车行程数据 CSV/Parquet 文件Data WarehouseBigQuery用于查询、转换和分析的结构化数据仓库这两个概念在课程 Week 2Data Ingestion中会进一步展开但基础设施层面的准备就是本文要完成的工作。所有云资源都通过 Terraform 以「基础设施即代码IaC」的方式定义和编排保证环境可重复创建、可版本控制、可安全拆除。二、准备阶段前置条件与 GCP 初始设置2.1 前置条件Terraform 客户端从 Terraform 官网下载并安装 Terraform CLI安装包支持 Windows / macOS / Linux详见官方下载页。云厂商账号注册 Google Cloud Platform 账号并登录 Google Cloud Console。本课程使用 GCP 免费额度最高约 300 美元信用额足以完成整个课程的基础设施练习。2.2 GCP 初始设置首次使用按照 GCP 概览文档 的「Initial Setup」步骤执行创建账号使用你的 Google 邮箱注册 Google Cloud 账号。创建项目在 Console 中创建你的第一个 GCP 项目例如命名为DTC DE Course。务必记录下「Project ID」稍后部署 Terraform 基础设施时需要使用它。创建服务账号并配置认证为项目创建服务账号Service Account先授予Viewer角色下载服务账号密钥文件.json格式用于本地认证。安装 Google Cloud SDK用于本地命令行操作 GCP。设置环境变量指向下载的 GCP 密钥文件并刷新认证令牌export GOOGLE_APPLICATION_CREDENTIALSpath/to/your/service-account-authkeys.json # 刷新令牌/会话并验证认证 gcloud auth application-default loginGOOGLE_APPLICATION_CREDENTIALS是 Google 官方认可的「应用默认凭据ADC」环境变量。设置后Terraform 的 Google Provider 会自动读取它完成认证无需在代码中硬编码密钥路径。2.3 服务账号访问权限设置Setup for Access仅授予Viewer角色不足以创建和操作存储桶与数据集需要追加以下权限IAM 角色进入IAM Admin → IAM控制台https://console.cloud.google.com/iam-admin/iam点击服务账号的Edit principal编辑主体图标在Viewer之外追加以下三个角色Storage Admin管理 GCS 存储桶Storage Object Admin管理存储桶中的对象BigQuery Admin管理 BigQuery 数据集与表。启用项目 API确保以下 API 已在项目中启用IAM APIhttps://console.cloud.google.com/apis/library/iam.googleapis.comIAM Service Account Credentials APIhttps://console.cloud.google.com/apis/library/iamcredentials.googleapis.com再次确认环境变量已设置export GOOGLE_APPLICATION_CREDENTIALSpath/to/your/service-account-authkeys.json2.4 Windows 用户的特殊说明普通 Windows非 WSL用户可以参考 windows.md 完成 GCP SDK 与 Terraform 的安装配置需要 Linux 风格环境如 GitBash、MinGW 或 CygwinPowerShell 也可但需自行调整命令下载 Google Cloud SDK 的 zip 包并解压运行install.sh若安装器提示无法自动更新 PATH手动将C:\tools\google-cloud-sdk\bin加入 PATH若使用 Anaconda设置export CLOUDSDK_PYTHON~/Anaconda3/python后再运行gcloud version验证服务账号密钥放在本地后设置GOOGLE_APPLICATION_CREDENTIALS使用gcloud auth activate-service-account --key-file $GOOGLE_APPLICATION_CREDENTIALS或gcloud auth application-default login认证若遇到quota exceeded提示运行gcloud auth application-default set-quota-project ${PROJECT_NAME}指定配额项目Terraform 安装后进入配置文件目录运行terraform init、terraform plan、terraform apply。提示如果你遇到storage.buckets.create access ... forbidden之类的 403 错误说明服务账号权限不足请回到 2.3 节补齐 IAM 角色。三、Terraform 核心概念IaC 与声明式配置3.1 什么是 Terraform 与 IaCTerraform 是 HashiCorp 出品的开源基础设施编排工具用于以代码方式供应provision云基础设施资源。它支持 DevOps 最佳实践中的变更管理把配置文件放入源代码管理即可为测试环境与生产环境维护理想的供应状态。IaCInfrastructure-as-Code基础设施即代码指通过定义可版本化、可复用、可共享的资源配置以安全、一致、可重复的方式构建、变更和管理基础设施参见 Terraform 概览文档。Terraform 的主要优势基础设施生命周期管理从创建、更新到销毁全流程管理版本控制提交所有配置变更可被 Git 追踪与回滚支持多云与多种平台适用于 AWS、GCP、Azure、Kubernetes 等基于栈的部署基于 State状态的方法通过状态文件追踪每次部署过程中的资源变化。3.2 Terraform 文件体系一个典型的 Terraform 项目包含以下文件文件作用main.tf核心资源配置provider、resource 等variables.tf输入变量定义可带默认值可选resources.tf、output.tf拆分资源块与输出值.tfstate状态文件Terraform 自动生成映射真实资源与配置3.3 核心声明块Declaration Blocksterraform块配置 Terraform 的基础设置required_version声明最低 Terraform 版本backend存储 Terraform 的「状态」快照用于将真实世界资源映射到配置local后端表示状态文件保存在本地terraform.tfstaterequired_providers声明当前模块所需的 provider。provider块引入一组 Terraform 可管理的资源类型或数据源。Terraform Registry 是公开 provider 的主目录涵盖绝大多数主流基础设施平台。resource块定义基础设施的组成部件。本课程项目中的资源类型包括google_storage_bucket、google_bigquery_dataset、google_bigquery_table等。variable与locals分别表示运行时参数与常量。3.4 Terraform 执行四步曲命令作用terraform init初始化并配置后端安装 provider 插件从版本控制检出已有配置terraform plan将本地变更与远端状态比对预览并生成「执行计划Execution Plan」terraform apply请求批准执行计划并将变更应用到云环境terraform destroy从云上移除整套栈stack这四条命令构成了本课程 Terraform 工作坊的全部操作流程。四、Terraform 工作坊从入门到生产级配置工作坊代码位于 terraform/terraform 目录包含三个递进版本terraform_basic硬编码基础版、terraform_with_variables变量化 GCP 版、terraform_with_variable_AWSAWS 对标版。4.1 版本一terraform_basic基础版 main.tfterraform_basic/main.tf 展示了最直接的资源配置方式声明了 Google Provider、GCS 数据湖存储桶和 BigQuery 数据集terraform { required_providers { google { source hashicorp/google version 4.51.0 } } } provider google { # 只有在未设置 GOOGLE_APPLICATION_CREDENTIALS 时才需要显式 credentials # credentials project Your Project ID region us-central1 } 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 // 天 } } force_destroy true } resource google_bigquery_dataset dataset { dataset_id The Dataset Name You Want to Use project Your Project ID location US }关键参数解读required_providers.google.version 4.51.0锁定 Google Provider 版本保证配置可复现provider.googleproject与region直接写死credentials注释掉默认走GOOGLE_APPLICATION_CREDENTIALS环境变量认证google_storage_bucketname必须全局唯一storage_class STANDARD标准存储类uniform_bucket_level_access true启用统一桶级访问控制更安全推荐配合生命周期规则versioning.enabled true开启对象版本管理防止误删lifecycle_rule对象超过 30 天自动删除age 30force_destroy true即使桶内仍有对象销毁时也强制删除桶。google_bigquery_dataset定义数据仓库的数据集dataset_id自拟、location US。注意该版本中project、bucket name、dataset_id均需手工替换尖括号占位符属于入门演示用途。4.2 版本二terraform_with_variables变量化 GCP 版为避免把项目 ID、桶名等敏感/易变值写死在代码里第二个版本把所有可配置项抽取为变量。variables.tf 定义如下变量variable credentials { description My Credentials default Path to your Service Account json file # 示例若在 keys 目录下存放 my-creds.json # 可写 default ./keys/my-creds.json } variable project { description Project default Your Project ID } variable region { description Region # 可按需修改为你期望的区域 default us-central1 } variable location { description Project Location # 可按需修改为你期望的位置 default US } variable bq_dataset_name { description My BigQuery Dataset Name # 改成你希望的数据集名称 default demo_dataset } variable gcs_bucket_name { description My Storage Bucket Name # 改成全局唯一的桶名 default terraform-demo-terra-bucket } variable gcs_storage_class { description Bucket Storage Class default STANDARD }对应的 main.tf 使用var.xxx引用这些变量terraform { required_providers { google { source hashicorp/google version 5.6.0 } } } provider google { credentials file(var.credentials) project var.project region var.region } resource google_storage_bucket demo-bucket { name var.gcs_bucket_name location var.location force_destroy true lifecycle_rule { condition { age 1 } action { type AbortIncompleteMultipartUpload } } } resource google_bigquery_dataset demo_dataset { dataset_id var.bq_dataset_name location var.location }与基础版的关键差异Provider 版本升级为5.6.0credentials file(var.credentials)通过file()函数读取服务账号 JSON 文件内容将凭据显式传入 provider另一种认证方式与 ADC 环境变量二选一存储桶与数据集名称、位置、区域全部由变量驱动一处修改全局生效。4.3 版本三terraform_with_variable_AWSAWS 对标版该目录提供了一个AWS 对标实现用 AWS 服务映射 GCP 的课程基础设施帮助偏好 AWS 或希望理解云中立数据工程概念的读者详见 目录内 README。GCP 服务AWS 对标服务用途Google Cloud StorageGCSAmazon S3数据湖存储统一桶级访问Uniform Bucket Level AccessS3 Public Access Block安全控制桶访问对象生命周期规则S3 Lifecycle Configuration数据自动过期BigQuery DatasetAWS Glue Catalog Database元数据与查询层TerraformGCP providerTerraformAWS provider基础设施即代码main.tf 使用hashicorp/awsprovider~ 5.0创建 S3 桶、开启版本管理、封禁公共访问、配置 30 天过期生命周期并用 Glue Catalog Database 作为数据集元数据层terraform { required_providers { aws { source hashicorp/aws version ~ 5.0 } } } provider aws { region var.aws_region } # S3 桶用于存储数据对标 GCP 的 GCS 桶 resource aws_s3_bucket data_lake_bucket { bucket var.bucket_name force_destroy true } # 桶版本管理 resource aws_s3_bucket_versioning versioning { bucket aws_s3_bucket.data_lake_bucket.id # 引用上面创建的 S3 桶 versioning_configuration { status Enabled } } # 对标 GCP 的 uniform bucket level access推荐封禁公共访问 resource aws_s3_bucket_public_access_block block_public_access { bucket aws_s3_bucket.data_lake_bucket.id block_public_acls true block_public_policy true ignore_public_acls true restrict_public_buckets true } # 生命周期删除超过 30 天的对象对标 GCP 的 lifecycle_rule age30 resource aws_s3_bucket_lifecycle_configuration lifecycle_rules { bucket aws_s3_bucket.data_lake_bucket.id rule { id Delete_old_older_than_30_days status Enabled expiration { days 30 } filter { prefix # 应用于桶内所有对象 } } } resource aws_glue_catalog_database dataset { name var.dataset_name }variables.tf 与 terraform.tfvars 分别定义默认值与按环境覆盖的值。注意.tfvars文件是 Terraform 自动加载的变量赋值文件可在不改动代码的情况下按环境注入具体值例如把bucket_name改为全局唯一的实际桶名。五、执行指南init / plan / apply / destroy 全流程完成 GCP 初始化见第二节并选择好配置目录后即可按以下步骤执行命令示例来自 terraform/README.md。5.1 刷新认证并初始化# 刷新服务账号本次会话的认证令牌 gcloud auth application-default login # 初始化状态文件.tfstate安装 provider 插件 terraform initterraform init是任何 Terraform 项目的第一个命令它初始化后端、下载并安装required_providers中声明的 provider 插件并准备好本地状态环境。5.2 预览变更计划# 检查新基础设施的变更计划 terraform plan -varprojectyour-gcp-project-id-var参数以命令行方式覆盖project变量等价于修改variables.tf中的默认值或.tfvars文件。plan阶段不会产生任何云资源变更只是把「当前状态」与「期望状态」做对比并输出执行计划。5.3 创建基础设施# 创建新的基础设施 terraform apply -varprojectyour-gcp-project-idapply会再次展示执行计划并要求你确认输入yes确认后开始在 GCP 上创建 GCS 存储桶与 BigQuery 数据集。完成后可通过 GCP Console 验证资源已创建。5.4 清理基础设施避免费用# 工作结束后删除基础设施避免任何运行中的服务产生费用 terraform destroydestroy会移除整套栈。由于示例配置中设置了force_destroy true即使桶内仍有对象也能被删除。建议在课程练习告一段落后执行避免免费额度被长期占用。5.5 发布前注意事项在把 Terraform 配置推送到 GitHub 等公共仓库前务必使用合适的.gitignore官方 Terraform.gitignore 模板即可把.tfstate状态文件、.tfvars中可能包含的密钥、.terraform目录等排除在外避免泄露凭据。六、高级话题组织策略下的凭据替代方案Fallback如果你的组织策略禁止直接生成/下载服务账号密钥文件仓库提供了基于服务账号模拟Impersonation的替代认证方案见 terraform/README.md 的 Fallback 小节给自己授予 Token Creator 角色绑定到目标服务账号gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_EMAIL \ --memberuser:YOUR_EMAILgmail.com \ --roleroles/iam.serviceAccountTokenCreator在 main 配置的第一个块之后追加以下内容先通过google_service_account_access_token数据源获取临时令牌再创建一个使用该令牌的别名 provider# 使用 ADC身份验证连接 GCP provider google { project var.project region var.region zone var.zone } /* 追加以下 data 块 */ # 该数据源为服务账号获取一个临时令牌 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 块使用该临时令牌完成实际工作 provider google { alias impersonated access_token data.google_service_account_access_token.default.access_token project var.project region var.region zone var.zone }之后即可照常按第五节命令执行。该方案的核心思路是不让开发者持有长期有效的密钥文件而是通过 IAM Token Creator 角色在运行时换取短期访问令牌lifetime为 3600 秒令牌过期即失效安全性更高。七、Terraform 课程文档速查与 Terraform 模块相关的完整文档链以仓库根目录为起点的相对路径Terraform 模块入口 README本地环境准备 工作坊入口Terraform 概览IaC 概念、文件体系、声明块与执行步骤GCP 概览GCP 初始设置与 IAM 权限配置Windows 专属安装指南普通 Windows 环境安装 GCP SDK 与 TerraformTerraform 工作坊代码terraform_basic、terraform_with_variables、terraform_with_variable_AWS三个递进版本。这些文档与代码共同构成了「本地 GCP 环境准备 → 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),仅供参考
返回列表