Terraform 地形空和非空块地图变量

Terraform 地形空和非空块地图变量,terraform,terraform-provider-gcp,Terraform,Terraform Provider Gcp,我想用Terraform做后端服务。我使用资源类型google\u计算\u后端\u服务 现在,我有了两个通过gcloud命令创建的后端服务。一个正在使用cdn\u策略,另一个未使用cdn\u策略 第一个后端服务状态如下 ... "cdn_policy": [ { "cache_key_policy": [], "signed_url_cache_max_age_sec": 3600 } ] ... 第二个后端

我想用Terraform做后端服务。我使用资源类型
google\u计算\u后端\u服务

现在,我有了两个通过
gcloud
命令创建的后端服务。一个正在使用
cdn\u策略
,另一个未使用
cdn\u策略

第一个后端服务状态如下

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

第二个后端服务是

"cdn_policy": []
如何创建terraform脚本对它们都有效?因此,terraform脚本可以为具有
cdn\U策略
包含在其块映射中的后端服务运行,也可以为没有
cdn\U策略
的后端服务运行

在我的想法中,我可以创建2个地形脚本。第一个是cdn_政策,第二个是没有cdn_政策。但是,我认为这不是最佳做法


如果我将
cdn_policy=[]
,将导致错误
此处不需要名为“cdn_policy”的参数

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


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


我认为,您的答案是第一个后端服务的良好实现,它在tfstate上有cdn_策略块。第二个没有cdn_策略的后端服务呢?“cdn_政策=[]”?因为我以前不知道动态块,所以我竖起大拇指,这是个好主意。如果
var.cdn_policy=[]
,那么动态块根本就不会创建,并且从资源中完全忽略。这是一个为列表中的每个项目创建一个块的过程。所以空列表,没有块。包含1项、1块的列表。。。列出2个项目,2个块,等等。我认为,您的答案是第一个后端服务的良好实现,它在tfstate上有cdn_策略块。第二个没有cdn_策略的后端服务呢?“cdn_政策=[]”?因为我以前不知道动态块,所以我竖起大拇指,这是个好主意。如果
var.cdn_policy=[]
,那么动态块根本就不会创建,并且从资源中完全忽略。这是一个为列表中的每个项目创建一个块的过程。所以空列表,没有块。包含1项、1块的列表。。。包含2项、2块等的列表。
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
    }
  }
}