AWS EC2上Flask应用无法通过Postman访问问题求助
AWS EC2 Flask应用无法外部访问的排查与解决
一、先修复代码中的语法错误
你的代码存在两处致命错误,会导致服务无法正常处理请求甚至启动失败:
- 缺失request导入:Flask的
request对象未导入,需修改导入语句:
from flask import Flask, request
- return语句语法错误:末尾多了一个右括号,修正后:
return json.dumps(sutime.parse(input_str), sort_keys=True, indent=4)
修正后的完整代码:
import json from sutime import SUTime from flask import Flask, request app = Flask(__name__) @app.route("/test/", methods=["POST"]) def time_word_reg(): # 检测时间相关词汇(如今天、明天)并返回分析结果 raw = request.get_data() data = json.loads(raw) input_str = data['key_str'] sutime = SUTime(mark_time_range=True) return json.dumps(sutime.parse(input_str), sort_keys=True, indent=4) if __name__ == "__main__": app.run(host='0.0.0.0', port=5000)
二、EC2实例内部验证服务可用性
修复代码后,先在实例内部确认服务是否正常:
启动应用后,执行以下curl命令测试:
curl -X POST http://127.0.0.1:5000/test/ -H "Content-Type: application/json" -d '{"key_str": "tomorrow"}'
如果能返回JSON格式的时间分析结果,说明服务本身无问题;若报错,查看终端输出的错误日志定位问题。
三、网络层面排查
- 确认端口监听状态:在实例上执行命令,检查Flask是否正确监听0.0.0.0:5000:
netstat -tulpn | grep 5000
若结果仅显示127.0.0.1:5000,说明服务未对外开放,需确认app.run(host='0.0.0.0')代码是否生效。
2. 检查实例本地防火墙:部分EC2实例默认开启iptables规则,可能拦截端口。执行iptables -L查看规则,若存在拦截5000端口的配置,添加放行规则:
sudo iptables -A INPUT -p tcp --dport 5000 -j ACCEPT
- 验证安全组与网络ACL:
- 安全组规则需确认TCP端口的来源为
0.0.0.0/0(允许所有外部IP访问); - 检查VPC网络ACL,确保入站、出站规则均允许TCP 5000端口流量(网络ACL为无状态,双向规则都需配置)。
- 安全组规则需确认TCP端口的来源为
四、判断旧答案是否适用的方法
要确定7年前的答案能否解决当前问题,可从三点判断:
- 技术栈匹配度:若旧答案针对Flask+AWS EC2组合,核心的服务监听、网络配置逻辑未发生变化,大概率适用;
- 问题现象一致性:对比旧问题的报错(连接超时/拒绝)、环境(EC2安全组、端口监听)是否与你的情况完全匹配;
- 核心逻辑验证:提取旧答案中的通用排查步骤(如绑定0.0.0.0、检查安全组、端口监听)逐一验证,无需照搬全部操作。
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

