ECS Fargate经ALB访问返回503 直连任务公网IP正常问题排查
问题描述
- 可通过公网IP直接正常访问所有Fargate任务上部署的服务,但无法通过这些任务关联的ALB访问对应服务
- 已在ALB上配置ssl.crt、ssl.key及SSL链证书,暂未收到证书相关报错,初步判断HTTPS相关配置是问题核心:
- 自建Docker容器暴露443端口后,通过localhost、容器自身IPv4地址直接访问时,服务运行完全正常
- Fargate侧容器配置为443端口提供HTTPS服务,ALB监听443端口并配置规则转发至关联目标组,判断问题大概率出在这段转发链路的配置环节
已完成的前期排查
对照过往ECS部署的常见问题逐一核验:
- 排查容器实际暴露端口与任务定义配置端口的匹配性,无端口不一致问题
- 核验任务定义资源配额:当前配置1GB内存、0.5vCPU,配额可支撑应用正常运行
- 核验任务启动超时配置:当前设置为5分钟
- 排查任务定义启动命令:当前容器无自定义启动命令,排除启动命令不适配问题
配套配置说明
以下为各模块配置记录(截图内容):
- 集群配置
- 服务配置
- 任务配置:含任务列表、任务详情、任务运行日志三类信息
- 网络配置:
- 负载均衡器基础配置
- 目标组基础配置
- 目标注册状态记录
观测到的运行日志
服务事件日志
- 服务已达到稳态
- 服务已达到稳态
certified-service服务(部署ID:ecs-svc/9491895578110017561)部署完成
ALB访问日志
h2 2021-02-07T11:44:27.671119Z app/ecr-certfied-lb/(IP)(IP).(IP):36746 - -1 -1 -1 503 - 464 635 "GET https://ecr-certfied-lb-1015030790.ap-southeast-2.elb.amazonaws.com:443/ HTTP/2.0" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:ap-southeast-2:821107282698:targetgroup/target-group-certified/(IP)"Root=1-601fd29b-66af109d70aa7fa13abd6207" "ecr-certfied-lb-(IP).ap-southeast-2.elb.amazonaws.com" "arn:aws:acm:ap-southeast-2:(IP):certificate/2977e65a-416e-4c33-b39d-(IP)" 0 2021-02-07T11:44:27.670000Z "forward" "-" "-" "-" "-" "-" "-" h2 2021-02-07T11:44:28.304793Z app/ecr-certfied-lb/(IP)(IP).112:36746 - -1 -1 -1 503 - 146 634 "GET https://ecr-certfied-lb-1015030790.ap-southeast-2.elb.amazonaws.com:443/favicon.ico HTTP/2.0" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:ap-southeast-2:(IP):targetgroup/target-group-certified/(IP)"Root=1-601fd29c-(IP)" "ecr-certfied-lb-(IP).ap-southeast-2.elb.amazonaws.com" "arn:aws:acm:ap-southeast-2:(IP):certificate/(IP)-416e-4c33-b39d-(IP)" 0 2021-02-07T11:44:28.304000Z "forward" "-" "-" "-" "-" "-" "-" "-"
根因定位与解决方案
核心根因
从ALB返回503状态码、转发链路无有效目标响应、直连容器服务正常的表现,可以直接锁定问题:
ALB到后端目标组的转发协议配置与容器提供的服务协议不匹配
当前后端Fargate容器运行的是开启TLS加密的443端口HTTPS服务,但ALB关联的目标组默认使用明文HTTP协议发起请求。ALB向开启TLS加密的端口发送明文HTTP报文时,会直接收到TLS握手阶段的二进制错误响应,无法完成正常HTTP交互,最终触发503服务不可用报错。
这个配置错配完全解释了“直连容器公网IP正常、走ALB不通”的现象——直连时使用HTTPS协议与容器服务匹配,连通性正常;但ALB转发时使用了不匹配的明文协议,自然无法建立连接。
分步修复流程
- 进入目标组配置页,打开健康检查设置模块
- 将健康检查协议从默认HTTP调整为HTTPS
- 将健康检查端口匹配为容器暴露的443端口
- 按需配置健康检查路径(可设置为服务默认根路径
/)
- 回到ALB监听器配置页,打开443端口监听器的转发规则设置
- 将转发到目标组的协议从HTTP调整为HTTPS
- 保存配置后等待目标组健康检查状态从
unhealthy切换为healthy - 重新通过ALB域名访问服务,即可正常加载
补充注意事项
- 调整协议后如果仍出现健康检查失败,需要核验Fargate任务关联的安全组入站规则:必须放通ALB侧网段/安全组对443端口的访问权限,不能仅配置公网0.0.0.0/0的入站规则
- ALB默认不会校验后端目标返回的证书有效性,即使后端容器使用自签名证书,只要转发协议匹配为HTTPS,就可以正常建立链路,无需额外将后端证书导入ALB做信任配置
内容的提问来源于stack exchange,提问作者Ventti
相关产品推荐
相关产品推荐

