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

Posted

技术标签:

【中文标题】使用 Google Cloud Platform 时 Terraform 状态锁定的机制是啥?【英文标题】:What is the mechanism of Terraform state locking when using Google Cloud Platform?使用 Google Cloud Platform 时 Terraform 状态锁定的机制是什么? 【发布时间】:2019-04-24 02:46:07 【问题描述】:

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这应该是公认的答案,imo,听起来 OP 已经知道可以使用 gcs 但正在询问状态锁定。 gcp 支持的文档没有提及“如何”锁定状态 - 与特别提到 dynamodb 的 s3 后端相比 【参考方案2】:

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

gs://BUCKET/PREFIX/WORKSPACE.tfstate

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

gs://BUCKET/PREFIX/WORKSPACE.tflock

来源:hashicorp/terraform

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

根据GCS documentation:

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

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

【讨论】:

我觉得这个答案最符合问题中实际提出的问题。即gcs后端0实现状态锁定的机制是什么。【参考方案3】:

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

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

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

【讨论】:

以上是关于使用 Google Cloud Platform 时 Terraform 状态锁定的机制是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用Google Cloud Platform的Fastai

使用 Google Cloud Platform 运行 Websocket

Google Cloud Platform:Cloud Functions 与 App Engine

Google Cloud Platform:使用 api 列出可用项目

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

Google Cloud Platform - 数据融合 - 牧马人