消息:尝试访问 aws gateway api 时出现“内部服务器错误”

Posted

技术标签:

【中文标题】消息:尝试访问 aws gateway api 时出现“内部服务器错误”【英文标题】:message: "Internal server error" when try to access aws gateway api 【发布时间】:2018-05-20 05:18:51 【问题描述】:

使用 Node.js 创建 Lambda Hello world 函数并为 Get 调用创建 API GateWay 触发器,尝试使用 URL 访问 Lambda 函数,出现以下错误。

消息:“内部服务器错误”。

(对 AWS 非常陌生)

【问题讨论】:

提供更多细节。并查看aws.amazon.com/blogs/ai/… 了解如何正确制作 api 网关并连接到 lambda 的详细信息 检查 CloudWatch 以查看错误。 【参考方案1】:

您需要在执行 Lambda 函数后传递statusCode。如果不通过,API Gateway 默认会触发错误502 Bad Gateway

message = 
   'message': 'Execution started successfully!'

return 
    'statusCode': 200,
    'headers': 'Content-Type': 'application/json',
    'body': json.dumps(message)

编辑:此示例适用于 Python。对于node.js,你只需要处理回调,消息基本相同。

callback(null, 
    statusCode: 200,
    body: JSON.stringify(message),
    headers: 'Content-Type': 'application/json'
);

【讨论】:

检查 cmets - github.com/aws-samples/aws-serverless-workshops/blob/master/… 回调必须有格式 我忘了说这是给 Python 的。基本上,对于 node.js 也是一样的,你只需要处理回调。 我在这里遇到了同样的问题,但从节点的角度来看。在将其传递给 APIGW 之前,我需要 JSON.stringify(message) 正文。 老兄,你拯救了我的一天! 感谢您,我错误地将属性设置为status。希望这对其他人有帮助。【参考方案2】:

不要忘记单击 AWS API Gateway 下的部署 API。没有它,改变就行不通。

【讨论】:

完美运行。不知道为什么他们没有将其包含在任何文档中。 由于我的方法执行测试正在运行,令人沮丧的是,这是亚马逊的答案,可能会让您需要部署的情况更加明显 传奇!!解决了我的问题【参考方案3】:

为了通过 lambda 函数从 api 网关访问 dynamodb,它需要:

    在 AWS 控制台中创建一个有权访问 dynamodb 操作的角色。

    创建一个 lambda 函数并将上面创建的角色分配给您的 lambda 函数。

    在 AWS 管理控制台中从 API 网关创建一个 api,并允许它访问您的 lambda 函数。

    为了让您的 api 显示正确的响应,lambda 函数的返回类型应为特定格式,即:

return 
  "statusCode": 200,
  "body": json.dumps(your response)

【讨论】:

这个解决了我所有的问题,非常感谢:D【参考方案4】:

我在使用 API Gateway + Lambda 时遇到了这个问题。就我而言,问题只是权限问题。我在我的 API 中使用阶段。

我必须执行

aws lambda add-permission --function-name X --source-arn "X" --principal apigateway.amazonaws.com --statement-id X --action lambda:InvokeFunction

希望这会有所帮助。

【讨论】:

X 应该是什么?【参考方案5】:

上面已经解释过了,但我的问题是这对我来说只需要调用 lambda:

exports.handler = async (event) => 
    return "gugus"
;

所以 lambda 中的所有测试都很好。日志看起来也很好。只是 API 响应不好。

要使用 API 网关调用它,它需要这样的东西:

exports.handler = async (event) => 
...
    var res =
        "statusCode": 200,
        "headers": 
            "Content-Type": "*/*"
        
    ;
    res.body = "gugus";
    return res;
;

【讨论】:

我遇到了完全相同的问题:我确信我的 lambda 没问题,因为我可以毫无错误地运行它。碰巧的是,lambda 可以在几乎没有限制的情况下运行,但 API Gateway 期望返回的对象具有特定的形状。据我所知,它需要以下最小接口(我使用 TypeScript 来描述它):statusCode: number, body: string\ ...顺便说一句,我还没有找到声明这些约束的地方,所以如果有人知道并可以分享它会很棒! 不容易发现,但是docs.aws.amazon.com/apigateway/latest/developerguide/…【参考方案6】:

我遇到了这个问题,但就我而言,我使用的是 API Gateway 和 java lambda 函数。在 cloudwatch 中查看时没有错误,一切看起来都很好。当 API Gateway 尝试呈现响应时,就会出现问题。 就我而言,我的响应对象中有一个不是 int 的 statusCode,而 API 网关需要它是一个 int。

这个

    private final ResponseCode statusCode;
    private final String body;
    private final Map<String, String> headers;
    private final boolean isBase64Encoded;

在我将 statusCode 更改为 int 之后

    private final int statusCode;

这行得通

【讨论】:

【参考方案7】:

确保在响应中将正文作为字符串传递。如果它是一个对象,它将失败并给你你看到的错误。请参阅此处了解更多信息 - http://www.awslessons.com/2017/lambda-api-gateway-internal-server-error/

【讨论】:

【参考方案8】:

此错误表示 API 的配置存在问题。如果您启用 CloudWatch Logs,您可以看到更多信息:https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-cloudwatch-logs/

【讨论】:

【参考方案9】:

在我的情况下,标题的拼写错误,它是 'header' 代替 'headers' 所以请确保您拥有正确的 JSON 响应正文。

【讨论】:

【参考方案10】:
callback(null, 
    statusCode: 200,
    body: JSON.stringify(message),
    headers: 'Content-Type': 'application/json'
);

这对我很有效

【讨论】:

【参考方案11】:

就我而言,问题是我从 Lambda 创建了 API Gateway。在这种情况下,没有在 REST API 的 API Gateway 端创建任何方法。

通过转到 API Gateway、手动创建方法 (GET)、附加 Lambda 函数和 (!) 部署更改来修复。

此链接开始工作后。

【讨论】:

以上是关于消息:尝试访问 aws gateway api 时出现“内部服务器错误”的主要内容,如果未能解决你的问题,请参考以下文章