Terraform配置Elastic Beanstalk额外ALB监听器遇端口NaN报错
问题
我正尝试为Elastic Beanstalk环境的ALB(应用负载均衡器)配置额外监听器,按照AWS相关文档添加了配置设置及属性,但执行terraform apply时持续报错:InvalidParameterValue: Invalid Listener Port (NaN): listener_port。
我的配置代码如下:
additional_alb_listener_settings_https = [{ description = "HTTPS Listener for ALB" protocol = "HTTPS" ssl_certificate_arn = "xxxxxxxxx" ssl_policy = "xxxxxxxxx" }] variable "additional_alb_listener_settings" { description = "additional listener settings in addition to default port 80" type = list(object({ description = string protocol = string ssl_certificate_arn = string ssl_policy = string })) default = [] } dynamic "setting" { for_each = var.additional_alb_listener_settings content { namespace = "aws:elbv2:listener:listener_port" name = "Protocol" value = setting.value.protocol } } dynamic "setting" { for_each = var.additional_alb_listener_settings content { namespace = "aws:elbv2:listener:listener_port" name = "SSLCertificateArns" value = setting.value.ssl_certificate_arn } } dynamic "setting" { for_each = var.additional_alb_listener_settings content { namespace = "aws:elbv2:listener:listener_port" name = "SSLPolicy" value = setting.value.ssl_policy } }
但根据AWS文档中关于aws:elbv2:listener:listener_port的说明,并未要求port属性,我遗漏了什么?
解决方案
问题核心在于命名空间的格式和变量定义的缺失:
aws:elbv2:listener:listener_port里的listener_port是占位符,必须替换为实际要配置的监听器端口号(比如HTTPS常用的443)。你直接使用占位符字符串,导致Terraform无法识别有效端口,因此报错端口为NaN(非数字)。- 你的变量定义里缺少
port字段,Elastic Beanstalk需要明确知道你要创建哪个端口的监听器,否则无法完成配置。
具体修复步骤:
- 修改变量定义,新增
port字段:
variable "additional_alb_listener_settings" { description = "additional listener settings in addition to default port 80" type = list(object({ port = number description = string protocol = string ssl_certificate_arn = string ssl_policy = string })) default = [] }
- 更新输入变量值,添加目标端口(示例为443):
additional_alb_listener_settings_https = [{ port = 443 description = "HTTPS Listener for ALB" protocol = "HTTPS" ssl_certificate_arn = "xxxxxxxxx" ssl_policy = "xxxxxxxxx" }]
- 修改动态
setting块的命名空间,用实际端口替换占位符:
dynamic "setting" { for_each = var.additional_alb_listener_settings content { namespace = "aws:elbv2:listener:${setting.value.port}" name = "Protocol" value = setting.value.protocol } } dynamic "setting" { for_each = var.additional_alb_listener_settings content { namespace = "aws:elbv2:listener:${setting.value.port}" name = "SSLCertificateArns" value = setting.value.ssl_certificate_arn } } dynamic "setting" { for_each = var.additional_alb_listener_settings content { namespace = "aws:elbv2:listener:${setting.value.port}" name = "SSLPolicy" value = setting.value.ssl_policy } }
完成以上修改后,Terraform就能正确识别要创建的监听器端口,端口NaN的报错会消失。
内容的提问来源于stack exchange,提问作者tanfei12345
相关产品推荐
相关产品推荐

