AWS跨账号Lambda调用API Gateway返回403 Forbidden求助
排查建议
1. 核查Lambda的VPC网络配置
- 若Lambda部署在VPC内,优先确认网络出口配置:
- 若使用NAT网关:检查Lambda所在子网的路由表是否包含指向NAT网关的互联网路由条目,同时确认NAT网关处于正常运行状态。
- 若使用API Gateway VPC端点:
- 确保VPC端点已关联Lambda所在的子网和安全组。
- 检查API Gateway的资源策略,是否添加了允许该VPC端点访问的规则。
- 检查Lambda所属安全组的出站规则:确认是否允许HTTPS(443端口)访问目标API的IP段,或是否放开了全量出站流量。
2. 检查API Gateway的资源策略
- 账号B的API Gateway可能配置了资源策略,限制了调用来源:
- 进入API Gateway控制台查看「资源策略」,确认是否存在拒绝账号A Lambda所在IP/VPC的规则。
- 若API Gateway为私有类型,需确保账号A Lambda的VPC可通过VPC端点访问,且资源策略允许该VPC的CIDR或VPC端点ID。
- 注:Postman能正常调用说明公网IP未被限制,问题大概率出在Lambda的VPC来源被拦截。
3. 对比请求参数与头部
- 对比Lambda发送的请求与Postman请求的头部、参数差异:
- 在Lambda代码中用
console.log打印完整请求信息(包括headers、body),和Postman的请求做逐一比对,重点检查Host、User-Agent等可能影响验证的字段。
- 在Lambda代码中用
4. 测试Lambda到API Gateway的连通性
- 在Lambda中添加TCP连接测试代码,验证网络层面能否正常连通:
const net = require('net'); const testAPIConnection = () => { return new Promise((resolve, reject) => { const socket = net.createConnection(443, '*******.execute-api.ap-south-1.amazonaws.com'); socket.on('connect', () => { resolve('TCP连接成功'); socket.end(); }); socket.on('error', (err) => { reject(`连接失败:${err.message}`); }); }); }; - 查看CloudWatch日志,确认连接结果,判断是否存在网络层面的阻断。
5. 查看API Gateway访问日志
- 在账号B的API Gateway中开启访问日志功能,查看Lambda调用时的详细日志:
- 日志会记录请求来源IP、身份验证结果、拒绝原因等关键信息,可直接定位是资源策略、WAF还是其他规则导致的Forbidden。
6. 排查WAF拦截规则(若API Gateway关联WAF)
- 若账号B的API Gateway绑定了WAF,检查WAF规则:
- 查看WAF日志,确认是否存在针对Lambda所在VPC IP的拦截记录。
- 临时禁用WAF进行测试,验证是否为WAF规则导致的阻断。
内容的提问来源于stack exchange,提问作者HMT
相关产品推荐
相关产品推荐

