使用 for_each 在 Terraform 中创建多个别名记录
Creating multiple Alias records in Terraform with for_each
我正在尝试使用 for_each 在 terraform 中创建多个别名 DNS 记录。指定别名的名称和区域 ID 时出现错误。我的问题是如何从定义为一组字符串的变量中读取数据?下面是我的代码块和定义的变量:
resource "aws_route53_record" "alias_records" {
for_each = var.alias_names
zone_id = aws_route53_zone.zone.zone_id
name = each.key
type = "A"
alias {
name = var.alias_dns_names[each.key]
zone_id = var.alias_zone_ids[each.key]
evaluate_target_health = false
}
}
variable "alias_names" {
type = set(string)
}
variable "alias_dns_names" {
type = set(string)
}
variable "alias_zone_ids" {
type = set(string)
}
Error: Invalid index
on alias.tf line 8, in resource "aws_route53_record" "alias_records":
8: name = var.alias_dns_names[each.key]
This value does not have any indices.
Error: Invalid index
on alias.tf line 9, in resource "aws_route53_record" "alias_records":
9: zone_id = var.alias_zone_ids[each.key]
This value does not have any indices.
alias_names = [
"alias1",
"alias2",
"alias3"
}
alias_dns_names = [
"alias_dns_1",
"alias_dns_2",
"alias_dns_3"
}
alias_zone_ids = [
"alias_zone_1",
"alias_zone_2",
"alias_zone_3"
}
集合数据结构是无序的,它的元素除了它们的值之外没有任何标识符,所以集合类型不适合您在这里的用例。
由于您似乎在这里描述了同一底层对象的三个不同方面,我认为从您的模块公开它的最方便的方法是作为对象映射,如下所示:
variable "aliases" {
type = map(object({
zone_id = string
dns_name = string
}))
}
然后您可以单独使用此变量来捕获每个别名记录所需的所有三个值:
aliases = {
alias1 = {
zone_id = "alias_zone_1"
dns_name = "alias_dns_1"
}
alias2 = {
zone_id = "alias_zone_2"
dns_name = "alias_dns_2"
}
alias3 = {
zone_id = "alias_zone_3"
dns_name = "alias_dns_3"
}
}
任何数据类型的映射都可以直接与资源for_each
一起使用,each.key
代表映射键,each.value
代表值。所以你可以这样改变你的资源块:
resource "aws_route53_record" "alias_records" {
for_each = var.aliases
zone_id = aws_route53_zone.zone.zone_id
name = each.key
type = "A"
alias {
zone_id = each.value.zone_id
name = each.value.dns_name
evaluate_target_health = false
}
}
因为地图的元素是对象,您可以从 each.value
访问它们以获取与原始地图中每个键对应的 zone_id
和 dns_name
值。
我正在尝试使用 for_each 在 terraform 中创建多个别名 DNS 记录。指定别名的名称和区域 ID 时出现错误。我的问题是如何从定义为一组字符串的变量中读取数据?下面是我的代码块和定义的变量:
resource "aws_route53_record" "alias_records" {
for_each = var.alias_names
zone_id = aws_route53_zone.zone.zone_id
name = each.key
type = "A"
alias {
name = var.alias_dns_names[each.key]
zone_id = var.alias_zone_ids[each.key]
evaluate_target_health = false
}
}
variable "alias_names" {
type = set(string)
}
variable "alias_dns_names" {
type = set(string)
}
variable "alias_zone_ids" {
type = set(string)
}
Error: Invalid index
on alias.tf line 8, in resource "aws_route53_record" "alias_records":
8: name = var.alias_dns_names[each.key]
This value does not have any indices.
Error: Invalid index
on alias.tf line 9, in resource "aws_route53_record" "alias_records":
9: zone_id = var.alias_zone_ids[each.key]
This value does not have any indices.
alias_names = [
"alias1",
"alias2",
"alias3"
}
alias_dns_names = [
"alias_dns_1",
"alias_dns_2",
"alias_dns_3"
}
alias_zone_ids = [
"alias_zone_1",
"alias_zone_2",
"alias_zone_3"
}
集合数据结构是无序的,它的元素除了它们的值之外没有任何标识符,所以集合类型不适合您在这里的用例。
由于您似乎在这里描述了同一底层对象的三个不同方面,我认为从您的模块公开它的最方便的方法是作为对象映射,如下所示:
variable "aliases" {
type = map(object({
zone_id = string
dns_name = string
}))
}
然后您可以单独使用此变量来捕获每个别名记录所需的所有三个值:
aliases = {
alias1 = {
zone_id = "alias_zone_1"
dns_name = "alias_dns_1"
}
alias2 = {
zone_id = "alias_zone_2"
dns_name = "alias_dns_2"
}
alias3 = {
zone_id = "alias_zone_3"
dns_name = "alias_dns_3"
}
}
任何数据类型的映射都可以直接与资源for_each
一起使用,each.key
代表映射键,each.value
代表值。所以你可以这样改变你的资源块:
resource "aws_route53_record" "alias_records" {
for_each = var.aliases
zone_id = aws_route53_zone.zone.zone_id
name = each.key
type = "A"
alias {
zone_id = each.value.zone_id
name = each.value.dns_name
evaluate_target_health = false
}
}
因为地图的元素是对象,您可以从 each.value
访问它们以获取与原始地图中每个键对应的 zone_id
和 dns_name
值。