【问题标题】: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 之类的...

谢谢

【问题讨论】:

    标签: google-cloud-platform terraform google-cloud-storage terraform-provider-gcp


    【解决方案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) 上的可配置前缀和存储桶中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-05
      • 2018-01-14
      • 2021-09-18
      • 2020-08-17
      • 2021-04-28
      • 2021-07-18
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多