我正在尝试创建多个 AWS ALB 目标组,每个目标组具有不同的 IP 目标集。
我的变量定义如下。
variable "target_group_names" {
type = list(string)
default = ["tg1", "tg2", "tg3", "tg4"]
}
variable "target_ips" {
type = list(list(string))
default = [
["10.0.0.1", "10.0.0.2"],
["10.0.1.1", "10.0.1.2", "10.0.1.3"],
["10.0.2.1", "10.0.2.2"],
["10.0.3.1", "10.0.3.2"]
]
}
我能够使用下面的方法创建所有目标组,没有任何问题。
resource "aws_lb_target_group" "target_groups" {
count = length(var.target_group_names)
name = var.target_group_names[count.index]
port = 80
protocol = "HTTP"
target_type = "ip"
vpc_id = var.aws_vpc_id
}
现在我正在尝试向这些单独的目标组添加不同的 IP 目标。
resource "aws_lb_target_group_attachment" "tg_attachment" {
count = length(var.target_group_names)
target_group_arn = aws_lb_target_group.target_groups[count.index].arn
target_id = var.target_ips[count.index]
port = 80
availability_zone = "all"
}
这给了我下面的错误,这是一个有效的错误,因为对于 target_id 我正在传递上面的列表。
“属性“target_id”的值不合适:需要字符串。”
我正在尝试找到一种方法来创建多个目标组,然后为每个目标组分配不同的 IP 集,而无需为每个目标组编码资源块。我是 Terraform 的新手,因此我们将不胜感激。
谢谢你
我尝试了几种组合,但没有成功。
我还没有机会尝试该解决方案,但我会首先重新考虑组变量来尝试类似的方法。
variable "target_group_names" {
type = map(set(string))
default = {
"tg1": ["10.0.0.1", "10.0.0.2"],
"tg2": ["10.0.1.1", "10.0.1.2", "10.0.1.3"],
"tg3": ["10.0.2.1", "10.0.2.2"],
"tg4": ["10.0.3.1", "10.0.3.2"]
}
}
然后为了使事情更具可读性,请在局部变量中提取组。
locals {
target_groups = [
for name, ips in var.target_group_names : {
name = name
ips = ips
}
]
}
此时您应该能够迭代这两个资源:
resource "aws_lb_target_group" "target_groups" {
for_each = { for idx, tg in local.target_groups : idx => tg }
name = each.value.name
port = 80
protocol = "HTTP"
target_type = "ip"
vpc_id = var.aws_vpc_id
}
resource "aws_lb_target_group_attachment" "tg_attachment" {
for_each = {
for idx, tg in aws_lb_target_group.target_groups : idx => tg
}
target_group_arn = tg.arn
target_id = each.key
# other configuration...
}