7

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

谢谢

4

3 回答 3

13

像大多数远程后端一样,Google Cloud Platform 原生支持锁定。AWS 不支持通过 S3 本地锁定,但正如您通过 DynamoDB 提到的那样。

运行terraform apply时,Terraform 会自动获取锁;如果其他人已经在运行 apply,他们已经拥有了锁,你将不得不等待。

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

于 2020-03-24T19:54:36.677 回答
6

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

gs://BUCKET/PREFIX/WORKSPACE.tfstate

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

gs://BUCKET/PREFIX/WORKSPACE.tflock

资料来源:hashicorp/terraform

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

根据GCS 文档

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

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

于 2021-06-21T22:19:21.987 回答
2

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

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

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

于 2018-11-21T14:49:05.277 回答