使用 Google Cloud Platform 时 Terraform 状态锁定的机制是什么?

zur*_*rol 4 google-cloud-storage google-cloud-platform terraform terraform-provider-gcp

使用 Terraform 时锁定状态文件的 Google Cloud Platform 机制是什么?像DynamoDB在 AWS 上的东西...

谢谢

小智 26

gcs后端通过使用带有扩展名的特殊锁定文件来实现 Terraform 状态锁定.tflock。在 Terraform 状态操作期间,此文件放置在 Terraform 状态本身旁边。例如,如果状态文件位于路径

gs://BUCKET/PREFIX/WORKSPACE.tfstate
Run Code Online (Sandbox Code Playgroud)

那么相应的锁定文件将位于路径

gs://BUCKET/PREFIX/WORKSPACE.tflock
Run Code Online (Sandbox Code Playgroud)

资料来源:hashicorp/terraform

锁定的原子性是通过使用称为前提条件的 GCS 功能来保证的。Terraform 本身使用GCP Go SDK 的DoesNotExist 条件,而 GCP Go SDK 又使用GCS Precondition。在下面,这会将此 HTTP 标头添加x-goog-if-generation-match: 0到 GCS 复制请求中。

根据GCS 文档

当前Match提条件使用值 0 而不是代号时,仅当 Cloud Storage 存储桶中不存在具有请求中指定名称的活动对象时,请求才会成功。

这正是 Terraform 状态锁定所需要的。

  • 我觉得这个答案最符合问题中实际提出的问题。即,gcs后端实现状态锁定0的_机制_是什么。 (3认同)

Max*_*x V 7

与大多数远程后端一样,谷歌云平台本身支持锁定。AWS 不支持通过 S3 本地锁定,但正如您通过 DynamoDB 提到的那样。

要运行terraform apply,Terraform 会自动获取锁;如果其他人已经在运行应用程序,他们将已经拥有锁,您将不得不等待。

您可以apply使用-lock-timeout=<TIME>参数运行以告诉 Terraform 等待TIME释放锁定(例如,-lock-timeout=10m将等待 10 分钟)。

  • 这应该是公认的答案,imo,听起来像 OP 已经知道可以使用 gcs,但正在询问状态锁定。与专门提到 dynamodb 的 s3 后端相比,gcp 支持的文档没有提及“如何”锁定状态 (2认同)

KJH*_*KJH 3

存储状态文件的位置(使用backend定义)与部署到的位置不同。它们可以相同,但不一定相同。例如,您可以将资源部署到 Azure,同时将状态文件存储在 AWS S3 存储桶中。

如果您有兴趣将状态文件存储在 Google Cloud 中,Terraform 有一个名为gcs的后端,其中包含锁定功能。引用文档:

gcs将状态作为对象存储在 Google Cloud Storage (GCS) 上的可配置前缀和存储桶中。