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