【问题标题】:AWS API Gateway always returns 502 bad gatewayAWS API Gateway 总是返回 502 bad gateway
【发布时间】:2019-08-24 03:52:02
【问题描述】:

我在 AWS 中创建了一个简单的 lambda 函数,它从 DynamoDB 返回列表。我还创建了 API Gateway 来触发 lambda 函数。当我在 AWS 控制台中测试时,该功能工作正常。但是当我在 Postman 中测试这个功能时,我总是得到 502 bad gateway 下面的错误。 ({ “消息”:“内部服务器错误” }

下面是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 错误吗?

【问题讨论】:

  • 您的 API 网关设置有问题。此代码无助于解决此问题。
  • 能否添加相关的 lambda 角色和策略

标签: amazon-web-services aws-lambda


【解决方案1】:

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 日志”。将“日志级别”设置为“信息”。选择“记录完整的请求/响应数据”。

请检查日志并分享有问题的错误日志。

如果函数输出格式不同或格式错误,API Gateway 会返回 502 Bad Gateway 错误响应。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2019-09-15
    • 2020-06-14
    • 2021-02-24
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多