通过 Lambda + API Gateway + 外部 API 实现。
一、题目核心目标
通过 Lambda + API Gateway + 外部 API 实现。
二、常见排错思路(结合实战常见错法)
我们按照服务维度拆解排错点,中等难度题不会设置很偏门的错误,基本遵循以下规律👇
1. Lambda 函数无响应 / 报错
错误提示:
"errorMessage": "NetworkError: getaddrinfo ENOTFOUND api.openweathermap.org"
排查思路:
可能原因 | 排查建议 |
---|---|
没有公网访问权限 | Lambda 是否部署在 VPC?是否配置了 NAT 网关 |
请求超时 | Lambda 默认 timeout 太短 |
没有打包依赖 | 如 requests 模块未打包进 zip 文件 |
API key 缺失 | 环境变量是否配置 API 密钥 |
2. API Gateway 调用失败(403、500)
排查方法:
问题类型 | 解决方式 |
---|---|
返回 403 | API Gateway 没权限调用 Lambda ➜ 检查 InvokeFunction 权限 |
返回 500 | Lambda 本身异常 ➜ 查看 CloudWatch Logs 里 Lambda 输出 |
返回空对象 {} | Lambda 的返回结构格式不符合 API Gateway 的 Integration Mapping |
3. IAM 权限错误(调用失败、403 Forbidden)
常见错误场景:
-
Lambda 要调用外部服务(如 S3、DynamoDB),但没权限
-
API Gateway 没权限调用 Lambda
解决方案:
-
给 Lambda 加上 IAM Role(执行角色),绑定以下策略:
-
AWSLambdaBasicExecutionRole
-
AmazonAPIGatewayInvokeFullAccess
(如涉及 API 网关)
-
-
如果访问 DynamoDB,需添加:
-
dynamodb:GetItem
-
4. 返回结果格式不对
Lambda 正确返回结构应为:
{"statusCode": 200,"body": "{\"location\": \"Singapore\", \"time\": \"2024-06-21T10:00Z\", \"weather\": \"Sunny\"}","headers": {"Content-Type": "application/json"}
}
排查点:
-
body 要是 字符串化的 JSON(需要
json.dumps()
) -
headers 要正确设置,否则浏览器前端可能解析失败
5. 外部 API 报错
如你调用 https://api.openweathermap.org/data/2.5/weather?...
,以下情况也常见:
报错 | 原因 |
---|---|
401 Unauthorized | API key 错了或没传 |
429 Too Many Requests | 免费额度用完 |
ENOTFOUND | DNS 无法解析,可能是 Lambda 没联网 |
三、推荐排查顺序(实战经验总结)
1️⃣ 先看 CloudWatch 中 Lambda 日志是否执行到位?
2️⃣ 请求外部 API 成功了吗?有没有返回值?
3️⃣ Lambda 有没有正确返回格式?statusCode、body?
4️⃣ API Gateway 有没有权限调用 Lambda?
5️⃣ 请求入口(curl/postman)有没有正确命中 API 网关?
四、实用命令和验证工具
工具 | 用法 |
---|---|
CloudWatch Logs | 查看 Lambda 执行情况 |
Postman / curl | 模拟 API 调用 |
aws lambda invoke | 测试函数是否执行成功 |
API Gateway console ➜ Test | 验证是否连通 |
IAM Policy Simulator | 验证权限是否放通 |
总结一句话口诀
智能代理出错 = 网络 + 权限 + 返回格式 + 外部 API 四大类问题