使用 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 状态锁定所需要的。