aws_lb_target_group_attachment期间的for_each参数无效



我有两个target_groups,一个用于端口80,另一个用于443。还有两个实例作为(该NLB的(成员,我需要将两个目标组都附加到每个实例。所以这就是我配置的方式,连接:

// Creates the target-group
resource "aws_lb_target_group" "nlb_target_groups" {
for_each = {
for lx in var.nlb_listeners : "${lx.protocol}:${lx.target_port}" => lx
}
name                 = "${var.vpc_names[var.idx]}-tgr-${each.value.target_port}"
deregistration_delay = var.deregistration_delay
port                 = each.value.target_port
protocol             = each.value.protocol
vpc_id               = var.vpc_ids[var.idx]
proxy_protocol_v2    = true
health_check {
port                = each.value.health_port
protocol            = each.value.protocol
interval            = var.health_check_interval
healthy_threshold   = var.healthy_threshold
unhealthy_threshold = var.unhealthy_threshold
}
}
// Attach the target groups to the instance(s)
resource "aws_lb_target_group_attachment" "tgr_attachment" {
for_each = {
for pair in setproduct(keys(aws_lb_target_group.nlb_target_groups), var.nlb_members.ids) : "${pair[0]}:${pair[1]}" => {
target_group = aws_lb_target_group.nlb_target_groups[pair[0]]
instance_id  = pair[1]
}
}
target_group_arn = each.value.target_group.arn
target_id        = each.value.instance_id
port             = each.value.target_group.port
#target_id       = [for tid in range(var.inst_count) : data.aws_instances.nlb_insts.ids[tid]]
}

其中var.nlb_listeners定义如下:

nlb_listeners = [
{
protocol    = "TCP"
target_port = "80"
health_port = "1936"
},
{
protocol    = "TCP"
target_port = "443"
health_port = "1936"
}
]

CCD_ 2是这样的:

"ids" = [
"i-015604f88xxxxxx42",
"i-0e4defceexxxxxxe5",
]

但是我得到了无效的for_each参数错误:

错误:for_each参数无效

在..//modules/elb/balencer.tf行46,在资源中"aws_lb_target_group_attachment"tgr_attachment":46:for_each={47:中的对setproduct(密钥(aws_lb_target_group.nlb_target_groups(,var.elb_members.ids(:"${pair[0]}:${pair[1]}"=>{48:
target_group=aws_lb_target_group.nlb_target-groups[ppair[0]]49:
instance_id=pair[1]50:}51:}

"for_each"值取决于不能在应用之前已确定,因此Terraform无法预测有多少实例将被创建。要解决此问题,请使用-target参数首先只应用for_each所依赖的资源。

我不知道为什么它无效,也不知道这个for_each如何无法确定值。你知道我在这里做错了什么吗?真的被夹在中间,真的很感谢任何帮助,让我朝着正确的方向前进。

-S

===更新:02/23======

@马丁·阿特金斯,我想我理解你说的话,但这似乎给了我同样的错误,即使是已经存在的例子。无论如何,这是我的aws_instance资源:

resource "aws_instance" "inst" {
count         = var.inst_count
instance_type = var.inst_type
depends_on    = [aws_subnet.snets]
ami           = data.aws_ami.ubuntu.id
# the VPC subnet
subnet_id              = element(aws_subnet.snets.*.id, count.index)
vpc_security_group_ids = [var.sg_default[var.idx], aws_security_group.secg.id]
user_data = <<-EOF
#!/bin/bash
hostnamectl set-hostname ${var.vpc_names[var.idx]}${var.inst_role}0${count.index + 1}
# Disable apt-daily.service & wait until `apt updated` has been killed
systemctl stop apt-daily.service && systemctl kill --kill-who=all apt-daily.service
while ! (systemctl list-units --all apt-daily.service | egrep -q '(dead|failed)')
do sleep 1; done
EOF
# the public SSH key
key_name = var.key_info
tags = merge(
var.common_tags,
{ "Name" = "${var.vpc_names[var.idx]}${var.inst_role}0${count.index + 1}" }
)
}

你认为还可以做些什么来解决这个问题?

-S

EC2实例ID在创建实例之前不会分配,因此AWS提供商无法在计划阶段预先计算它们。因此,它们不适合用作for_each映射的密钥的一部分。

相反,您需要为那些实例使用一些其他标识符,这些标识符由配置本身决定,而不是由提供者在应用过程中返回的数据决定。您没有共享实例本身的配置,因此我无法提出具体建议,但如果它们都是由countfor_each创建的同一资源的实例,则常见的选择是使用每个实例的索引(对于count(或每个实例的唯一密钥(对于for_each(,使得该映射的元素将被添加和移除,以对应于被添加和删除的实例本身。

我终于解决了这个问题。不确定这是否是最好的方法,但现在对我来说没有错误。基本上,我已经这样更改了数据查找:

// List of instance attributes by role
data "aws_instance" "by_role" {
for_each = {
for ic in range(var.inst_count): "${var.inst_role}0${ic+1}" => ic
}
instance_tags  = {
Name = "${var.vpc_names[var.idx]}${each.key}"
}
instance_id    = aws_instance.inst[substr(each.key,4,2)-1].id
}

并将其用于CCD_ 9中,如下所示:

for_each = {
for pair in setproduct(keys(aws_lb_target_group.nlb_target_groups), keys(aws_instance.by_role)):
"${pair[0]}:${pair[1]}" => {
target_group = aws_lb_target_group.nlb_target_groups[pair[0]]
member_name  = aws_instance.by_role[pair[1]]
}
}

详细信息在这里,我在Terraform社区论坛上回答了自己的问题,以防其他人面临与我相同的问题。

-San

相关内容

  • 没有找到相关文章

最新更新