如何在 terraform 中创建地图

Posted

技术标签:

【中文标题】如何在 terraform 中创建地图【英文标题】:How to create a map in terraform 【发布时间】:2020-10-16 03:49:44 【问题描述】:

我对如何让这个工作感到困惑,我有一个子域 (module.foo.dev) 和备用域名为 *.foo.dev 但它必须使用与我的 root_domain 相同的 zone_id。

我正在尝试使用类似的本地地图

all_domains = 
  ["module.foo.dev","*.foo.dev"] = "foo.dev"
  ["bar.com"] = "bar.com"

我的变量如下 primary_domain = "module.foo.dev" sub_alternate_domain = ["*.foo.dev","bar.com"]

最终会在下面的模块中使用该 locals 值 模块:

resource "aws_route53_record" "record" 

  count      = var.validation_method == "DNS" ? local.all_domains : 0
  name       = aws_acm_certificate.certificate.domain_validation_options.0.resource_record_name
  type       = aws_acm_certificate.certificate.domain_validation_options.0.resource_record_type
  zone_id    = data.aws_route53_zone.selected[count.index].zone_id
  ttl        = "300"
  records    = [aws_acm_certificate.certificate.domain_validation_options.0.resource_record_value]


有人可以帮我解决这个问题吗..

【问题讨论】:

您可以在此处的文档中找到映射类型初始化的语法:terraform.io/docs/configuration/functions/map.html @MattSchuchard 地图功能已被弃用。 @AlainO'Dea 该链接既有旧的函数,也有地图的当前初始化语法。 @MattSchuchard 没有争论,只是澄清读者不应将其视为使用 map 功能的邀请。有趣的是,TF12 map 语法示例比表达式语言文档中的更好。奇怪的世界。 【参考方案1】:

在 Terraform 中,地图只能将字符串作为键(未加引号的键仍然是字符串),因此您需要交换键和值:

locals
  all_domains = 
    "foo.dev" = ["module.foo.dev","*.foo.dev"]
    "bar.com" = ["bar.com"]
  

此外,如上所述,您的局部变量需要在 locals 块中声明和分配。

资源的 count 参数需要一个完整的非负数(0 或更大),并且不会接受映射作为值。你需要使用 for_each 代替:

resource "aws_route53_record" "record" 

  for_each      = var.validation_method == "DNS" ? local.all_domains : 
  name       = aws_acm_certificate.certificate.domain_validation_options.0.resource_record_name
  type       = aws_acm_certificate.certificate.domain_validation_options.0.resource_record_type
  zone_id    = data.aws_route53_zone.selected[count.index].zone_id
  ttl        = "300"
  records    = [aws_acm_certificate.certificate.domain_validation_options.0.resource_record_value]


map type in the Expression Language doc 提供了一些最低限度的额外指导。

【讨论】:

@user6826691 您的问题是“如何在 terraform 中创建地图”。我在回答这个问题时有什么遗漏吗?您现在似乎在问一个单独的问题,您应该将此标记为正确,然后单独提出后续问题。

以上是关于如何在 terraform 中创建地图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Terraform 中创建 SSH 密钥?

在 Terraform 中,如何在包含的模块中引用根模块中创建的组件

如何使用 API 或 Terraform 模板在 GCP 中创建 StackDriver 工作区

如果找不到要从中恢复的快照,如何在 terraform 中创建 ebs 卷

在 terraform 中创建动态块

如何在 terraform 中创建允许/拒绝防火墙规则条件?