API Gateway集成Lambda返回{"message":"Not Found"}求解决及功能优化
API Gateway集成Lambda问题排查+代码优化方案
一、先解决"Not Found"错误
这个报错大概率是API Gateway配置的问题,按以下步骤排查:
- 核对资源路径:你配置的API资源(比如
/sum)和实际调用的URL路径必须完全一致,别写错路径 - 检查方法绑定:POST/GET方法有没有正确关联到你的Lambda函数,集成请求里的Lambda函数要选对;同时要确保API Gateway有调用Lambda的权限——得给API Gateway添加
AWSLambdaRole权限 - 确认API是否部署:API Gateway创建后必须部署到某个阶段(比如prod)才能对外访问,没部署直接调用肯定返回Not Found
- 检查Lambda权限:Lambda的执行角色得有对应的权限,比如用SES发邮件的话,要给角色加SES发送权限
二、优化Lambda代码:浏览器显示结果+保留发邮件功能
根据你提供的代码截图,我给你调整成同时支持GET/POST、浏览器直接显示结果还能保留发邮件功能的版本(以Python为例,是Lambda最常用的开发语言):
import json import boto3 def lambda_handler(event, context): # 处理GET和POST请求的参数获取 if event['httpMethod'] == 'GET': # GET请求从URL参数中提取num1和num2 params = event.get('queryStringParameters', {}) num1 = float(params.get('num1', 0)) num2 = float(params.get('num2', 0)) elif event['httpMethod'] == 'POST': # POST请求从JSON Body中提取参数 try: body = json.loads(event['body']) if event['body'] else {} except: return { 'statusCode': 400, 'headers': {'Content-Type': 'text/html'}, 'body': '<h1>POST请求格式错误,请传入合法JSON数据</h1>' } num1 = float(body.get('num1', 0)) num2 = float(body.get('num2', 0)) else: return { 'statusCode': 400, 'headers': {'Content-Type': 'text/html'}, 'body': '<h1>仅支持GET和POST请求</h1>' } # 计算两数之和 sum_result = num1 + num2 # 发送邮件(基于AWS SES,需提前配置验证邮箱和权限) ses = boto3.client('ses', region_name='你的AWS区域,比如us-east-1') email_status = '邮件发送成功' try: ses.send_email( Source='你的发件邮箱@example.com', Destination={'ToAddresses': ['收件邮箱@example.com']}, Message={ 'Subject': {'Data': f'两数求和结果通知'}, 'Body': {'Text': {'Data': f'数字{num1}和{num2}的和为:{sum_result}'}} } ) except Exception as e: email_status = f'邮件发送失败:{str(e)}' # 返回HTML格式响应,浏览器打开可直接查看结果 html_content = f''' <html> <body style="font-family: Arial, sans-serif; margin: 20px;"> <h2>两数求和结果</h2> <p>输入数字1:{num1}</p> <p>输入数字2:{num2}</p> <p style="font-size: 18px; color: #2ecc71;">求和结果:<strong>{sum_result}</strong></p> <p>邮件状态:{email_status}</p> </body> </html> ''' return { 'statusCode': 200, 'headers': {'Content-Type': 'text/html'}, 'body': html_content }
代码说明
- 兼容GET/POST请求:GET请求直接在URL后拼接
?num1=5&num2=3即可测试,POST请求可通过Postman等工具传递JSON格式参数 - 浏览器友好:返回HTML格式响应,打开API链接就能看到排版清晰的结果,无需解析JSON
- 错误处理:对非法请求格式、不支持的请求方法返回明确的错误提示
- 保留邮件功能:基于AWS SES实现,需替换成你自己的邮箱和AWS区域,同时给Lambda执行角色添加SES发送权限
三、验证步骤
- 重新部署API Gateway到你的目标阶段(比如prod)
- 浏览器测试GET请求:直接访问
https://你的API ID.execute-api.你的区域.amazonaws.com/prod/你的资源路径?num1=5&num2=3,查看页面显示结果和邮件发送状态 - 工具测试POST请求:用Postman发送POST请求到上述URL,Body选择JSON格式并传入参数,验证结果
- 排查日志:如果仍有问题,前往CloudWatch查看Lambda和API Gateway的日志,里面会显示具体错误信息
内容的提问来源于stack exchange,提问作者zolo
相关产品推荐
相关产品推荐

