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

15

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

谢谢

3个回答

23

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

gs://BUCKET/PREFIX/WORKSPACE.tfstate

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

gs://BUCKET/PREFIX/WORKSPACE.tflock

源代码: hashicorp/terraform

使用GCS功能称为Precondition来保证锁定的原子性。 Terraform本身使用GCP Go SDK的DoesNotExist条件,该SDK又使用GCS Precondition。在底层,这将向GCS复制请求添加此HTTP标头x-goog-if-generation-match: 0

根据GCS文档:

Match预条件使用值0而不是生成号码时,仅当云存储桶中没有指定请求中指定名称的活动对象时,请求才成功。

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


3
我觉得这个答案最符合问题的实际需求。也就是说,状态锁定在gcs后端是如何实现的机制。 - Matt Dunn

21

Google云平台和大部分远程后端一样会原生地支持锁定,这里有详细说明。AWS不支持通过S3来原生地锁定,但正如您所提到的那样,它可以通过DynamoDB实现。

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

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


2
在我看来,这应该是被接受的答案。似乎 OP 已经知道可以使用 GCS,但是正在询问状态锁定。与 S3 后端明确提到 DynamoDB 相比,GCP 后端的文档没有提到“如何”锁定状态。 - iamgeef
1
关键在于GCS 本地 支持状态锁定;如果来自AWS背景,几乎很难理解这一点,因为换句话说:GCS不需要考虑状态锁定,因为它会自动处理。 - Digital Impermanence

3

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接