【发布时间】:2019-04-24 02:46:07
【问题描述】:
使用 Terraform 时,Google Cloud Platform 锁定状态文件的机制是什么?
AWS 上的 DynamoDB 之类的...
谢谢
【问题讨论】:
标签: google-cloud-platform terraform google-cloud-storage terraform-provider-gcp
使用 Terraform 时,Google Cloud Platform 锁定状态文件的机制是什么?
AWS 上的 DynamoDB 之类的...
谢谢
【问题讨论】:
标签: google-cloud-platform terraform google-cloud-storage terraform-provider-gcp
Google Cloud Platform 与大多数远程后端一样 natively supports locking。 AWS 不支持通过 S3 本地锁定,但正如您通过 DynamoDB 提到的那样。
运行terraform apply,Terraform 会自动获取锁;如果其他人已经在运行apply,他们已经拥有了锁,你需要等待。
您可以使用 -lock-timeout=<TIME> 参数运行 apply 来告诉 Terraform 等待直到 TIME 才能释放锁(例如,-lock-timeout=10m 将等待 10 分钟)。
【讨论】:
gcs 后端通过使用带有.tflock 扩展名的特殊锁定文件来实现 Terraform 状态锁定。在 Terraform 状态操作期间,此文件位于 Terraform 状态本身旁边。例如,如果状态文件位于路径
gs://BUCKET/PREFIX/WORKSPACE.tfstate
那么对应的锁文件将位于路径
gs://BUCKET/PREFIX/WORKSPACE.tflock
锁定的原子性是通过使用称为前提条件的 GCS 功能来保证的。 Terraform 本身使用了 GCP Go SDK 的DoesNotExist condition,而后者又使用了GCS Precondition。下面,这会将这个 HTTP 标头 x-goog-if-generation-match: 0 添加到 GCS 复制请求中。
当
Match前置条件使用值 0 而不是代号时,只有在 Cloud Storage 存储桶中没有具有请求中指定名称的活动对象时,请求才会成功。
这正是 Terraform 状态锁定所需要的。
【讨论】: