使用 Terraform 时锁定状态文件的 Google Cloud Platform 机制是什么?像DynamoDB
在 AWS 上的东西......
谢谢
使用 Terraform 时锁定状态文件的 Google Cloud Platform 机制是什么?像DynamoDB
在 AWS 上的东西......
谢谢
像大多数远程后端一样,Google Cloud Platform 原生支持锁定。AWS 不支持通过 S3 本地锁定,但正如您通过 DynamoDB 提到的那样。
运行terraform apply
时,Terraform 会自动获取锁;如果其他人已经在运行 apply,他们已经拥有了锁,你将不得不等待。
您可以使用参数运行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
通过使用称为 Precondition 的 GCS 功能来保证锁定的原子性。Terraform 本身使用GCP Go SDK的DoesNotExist 条件,而后者又使用GCS Precondition。下面,这会将这个 HTTP 标头添加x-goog-if-generation-match: 0
到 GCS 复制请求中。
根据GCS 文档:
当前
Match
置条件使用值 0 而不是代号时,只有在 Cloud Storage 存储桶中没有具有请求中指定名称的活动对象时,请求才会成功。
这正是 Terraform 状态锁定所需要的。