使用 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 列出可用项目