Terraform引用未声明资源报错:同模块内如何正确引用ALB?
Terraform模块内ALB与监听器关联报错的解决方法
我正在创建ALB和监听器,尝试在同一模块中关联load_balancer_arn,执行terraform plan -var-file="env.tfvars"时出现资源未声明错误,相关代码及报错如下:
模块代码:modules/alb/alb.tf
resource "aws_lb" "alb" { name = var.customer_env internal = false load_balancer_type = "application" security_groups = var.security_group_alb # subnets = aws_subnet.private.*.id subnets = var.public_subnets enable_deletion_protection = false tags = { Name = var.customer_env Environment = var.env } } resource "aws_alb_listener" "alb_listener" { for_each = var.listeners load_balancer_arn = aws_alb.alb.arn port = each.value["listener_port"] protocol = each.value["listener_protocol"] }
主配置:main.tf
module "alb" { source = "./modules/alb" vpc_id = module.network.vpc_id security_group_alb = module.security.security_group_alb public_subnets = module.network.public_subnets customer_env = local.customer_env env = var.env listeners = var.public_alb_config.listeners listener_port = 80 listener_protocol = "HTTP" target_groups = local.public_alb_target_groups }
报错信息
╷ │ Error: Reference to undeclared resource │ │ on modules/alb/alb.tf line 45, in resource "aws_alb_listener" "alb_listener" : │ 45: load_balancer_arn = aws_alb.alb.arn │ │ A managed resource "aws_alb" "alb" has not been declared in module.alb. ╵
解决步骤
1. 修正资源引用名称
报错核心原因是资源类型不匹配:你声明的ALB资源是aws_lb(Terraform AWS Provider v3.0.0+的标准资源名),但监听器中错误引用了旧资源名aws_alb。
将监听器中的load_balancer_arn值修改为与声明的资源一致:
resource "aws_alb_listener" "alb_listener" { for_each = var.listeners load_balancer_arn = aws_lb.alb.arn # 修正此处 port = each.value["listener_port"] protocol = each.value["listener_protocol"] }
2. 补充监听器必填配置
你的aws_alb_listener代码缺少必填的default_action块,需要补充(示例如下,替换为你的目标组配置):
default_action { type = "forward" target_group_arn = aws_lb_target_group.your_target_group.arn }
3. 清理冗余变量
main.tf中传递的listener_port和listener_protocol变量在模块内未被使用(监听器依赖var.listeners中的字段),可删除这两个冗余参数,避免配置混淆。
内容的提问来源于stack exchange,提问作者Vamsi
相关产品推荐
相关产品推荐

