如何将搭载私有负载均衡器的Elastic Beanstalk与CloudFront集成?
将私有负载均衡器的Elastic Beanstalk Flask应用集成CloudFront
前提条件
- Elastic Beanstalk应用已部署在私有VPC内,负载均衡器为私有类型(仅VPC内部可访问)
- 已具备CloudFull操作权限,若使用自定义域名,需提前准备好对应域名的SSL证书(需部署在us-east-1区域)
步骤1:配置VPC与安全组
- 调整私有负载均衡器的安全组规则,允许CloudFront的IP段访问:
- 通过AWS CLI执行
aws cloudfront list-cloud-front-ips获取CloudFront官方IP范围 - 在负载均衡器安全组中添加入站规则:允许HTTP/HTTPS流量来自上述IP段
- 通过AWS CLI执行
- 确保Elastic Beanstalk的EC2实例安全组已允许来自私有负载均衡器的流量(通常默认已配置)
步骤2:创建CloudFront分发
- 登录AWS控制台进入CloudFront服务,点击「创建分发」
- 源设置配置:
- 源域名:选择私有负载均衡器的DNS名称(可在Elastic Beanstalk控制台「配置」>「负载均衡器」中找到)
- 源访问控制:创建并启用Origin Access Control (OAC),确保仅CloudFront能访问私有源
- 协议:优先选择「HTTPS only」,若负载均衡器仅支持HTTP则选「HTTP only」
- 默认缓存行为设置:
- 查看器协议政策:选择「Redirect HTTP to HTTPS」(强制HTTPS访问)
- 允许的HTTP方法:勾选
GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE(适配Flask应用的动态请求) - 缓存策略:动态Flask应用选「CachingDisabled」避免缓存动态内容;有静态资源可自定义缓存规则
- 原点请求策略:选择「AllViewer」,传递所有请求头到源站,确保Flask能获取用户真实IP等信息
- 常规设置:
- 备用域名(CNAME):添加自定义域名(若使用)
- SSL证书:选择提前准备的证书(自定义域名场景),否则用CloudFront默认证书
- 点击「创建分发」,等待10-15分钟完成部署
步骤3:调整Elastic Beanstalk应用配置
- 修改Flask应用代码,支持CloudFront传递的请求头:
from flask import Flask, request app = Flask(__name__) @app.before_request def before_request(): # 获取用户真实IP if 'X-Forwarded-For' in request.headers: request.remote_addr = request.headers['X-Forwarded-For'].split(',')[0].strip() # 处理HTTPS协议转换 if request.headers.get('X-Forwarded-Proto') == 'https': request.url = request.url.replace('http://', 'https://') - 若使用Elastic Beanstalk的Python平台,在
.ebextensions目录创建01-nginx.config文件,修改Nginx配置传递请求头:
完成后重新部署应用到Elastic Beanstalkfiles: "/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf": mode: "000644" owner: root group: root content: | proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
步骤4:验证集成效果
- 访问CloudFront默认域名(如
d1234567890abc.cloudfront.net),确认Flask应用可正常访问 - 若使用自定义域名,将域名解析到CloudFront分发域名(CNAME记录),DNS生效后测试访问
- 测试应用动态功能(如表单提交、用户登录),确保请求正常传递到后端
- 开启CloudFront访问日志,检查请求是否成功转发到私有负载均衡器
内容的提问来源于stack exchange,提问作者Sumanth Shetty
相关产品推荐
相关产品推荐

