本页解答了使用 Terraform 管理 Google Cloud上的资源时遇到的常见问题,尤其是关于 API 互动和入门的问题。
Terraform 使用入门
本部分面向 Terraform 新用户,介绍了基础概念和初始步骤。
什么是基础设施即代码 (IaC),为什么我应该使用 Terraform?
基础设施即代码 (IaC) 是一种通过机器可读的定义文件来管理和预配计算基础设施的做法。如需全面了解 IaC 的概念和优势,请参阅什么是基础架构即代码?。
Terraform 是一种开源 IaC 工具,用于定义、预配和管理云端和本地资源。如需了解在 IaC 工作流中使用 Terraform 的优势,请参阅使用 Terraform 的优势。
如何安装 Terraform 并运行我的第一个配置?
如需开始使用 Terraform,您首先需要在本地机器上下载并安装 Terraform CLI。您可以在 HashiCorp Terraform 网站上找到相关说明。安装完成后,您可以创建 Terraform 配置文件,定义资源(例如 Cloud Storage 存储桶),然后使用 terraform init
初始化工作目录,使用 terraform plan
预览更改,并使用 terraform apply
应用更改。
什么是 HashiCorp 配置语言 (HCL),我可以在哪里学习其语法?
HashiCorp 配置语言 (HCL) 是 Terraform 使用的配置语言。它旨在实现人类可读和机器友好,以便清晰高效地编写和理解基础架构定义。HCL 支持各种功能,例如变量、表达式、函数和模块。您可以通过 HashiCorp Terraform 官方文档了解 HCL 语法,该文档提供了全面的指南和示例。
在哪里可以找到 Google Cloud 资源的 Terraform 配置示例?
您可以找到许多适用于 Google Cloud的 Terraform 配置示例:
HashiCorp Terraform 注册表: Google Cloud 提供程序的官方 Terraform 注册表包含每个资源和数据源的文档和示例。
Google Cloud Terraform 示例:Google 提供了各种 Terraform 示例,演示了如何部署和管理常见的 Google Cloud 资源。
GitHub 代码库:许多开源代码库(包括
terraform-google-modules
GitHub 组织)都提供示例和可重用模块。
如何管理和测试复杂的 Terraform 配置,尤其是在处理大量资源时?
对于复杂的配置,请考虑使用 Terraform 专为可伸缩性和可维护性而设计的功能:
模块:封装和重复使用常见的基础设施模式。
工作区:管理单个配置的多个不同实例。
terraform plan
和terraform validate
:经常使用这些命令来验证语法和预览更改,而无需实际部署。定位资源(谨慎使用):如需测试特定部分,您可以暂时将
-target
与terraform apply
或terraform destroy
搭配使用,但由于状态管理复杂,一般不建议在日常操作中使用。专用环境:先部署到开发或预演环境进行测试,然后再部署到生产环境。
Google Cloud API 问题
这些问题解答了有关 Terraform 与Google Cloud API(包括公共 API 和私有 API)交互的常见疑问。
我可以使用 Terraform 管理或导入内部或私有 Google Cloud API(例如 dataproc-control.googleapis.com
)吗?
不可以。内部或私有 Google Cloud API 是 Google 的受管理 Service Infrastructure 的一部分,不会公开以供客户使用 Terraform 直接管理、启用或导入。这些 API 由 Google Cloud自动处理。尝试直接使用 Terraform 管理这些资源会导致错误。
如需了解全面的说明,请参阅了解 Google Cloud API 和 Terraform 指南。
在 Terraform 中启用 API 与导入资源有何区别?
启用 API:这意味着为您的项目激活特定的 Google Cloud 服务,并授予该项目使用该服务所需的权限。在 Google Cloud上使用 Terraform 时,通常使用
google_project_service
资源来完成此操作。这是创建依赖于相应 API 的资源的前提条件。导入资源:指将 Terraform 外部创建的现有资源 Google Cloud (例如 Compute Engine 实例、Cloud Storage 存储桶)置于 Terraform 的管理之下。您导入的是资源,而不是 API 本身。
如需了解详情,请参阅了解 Google Cloud API 和 Terraform 指南。
如果我不明确管理或导入 dataproc-control.googleapis.com,会怎么样?这会影响我使用 Dataproc 的能力吗?
不会,这不会影响您使用 Dataproc 的能力。dataproc-control.googleapis.com
是 Dataproc 用于自身运营控制的内部 API。其功能由Google Cloud自动管理,无需您使用 Terraform 显式启用、导入或管理。您的 Dataproc 集群和作业将正常运行,无需针对此内部 API 进行任何手动干预。
如何排查 Terraform 中的 403 权限遭拒错误?
403 Permission Denied
错误通常表示 Terraform 使用的服务账号或用户凭据缺少必要的 IAM 权限,无法对特定 Google Cloud 资源执行所请求的操作。问题排查步骤:
确定受影响的资源和 API 方法:错误消息通常会指定资源类型和失败的 API 调用。
检查 IAM 角色:验证主账号(服务账号或用户)是否在相应级别(项目、文件夹、组织或资源)被分配了正确的 IAM 角色。使用 Google Cloud 控制台中的 IAM 问题排查工具。
验证服务启用情况:确认您的项目已启用所需的 Google Cloud API 服务(例如,使用
gcloud services enable
或google_project_service
)。查看组织政策:检查是否有任何组织政策限制了该操作。
为什么我会遇到与配额相关的错误(429 Too Many Requests 或 403 Quota Exceeded)?
当项目尝试消耗的资源或发出的 API 请求超出当前配额允许的范围时,就会发生配额错误。如需解决此问题,请执行以下操作:
确定具体配额:错误消息通常会指明 API 和超出配额限制。
查看当前配额:访问 Google Cloud 控制台中的“配额”页面,查看当前用量和限制。
申请增加配额:如果您需要更多容量,可以直接从“配额”页面申请增加配额。
考虑
user_project_override
:对于某些资源,如果您的凭据项目与资源项目不同,API 请求可能会计入凭据项目的配额。使用user_project_override
(请参阅提供程序参考)有时可以通过强制将配额计入资源的相应项目来解决此问题。
什么是用户管理的默认服务账号?如何使用 Terraform 管理其权限?
在创建项目或启用服务时,某些 Google Cloud 服务会自动创建用户代管式服务账号(通常称为默认服务账号)。这些角色通常具有广泛的权限。虽然它们由用户管理,但由 Google 创建。您可以使用 google_project_iam_member
等 IAM 资源来管理其权限,以修改其角色。如果您想对默认服务账号本身执行操作,例如移除其默认的高权限角色或完全删除账号,可以使用 google_project_default_service_accounts
资源。Google 还提供了有关服务账号的指南。
什么是 Google 代管式服务账号?如何在 Terraform 配置中引用它?
Google 代管式服务账号由 Google 为某些服务创建和全代管式。它们存在于用户项目之外,并且无法像用户代管式服务账号那样由用户直接配置。不过,您可能需要向其授予与您的资源互动的 IAM 权限。您可以在 Terraform 中使用 google_project_service_identity
数据源或资源来引用特定服务的 Google 代管式服务账号的电子邮件地址,然后将 IAM 政策应用于该服务账号。例如,Cloud Build 或 Cloud Composer 等服务通常会使用此权限。
如果我 terraform destroy
已配置 disable_on_destroy
的资源,会发生什么情况?
google_project_service
和某些其他资源(例如 google_storage_bucket
)上的 disable_on_destroy
实参用于控制在销毁 Terraform 资源时,是停用还是删除底层云资源。
如果
disable_on_destroy
为true
(或未设置,因为这通常是默认值),terraform destroy
将尝试停用(对于 API)或删除(对于存储分区)相应的云资源。如果
disable_on_destroy
为false
,terraform destroy
会从 Terraform 状态中移除资源,但会使实际的云资源(例如已启用的 API 或存储桶)在您的 Google Cloud 项目中保持不变。对于不应意外停用或删除的关键服务,此方法通常是首选。