amazon-web-services - AWS API Gateway 总是返回 502 bad gateway
问题描述
我在 AWS 中创建了一个简单的 lambda 函数,它从 DynamoDB 返回列表。我还创建了 API Gateway 来触发 lambda 函数。当我在 AWS 控制台中测试时,该功能工作正常。但是当我在 Postman 中测试这个功能时,我总是得到 502 bad gateway 下面的错误。({ "message": "内部服务器错误" }
下面是 node.js 中的函数:
const doc = require('dynamodb-doc');
const dynamo = new doc.DynamoDB();
/**
* Provide an event that contains the following keys:
*
* - operation: one of the operations in the switch statement below
* - tableName: required for operations that interact with DynamoDB
* - payload: a parameter to pass to the operation being performed
*/
exports.handler = async (event) => {
const operation = event.operation;
const payload = event.payload;
if (event.tableName) {
payload.TableName = event.tableName;
}
switch (operation) {
case 'create':
return await dynamo.putItem(payload).promise();
case 'read':
return await dynamo.getItem(payload).promise();
case 'update':
return await dynamo.updateItem(payload).promise();
case 'delete':
return await dynamo.deleteItem(payload).promise();
case 'list':
return await dynamo.scan(payload).promise();
case 'echo':
return payload;
case 'ping':
return 'pong';
default:
throw new Error(`Unrecognized operation "${operation}"`);
}
};
下面是生成的 API Gateway Endpoint 详细信息。
API endpoint: https://iabzqisam7.execute-api.us-east-1.amazonaws.com/test/moneyAppDynamoDBOperationsLambda
Authorization: NONE
Method: ANY
Resource path: /moneyAppDynamoDBOperationsLambda
Stage: test
这是我尝试使用 Postman 测试 API 的方式:
Postman URL(Get) : https://iabzqisam7.execute-api.us-east-1.amazonaws.com/test/moneyAppDynamoDBOperationsLambda
Headers: Key: content-type, Value: application/json
Body (raw) :
{
"operation": "list",
"tableName": "Advertiser",
"payload": {
"TableName": "Advertiser"
}
}
它在 AWS 控制台中运行良好。
知道为什么我在从 Postman 调用 API Gateway 时不断收到 502 bad gateway 错误吗?
解决方案
502 Bad Gateway Exception,通常是因为从 Lambda 代理集成后端返回的输出不兼容,偶尔也会因为负载过重而导致无序调用。
API getway 输出不会告诉您问题与 Lambda 错误或 API getway 或策略问题有关。
API 网关返回 502,这意味着它不理解 Lambda 返回的输出并给您 {“message”: “Internal server error”} 502。
在 API getway 上使用启用日志记录进行调试
创建新的 IAM 角色以允许 API Gateway 将日志推送到 CloudWatch。附上以下政策附件:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"logs:PutLogEvents",
"logs:GetLogEvents",
"logs:FilterLogEvents"
],
"Resource": "*"
}
]
}
信任政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
在 API Gateway 控制台->转到设置->添加 API Gateway-CloudWatch 日志记录角色的 ARN-->“保存”
转到您的 API 阶段。在“CloudWatch 设置”下,选择“启用 CloudWatch 日志”。将“日志级别”设置为“信息”。选择“记录完整请求/响应数据”。
请检查日志并共享有问题的错误日志。
-
用于代理集成的 Lambda 函数的输出格式
如果函数输出格式不同或格式错误,API Gateway 将返回 502 Bad Gateway 错误响应。
推荐阅读
- batch-file - 由于空格和引号破坏了它,因此无法从另一个批处理文件中操作已解析的字符串
- javascript - 本地 laravel API 上的 Nativescript-Vue axios 调用错误 [请求失败,状态码为空]
- icloud - iCloud 记录仅在直接搜索时可见
- vb.net - 将程序界面转换为另一种语言界面VB.NET
- javascript - 将对象的对象转换为数组(特殊示例)
- javascript - 在没有闭包或对象方法的情况下调用原型函数?
- http - 使用空白用户代理发出 HTTP 请求
- android - Andriod Studio ListView 不会自行更新
- python-3.x - 使用套接字发送多个图像
- c# - C#如何将字符串与文件中的特定行进行比较?