消息:尝试访问 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 时出现“内部服务器错误”的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Cognito 用户 ID 限制访问 AWS API Gateway 端点

Telegram Bot(用 python 编码)与 AWS API Gateway 集成

HTTP 请求正文未通过 AWS API Gateway 访问 AWS lambda 函数

调用 AWS API Gateway Private 无法从 Front 访问,但 EC2 有效

AWS API Gateway 的访问权限

通过 API Gateway 保护对 AWS Lambda 的访问