如何在 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 中,如何在包含的模块中引用根模块中创建的组件
如何使用 API 或 Terraform 模板在 GCP 中创建 StackDriver 工作区