托管于S3存储桶的静态网站调用AWS Lambda的VPC通信方式咨询
AWS VPC环境下S3静态站点访问EC2后端服务的实现方案
首先明确前提:Lambda是AWS托管的无服务器计算服务,无需部署在EC2实例上,推测你的场景为:S3托管的静态前端站点,需要调用部署在VPC内EC2实例上的后端服务,由后端服务调用Lambda执行CRUD操作,本地调试时后端服务监听在localhost:8080端口,具体实现步骤如下:
1. 基础网络配置
- 确认EC2实例所在安全组的入站规则,开放后端服务监听的8080端口,测试阶段可授权你的本地公网IP为来源,生产环境建议仅授权AWS内部服务网段或负载均衡的安全组。
- 若采用公网访问方案,确认EC2所在子网关联的路由表已绑定Internet网关,具备公网访问能力。
2. 公网暴露后端接口(主流方案)
S3静态站点的请求是从用户本地浏览器发起,无法直接访问VPC内网IP,推荐两种成熟对接方式:
方案A:应用负载均衡(ALB)对接
- 在EC2所在VPC下创建公网ALB,分配公网IP,监听80/443端口,绑定ACM颁发的SSL证书开启HTTPS访问。
- 配置ALB目标组,目标类型选择EC2实例,将部署后端服务的EC2加入目标组,健康检查端口配置为8080。
- 将前端代码中的接口请求地址从
localhost:8080/parcelUpdate替换为ALB的公网域名+路径,例:https://alb-xxx.us-east-1.elb.amazonaws.com/parcelUpdate。
方案B:API Gateway对接
- 创建HTTP/REST API,为
/parcelUpdate等CRUD路径配置VPC集成,对接目标为上述ALB或者直接关联EC2实例的私有地址。 - 部署API Gateway后获取公网调用域名,替换前端代码中的接口地址即可。
- 该方案额外支持请求限流、身份校验、日志审计等能力,适合有管控需求的生产环境。
3. 跨域配置
由于S3站点域名和后端接口域名不一致,需要在EC2的后端服务中配置CORS规则,允许S3站点域名作为请求源,避免浏览器跨域拦截。
Node.js Express服务配置示例:
const cors = require('cors'); app.use(cors({ origin: 'https://<你的S3静态站点域名>', methods: ['GET', 'POST', 'PUT', 'DELETE'], allowedHeaders: ['Content-Type'] }));
4. 私有访问方案(非必要不选用)
如果你不希望后端接口暴露在公网,可配置用户端通过VPN或AWS Direct Connect接入VPC,直接通过EC2的私有IP+8080端口发起请求,无需配置公网负载均衡。
补充优化建议
如果你的后端服务仅用于转发请求调用Lambda,可移除EC2层,直接通过API Gateway集成Lambda执行CRUD操作,无需自行维护服务器,降低运维成本和故障率。
内容的提问来源于stack exchange,提问作者DanielDevlin
相关产品推荐
相关产品推荐

