【问题标题】:Terraform empty and non-empty block map variablesTerraform 空和非空块地图变量
【发布时间】:2020-11-27 03:05:48
【问题描述】:

我想使用 Terraform 做后端服务。我用resource_type google_compute_backend_service

现在,我有 2 个由 gcloud 命令创建的后端服务。一个使用cdn_policyblock,另一个不使用cdn_policy

第一个 backend-services tfstate 是这样的

...
"cdn_policy": [
  {
    "cache_key_policy": [],
    "signed_url_cache_max_age_sec": 3600
  }
]
...

第二个后端服务就像

"cdn_policy": []

如何创建适用于它们的 terraform 脚本?因此,terraform 脚本可以为包含 cdn_policy 及其块图的后端服务运行,也可以为没有 cdn_policy 的后端服务运行。

在我的想法中,我可以创建 2 个 terraform 脚本。第一个用于 cdn_policy,第二个没有 cdn_policy。但是,我认为这不是最佳做法。

如果我输入cdn_policy = [],则会导致错误An argument named "cdn_policy" is not expected here

【问题讨论】:

    标签: terraform terraform-provider-gcp


    【解决方案1】:

    您可以使用动态块根据输入变量中的对象列表创建一组块:Dynamic Blocks

    resource "google_compute_backend_service" "service" {
    
      ...
    
      dynamic "cdn_policy" {
        for_each = var.cdn_policy
    
        content {
          cache_key_policy             = cdn_policy.value.cache_key_policy
          signed_url_cache_max_age_sec = cdn_policy.value.signed_url_cache_max_age_sec
        }
      }
    }
    

    【讨论】:

    • 我认为,您的答案是第一个后端服务的良好实现,它在 tfstate 上有 cdn_policy 块。没有 cdn_policy 的第二个后端服务呢? “cdn_policy = []”?由于我以前不知道动态块,所以我竖起大拇指,真是个好主意。
    • 如果 var.cdn_policy = [] 则根本不创建动态块,并且从资源中完全省略。它是列表中的每个项目创建一个块。所以空列表,没有块。包含 1 个项目、1 个块的列表...包含 2 个项目、2 个块等的列表
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 2014-09-01
    • 2021-07-20
    • 1970-01-01
    • 2020-12-24
    • 2020-10-09
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多