Terraform部署ECS Flask容器 本地HTTP远端监听HTTPS问题
问题描述
- 基于Terraform编写极简部署配置,通过ECS启动基础Flask应用,测试阶段计划全链路使用HTTP协议通信。
- 部署逻辑参考公开的tf-ecs-fargate-tmpl模板实现,容器使用自行构建、上传至ECR的自有镜像。
- 故障表现:ECS上运行的容器默认监听HTTPS协议,不符合预期;完全相同的镜像在本地环境运行时,正常监听HTTP协议。
运行日志对比
ECS远端运行日志
2022-06-09 23:55:50,897 * Running on all addresses (0.0.0.0) 2022-06-09 23:55:50,897 * Running on all addresses (0.0.0.0) 2022-06-09T19:55:50.897-04:00 WARNING: This is a development server. Do not use it in a production deployment. 2022-06-09T19:55:50.897-04:00 * Running on https://127.0.0.1:5000 2022-06-09T19:55:50.897-04:00 * Running on https://10.0.9.254:5000 (Press CTRL+C to quit)
本地运行日志
* Debug mode: on 2022-06-10 00:00:01,086 * Running on all addresses (0.0.0.0) WARNING: This is a development server. Do not use it in a production deployment. * Running on http://127.0.0.1:5000 * Running on http://172.17.0.2:5000 (Press CTRL+C to quit)
排查方向与解决建议
- 优先核对Flask启动相关环境变量:Flask内置开发服务器只要检测到
FLASK_RUN_CERT、FLASK_RUN_KEY两个环境变量存在且值非空,就会自动切换到HTTPS模式。先检查ECS任务定义中的环境变量配置,确认是否误注入了这两个变量,或是引用的Terraform模板默认给任务追加了SSL相关配置。 - 对比容器启动参数差异:检查ECS任务定义中配置的
entryPoint和command字段,看是否在启动flask run时显式传入了--cert、--key参数,和本地启动flask服务的命令做逐字段比对。 - 检查镜像内置环境变量:如果Dockerfile中通过
ENV指令预置了上述SSL相关的Flask环境变量,本地运行时如果手动覆盖了对应变量就会走HTTP,ECS运行时未做覆盖就会默认启用HTTPS。可以给ECS任务临时加启动命令env | grep FLASK,打印容器内所有Flask相关环境变量逐一核对。 - 不要混淆负载均衡和容器自身的监听协议:排查时注意区分ALB的监听协议和容器内部协议,如果ALB目标组的健康检查/转发协议误配为HTTPS去访问容器5000端口会导致连接失败,但从当前日志看容器自身已经明确打印HTTPS监听地址,优先排查容器内部启动配置即可。
- 快速验证方案:在ECS任务定义中显式添加环境变量
FLASK_RUN_CERT=""、FLASK_RUN_KEY="",强制清空可能存在的证书配置,重启任务后观察日志是否切回HTTP监听。
内容的提问来源于stack exchange,提问作者Daniel Wyleczuk-Stern
相关产品推荐
相关产品推荐

