Terraform配置ALB与AutoScaling Group报实例ID无效错误
执行Terraform编排AWS ALB(应用负载均衡)与Auto Scaling Group(自动伸缩组)时,执行末尾抛出如下错误:
Error: Error registering targets with target group: ValidationError: Instance ID 'arn:aws:elasticloadbalancing:us-west-2:993276023740:targetgroup/ilab-app-loadbalancer/52c7cb8bc3d39e61' is not valid
status code: 400, request id: abedd3c2-d905-4af4-9a32-c1e30a9e4e1d
关联资源:aws_lb_target_group_attachment.ilab_tg_attach,位于resilience.tf第48行
反常现象:配置实际运行时目标组挂载功能正常,已成功添加2台后端EC2主机。
报错由两个配置问题共同触发:
aws_lb_target_group_attachment资源的target_id参数传值错误:该参数要求传入待挂载目标(EC2实例、弹性网卡等)的合法标识,当前配置传入的是目标组自身的ID,对应值就是报错信息里显示的目标组ARN,AWS API校验时自然会判定该「实例ID」无效,返回400错误。- 存在重复的目标组挂载逻辑:ASG配置中已经设置了target_group_arns参数,该参数会让ASG自动把组内所有扩缩容产生的EC2实例注册到关联目标组,这也是出现「功能正常、已经成功挂载2台EC2」现象的原因——这部分挂载是ASG自动完成的,和手动定义的
aws_lb_target_group_attachment资源没有关系。
当前配置相当于ASG已经完成了合法的自动挂载,同时Terraform还在尝试执行定义错误的手动挂载逻辑,执行到这一步就会抛出报错,但不影响ASG侧已经完成的挂载结果,所以会出现「报错但功能正常」的反常现象。
直接删除整个aws_lb_target_group_attachment "ilab_tg_attach"资源块即可,ASG中已有的target_group_arns配置完全可以满足自动挂载EC2实例到目标组的需求,不需要额外定义手动挂载资源。
修正后的核心配置参考如下,同时移除了旧版本Terraform遗留的冗余插值语法:
resource "aws_autoscaling_group" "ilab_asg" { name = "ilab_asg" vpc_zone_identifier = [aws_subnet.ilab_subnet_pub_a.id, aws_subnet.ilab_subnet_pub_b.id] launch_configuration = aws_launch_configuration.ilab_lt.name min_size = 2 max_size = 2 health_check_grace_period = 300 health_check_type = "ELB" force_delete = true target_group_arns = [aws_lb_target_group.ilab_alb.arn] tag { key = "Name" value = "EC2 Instance" propagate_at_launch = true } }
补充说明:如果后续需要手动将非ASG管理的资源挂载到目标组,定义
aws_lb_target_group_attachment时必须给target_id传入待挂载资源的正确标识,例如挂载EC2实例时传入对应实例的ID,不能传入目标组自身的属性值。
内容的提问来源于stack exchange,提问作者Ken

