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

What is the mechanism of Terraform state locking when using Google Cloud Platform?

使用 Terraform 时,Google Cloud Platform 锁定状态文件的机制是什么? 类似于 AWS 上的 DynamoDB...

谢谢

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

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

gcs stores the state as an object in a configurable prefix and bucket on Google Cloud Storage (GCS).

Google Cloud Platform 类似于大多数远程后端 natively supports locking。 AWS 不支持通过 S3 本机锁定,但它通过 DynamoDB 支持。

到运行terraform apply,Terraform会自动获取锁;如果其他人已经运行正在申请,他们将已经拥有锁,您将不得不等待。

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

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

gs://BUCKET/PREFIX/WORKSPACE.tfstate

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

gs://BUCKET/PREFIX/WORKSPACE.tflock

来源:hashicorp/terraform

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

根据GCS documentation

When a Match precondition uses the value 0 instead of a generation number, the request only succeeds if there are no live objects in the Cloud Storage bucket with the name specified in the request.

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