使用Terraform时,用于锁定状态文件的Google Cloud Platform机制是什么?
像AWS上的DynamoDB
。
谢谢
答案 0 :(得分:5)
Google Cloud Platform与大多数远程后端natively supports locking一样。 AWS不支持通过S3本机锁定,但正如您通过DynamoDB所提到的那样。
要运行terraform apply
,Terraform将自动获取锁;如果其他人已经在运行应用程序,则他们将已经拥有该锁,您将不得不等待。
您可以使用apply
参数运行-lock-timeout=<TIME>
来通知Terraform最多等待TIME
来释放锁(例如,-lock-timeout=10m
将等待10分钟)。
答案 1 :(得分:1)
状态文件(使用 backend 定义)的存储位置与部署位置不同。它们可以相同,但不必相同。例如,您可以在将状态文件存储到AWS S3存储桶中的同时将资源部署到Azure。
如果您有兴趣将状态文件存储在Google Cloud中,则Terraform的后端称为 gcs ,其中包括锁定。引用文档:
gcs 将状态作为对象存储在Google Cloud Storage(GCS)上可配置的前缀和存储桶中。
答案 2 :(得分:0)
gcs
后端通过使用带有 .tflock
扩展名的特殊锁定文件来实现 Terraform 状态锁定。在 Terraform 状态操作期间,此文件放置在 Terraform 状态本身旁边。例如,如果状态文件位于路径
gs://BUCKET/PREFIX/WORKSPACE.tfstate
那么对应的锁文件就会位于路径
gs://BUCKET/PREFIX/WORKSPACE.tflock
锁定的原子性是通过使用称为前提条件的 GCS 特性来保证的。 Terraform 本身使用 GCP Go SDK 的 DoesNotExist condition,而 GCP Go SDK 又使用 GCS Precondition。在下面,这会将此 HTTP 标头 x-goog-if-generation-match: 0
添加到 GCS 复制请求。
当 Match
前置条件使用值 0 而不是代号时,只有当 Cloud Storage 存储分区中没有具有请求中指定名称的活动对象时,请求才会成功。
这正是 Terraform 状态锁定所需要的。