通过API Gateway调用Lambda返回403错误的问题求助
问题排查与解决方案
核心现象总结
- 本地运行Python脚本:调用公开API返回200
- Lambda控制台测试:调用目标API返回200
- API Gateway触发Lambda时:Lambda调用目标API返回403
- 目标API无认证要求,API Gateway与Lambda的权限链路正常
可能原因及解决方法
1. 出口IP被目标API的反爬/IP限制拦截
Lambda在不同触发场景下的出口IP存在差异:
- Lambda控制台测试:使用AWS Lambda服务的公网IP池,属于AWS官方可信IP段
- API Gateway触发Lambda:请求出口会经过API Gateway边缘节点,部分公开API会将这类IP识别为非可信来源,触发拦截
- 解决方式:
- 给Lambda配置静态公网IP(通过VPC+NAT网关实现),将该IP加入目标API的白名单(若支持)
- 在Lambda的请求头中添加合法
User-Agent,模拟浏览器请求,规避反爬机制headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Accept": "application/json" }
2. API Gateway传递的额外请求头触发目标API拦截
API Gateway会向Lambda传递X-Forwarded-For、X-API-Key等默认请求头,部分公开API对未知头部敏感:
- 解决方式:在Lambda代码中清理请求头,仅保留目标API需要的必要字段,避免传递无关头部
3. CDK集成配置导致请求行为异常
CDK默认的API Gateway-Lambda集成可能传递额外参数,改变Lambda的请求逻辑:
- 解决方式:确保集成使用全代理模式,避免不必要的参数映射
from aws_cdk import aws_apigateway as apigw, aws_lambda as _lambda lambda_fn = _lambda.Function(...) api = apigw.RestApi(...) api.root.add_method("GET", apigw.LambdaIntegration(lambda_fn, proxy=True))
4. Lambda网络权限配置问题(VPC场景)
若Lambda部署在VPC内:
- 确认执行角色拥有
ec2:DescribeNetworkInterfaces权限 - 检查VPC安全组和NACLs是否允许出站访问目标API的443端口
调试建议
在Lambda代码中添加日志,对比两种触发方式的请求差异:
import requests import json def lambda_handler(event, context): print(f"触发来源IP: {context.identity.source_ip if hasattr(context, 'identity') else 'Lambda控制台'}") print(f"API Gateway传递的事件: {json.dumps(event)}") headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"} response = requests.get("目标API地址", headers=headers) print(f"目标API响应状态: {response.status_code}") print(f"目标API响应头部: {dict(response.headers)}") return {"statusCode": response.status_code, "body": response.text}
查看CloudWatch日志,重点对比出口IP、请求头的差异,定位拦截原因
内容的提问来源于stack exchange,提问作者Connor Willoughby
相关产品推荐
相关产品推荐

