如何限制Elastic Beanstalk公网访问,仅允许通过API Gateway访问?
限制Elastic Beanstalk Flask服务器仅允许API Gateway访问的简单步骤
我来分享几个简单易行的步骤,帮你把Flask服务器的公网访问锁起来,只让API Gateway能访问——我自己部署服务时经常这么做,操作起来没什么复杂的:
方法一:通过安全组做基础网络防护
先从网络层面把大部分无关公网请求挡在外头:
- 定位Elastic Beanstalk的安全组
- 登录AWS控制台,进入Elastic Beanstalk服务,打开你的Flask应用所在环境
- 左侧导航栏点击「Configuration」,在「Instances」配置块里找到安全组ID,点击跳转到EC2的安全组详情页
- 修改入站规则
- 删除原来允许
0.0.0.0/0(所有公网IP)访问HTTP/HTTPS的规则 - 添加新的入站规则:
- 类型选「HTTP」或「HTTPS」(对应你应用的端口)
- 来源选择「Custom」,输入API Gateway在你当前区域的IP前缀。你可以从AWS官方IP地址范围文档里筛选出
execute-api服务的IP段(比如us-east-1区域的前缀可能是52.46.0.0/15,记得替换成你自己的区域)
小提示:调试期间可以暂时保留允许自己IP访问的规则,等API Gateway配置验证通过后再删掉
- 删除原来允许
方法二:Flask代码层加强验证(补全安全闭环)
安全组的IP限制可能会因为AWS更新IP段出现遗漏,所以在代码里加一层专属请求头验证更稳妥:
- 添加全局请求验证逻辑
打开你的Flask主文件,新增一个before_request钩子,检查请求是否携带API Gateway专属的X-Amzn-Trace-Id头(所有来自API Gateway的请求都会自动带上这个头):from flask import Flask, abort, request app = Flask(__name__) @app.before_request def restrict_access(): # 仅接受来自API Gateway的请求 if 'X-Amzn-Trace-Id' not in request.headers: abort(403, description="Access denied: Only API Gateway can access this service") # 你的其他路由和业务逻辑... if __name__ == '__main__': app.run() - 部署更新后的代码
把修改后的代码打包,通过Elastic Beanstalk控制台或者EB CLI重新部署即可
方法三:VPC链接实现完全隔离(进阶方案)
如果想彻底让Elastic Beanstalk脱离公网(无公网IP),可以用这个方案:
- 将Elastic Beanstalk环境配置到VPC的私有子网中(不分配公网IP)
- 在API Gateway中创建VPC链接,关联到Elastic Beanstalk所在VPC的私有子网和安全组
- 这样API Gateway就能通过VPC链接访问你的Flask应用,公网完全无法直接触达
前两种方法组合起来是最快捷的实现方式,既能快速生效,又能保证足够的安全性。
内容的提问来源于stack exchange,提问作者Hammad Ali Khan
相关产品推荐
相关产品推荐

