使用Terraform部署AWS资源时EC2与ELB不在同一VPC报错求助
问题根因
你遇到的报错核心是传统ELB(CLB)的配置冲突导致ELB网络归属异常,具体原因如下:
- 对于VPC内部署的CLB,
subnets和availability_zones两个参数互斥,仅需配置subnets即可,CLB会自动从关联的子网获取可用区信息。你同时配置了两个参数,会导致CLB被错误创建到经典网络(若账号仍支持经典网络)或异常VPC上下文,最终出现实例与ELB不在同一VPC的错误。 - 若你之前曾部署过旧版本的资源,残留的ELB配置也可能导致本次更新时出现VPC不匹配的问题。
解决方案
1. 修正ELB配置
删除aws_elb.elbweb资源中的availability_zones配置项,修正后的配置如下:
resource "aws_elb" "elbweb" { name = "elb-${var.project}-${var.environment}" # 负载均衡器名称 cross_zone_load_balancing = true # 启用跨可用区负载均衡 subnets = ["${aws_subnet.pub1.id}","${aws_subnet.pub2.id}"] security_groups = ["${aws_security_group.elb-sg.id}"] listener { instance_port = 80 instance_protocol = "http" lb_port = 80 lb_protocol = "http" } instances = "${aws_instance.webservers.*.id}" }
2. 清理旧资源后重新部署
执行以下命令销毁已有错误资源,再重新创建:
terraform destroy --auto-approve terraform apply --auto-approve
3. 可选优化建议(避免后续出现其他问题)
- 修改VPC配置,开启DNS支持:AWS负载均衡域名解析、实例服务访问等能力都依赖VPC的DNS配置,建议将
enable_dns_hostnames和enable_dns_support都设置为true。 - 分散EC2实例到多个可用区:当前3台EC2全部部署在
pri1子网,不符合高可用要求,可通过取模逻辑分配子网:subnet_id = count.index % 2 == 0 ? aws_subnet.pri1.id : aws_subnet.pri2.id - 私有子网关闭公网IP自动分配:私有子网内的实例无需对外暴露公网IP,建议将
pri1、pri2的map_public_ip_on_launch设置为false。
内容的提问来源于stack exchange,提问作者Jose A. Matarán
相关产品推荐
相关产品推荐

