Pin*_*ave 2 amazon-web-services aws-lambda
我在 AWS 中创建了一个简单的 lambda 函数,它从 DynamoDB 返回列表。我还创建了 API 网关来触发 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}"`);
}
};
Run Code Online (Sandbox Code Playgroud)
下面是生成的 API 网关端点详细信息。
API endpoint: https://iabzqisam7.execute-api.us-east-1.amazonaws.com/test/moneyAppDynamoDBOperationsLambda
Authorization: NONE
Method: ANY
Resource path: /moneyAppDynamoDBOperationsLambda
Stage: test
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用 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"
}
}
Run Code Online (Sandbox Code Playgroud)
它在 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": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
信托政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Run Code Online (Sandbox Code Playgroud)
在 API Gateway 控制台中 --> 转到设置 -> 添加 API Gateway-CloudWatch 日志记录角色的 ARN--> '保存'
进入 API 阶段。在“CloudWatch 设置”下,选择“启用 CloudWatch 日志”。将“日志级别”设置为“信息”。选择“记录完整的请求/响应数据”。
请检查日志并共享有问题的错误日志。
用于代理集成的 Lambda 函数的输出格式
如果函数输出的格式不同或格式错误,API Gateway 将返回 502 Bad Gateway 错误响应。
| 归档时间: |
|
| 查看次数: |
6088 次 |
| 最近记录: |