You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无公网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的情况下解决问题,需完成以下配置:

  1. 在VPC中创建NAT网关(或NAT实例),并确保EC2实例所在子网的路由表配置了默认路由(0.0.0.0/0 指向NAT网关)。建议使用私有子网(无直接互联网网关路由的子网),而非当前的公网子网。
  2. 确认EB实例的安全组允许出站流量到互联网(或至少允许访问AWS服务端点的流量)。
  3. 检查子网配置,关闭“自动分配公网IP”选项,确保实例依赖NAT网关实现出站访问。

内容的提问来源于stack exchange,提问作者Ben Zuill-Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:17:43