无公网IP的Elastic Beanstalk实例部署失败问题排查
问题描述
我无法让配置了公网ELB但使用私有EC2实例的Elastic Beanstalk应用正常运行。
我通过eb init创建了基础EB配置,内容如下:
branch-defaults: default: environment: test3 group_suffix: null global: application_name: test branch: null default_ec2_keyname: null default_platform: Node.js default_region: us-east-1 include_git_submodules: true instance_profile: null platform_name: null platform_version: null profile: null repository: null sc: null workspace_type: Application
我使用默认VPC,但配置了2个自定义公网子网(避免与其他账户及外部数据库的CIDR peering冲突)。
我尝试通过以下PowerShell命令部署EB应用:
# powershell eb create --profile dev ` --sample ` --vpc.id vpc-123abc --vpc.ec2subnets "subnet-123,subnet-456" ` --vpc.elbsubnets "subnet-123,subnet-456" ` -sr arn:aws:iam::<account>:role/service-role/aws-elasticbeanstalk-service-role ` --vpc.elbpublic ` test8
部署失败,初始实例始终无法通过健康检查,EB环境创建约15分钟后判定失败,应用无法从互联网访问。
但添加--vpc.publicip选项后部署成功,可通过EB环境地址正常访问网页。按道理不需要为每个实例配置公网IP,我对比了两种配置的安全组、ELB设置等,未发现差异,请问为何这些实例需要公网IP才能通过健康检查并连接ELB?
问题原因及解决方案
核心原因是你的EC2实例缺乏出站互联网访问能力,导致Elastic Beanstalk的健康检查流程无法完成,同时实例无法获取运行所需资源。
具体来说:
- Elastic Beanstalk实例需要从AWS软件源拉取平台更新、应用依赖(比如Node.js包),没有互联网访问的话这些操作会直接失败,实例无法正常启动应用。
- EB的健康检查不仅包含ELB的端口探测,还需要EB Agent向EB服务端上报实例状态,如果实例连不上EB的服务端点,EB会判定实例不健康。
- 你使用的是公网子网(路由表指向互联网网关),但如果子网未开启“自动分配公网IP”,实例就没有公网IP,无法主动出站访问互联网——公网子网的默认行为是自动分配公网IP,若你修改了子网配置关闭该选项,实例就只能通过NAT网关实现出站访问。
添加--vpc.publicip后实例正常工作,正是因为实例获得了公网IP,具备了出站访问互联网的能力,满足了EB实例运行的必要条件。
要在不分配公网IP的情况下解决问题,需完成以下配置:
- 在VPC中创建NAT网关(或NAT实例),并确保EC2实例所在子网的路由表配置了默认路由(0.0.0.0/0 指向NAT网关)。建议使用私有子网(无直接互联网网关路由的子网),而非当前的公网子网。
- 确认EB实例的安全组允许出站流量到互联网(或至少允许访问AWS服务端点的流量)。
- 检查子网配置,关闭“自动分配公网IP”选项,确保实例依赖NAT网关实现出站访问。
内容的提问来源于stack exchange,提问作者Ben Zuill-Smith
相关产品推荐
相关产品推荐

