terraform - 如何即时修改地图?
问题描述
我需要在特定的 HCL Map 键/值对上迭代更多次,这些键/值对需要基于特定变量的值。
我想到了修改当前映射的想法——这样某些键/值将被迭代更多次。
如果我们有这张地图 - 让我们称之为“map_domains”:
key_1 = value_1
key_2 = value_2
我们已经设置了这些变量:
variable "domains" {
type = "list"
default = [
"key_1",
"key_2",
]
}
variable "domain_alt_names" {
type = "map"
default = {
key_1 = "value_1, value_2"
key_2 = "value_3, value_4, value_5"
}
}
我们如何将地图“map_domains”修改为:
key_1 = value_1
key_1 = value_1
key_1 = value_1
key_2 = value_2
key_2 = value_2
key_2 = value_2
key_2 = value_2
我正在尝试通过 DNS 验证选项验证几个 AWS ACM 证书 - 每个域都有几个域备用名称,它们还需要在 Route53 中创建 DNS 记录,以便正确验证域证书。
这是用于实现总体目标的代码 - 问题在于 Zone ID 需要在前几次迭代中相同,然后在其余迭代中需要另一个。
这一行:
zone_id = "${lookup(local.hosted_zone_ids_zipmap, element(keys(local.hosted_zone_ids_zipmap), count.index))}"
整个代码:
#
# EKS Worker Nodes Resources
# * Issuing ACM certificates
#
resource "aws_route53_zone" "zones" {
count = "${length(var.domains)}"
name = "${element(var.domains, count.index)}"
}
locals {
hosted_zone_ids_zipmap = "${zipmap(var.domains, aws_route53_zone.zones.*.zone_id)}"
}
resource "aws_acm_certificate" "cert" {
count = "${length(var.domains)}"
domain_name = "${element(keys(local.hosted_zone_ids_zipmap), count.index)}"
subject_alternative_names = ["${
lookup(var.domain_alt_names,
"${element(var.domains, count.index)}")
}"]
validation_method = "DNS"
tags {
Domain = "${element(keys(local.hosted_zone_ids_zipmap), count.index)}"
}
}
locals {
dvo = "${flatten(aws_acm_certificate.cert.*.domain_validation_options)}"
}
resource "aws_route53_record" "cert_validation" {
count = "${length(var.domain_alt_names) + length(var.domains)}"
zone_id = "${lookup(local.hosted_zone_ids_zipmap, element(keys(local.hosted_zone_ids_zipmap), count.index))}"
name = "${lookup(local.dvo[count.index], "resource_record_name")}"
type = "${lookup(local.dvo[count.index], "resource_record_type")}"
records = ["${lookup(local.dvo[count.index], "resource_record_value")}"]
ttl = 60
depends_on = ["aws_acm_certificate.cert"]
}
resource "aws_acm_certificate_validation" "cert" {
count = "${length(var.domains)}"
certificate_arn = "${aws_acm_certificate.cert.*.arn[count.index]}"
validation_record_fqdns = ["${aws_route53_record.cert_validation.*.fqdn[count.index]}"]
depends_on = ["aws_acm_certificate.cert", "aws_route53_record.cert_validation"]
}
解决方案
我想通了:
(1) 增加了这个变量:
variable "domain_names_index" {
// A flat map that will act as nested map
//// for the subdomains and the alternative domain names
//// so that the Hosted Zone ID can be calculated in a reverse order
//// during the creation of the DNS Validation Route53 records
type = "map"
default = {
tftestingdatorama.io = "2"
tftestingdatorama.org = "2"
tftestingdlite.co = "1"
tftestingdlite.org = "1"
}
}
(2) 然后我将代码更改为:
resource "aws_route53_record" "cert_validation" {
count = "${length(var.domain_alt_names) + length(var.domains)}"
zone_id = "${
lookup(local.hosted_zone_ids_zipmap,
element(keys(local.hosted_zone_ids_zipmap),
lookup(var.domain_names_index, "${lookup(local.dvo[count.index], "domain_name")
}")))}"
name = "${lookup(local.dvo[count.index], "resource_record_name")}"
type = "${lookup(local.dvo[count.index], "resource_record_type")}"
records = ["${lookup(local.dvo[count.index], "resource_record_value")}"]
ttl = 60
depends_on = ["aws_acm_certificate.cert"]
}
推荐阅读
- python - 尝试在 tkinter mainloop 旁边运行一个 while true 循环
- django - 字段 'id' 需要一个数字,但得到了 ''
- python-3.x - 希望使用 .dat 文件制作二维地图的初学者
- python - Python - 将纬度/经度转换为几何
- java - Android Studio 上的 Android 模拟器中未显示按钮
- postgresql - postgresql 日志转储到表中
- javascript - 添加项目以回复 KnexJs
- sql-server - 在 CTE 中寻求 Tsql 错误连接解释
- javascript - Reactjs - SetTimeout 与状态更改重新渲染
- r - 检查同一组中各行的值的最快方法是什么?