![](/img/trans.png)
[英]why does this AWS Lambda code in Java return "internal server error" when invoked via an API gateway?
[英]message: "Internal server error" when try to access aws gateway api
使用 Node.js 創建了 Lambda Hello world function 並為 Get 調用創建了 API GateWay 觸發器,嘗試通過 URL 訪問 Lambda function,出現以下錯誤
消息:“內部服務器錯誤”。
(對 AWS 非常陌生)
執行 Lambda 函數后需要傳遞statusCode
。 如果您不通過它,API 網關默認會觸發錯誤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'}
});
要從 api 網關通過 lambda 函數訪問 dynamodb,它需要:
在 AWS 控制台中創建一個有權訪問 dynamodb 操作的角色。
創建一個 lambda 函數並將上面創建的角色分配給您的 lambda 函數。
在 AWS 管理控制台中從 API 網關創建一個 api 並允許它訪問您的 lambda 函數。
為了讓您的 api 顯示正確的響應,lambda 函數的返回類型應該是特定格式,即:
return {
"statusCode": 200,
"body": json.dumps(your response)
}
我在使用 API Gateway + Lambda 時遇到了這個問題。 在我的情況下,問題只是一個許可問題。 我在我的 API 中使用了階段。
我必須執行
aws lambda add-permission --function-name X --source-arn "X" --principal apigateway.amazonaws.com --statement-id X --action lambda:InvokeFunction
希望這可以幫助。
上面已經解釋過了,但我的問題是這對我來說只需要調用 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;
};
我遇到了這個問題,但就我而言,我使用的是 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;
這有效
callback(null, {
statusCode: 200,
body: JSON.stringify(message),
headers: {'Content-Type': 'application/json'}
});
這對我很有效
此錯誤表示 API 的配置存在問題。 如果您啟用 CloudWatch Logs,您可以看到更多信息: https ://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-cloudwatch-logs/
確保在響應中將正文作為字符串傳遞。 如果它是一個對象,它將失敗並給你你看到的錯誤。 有關更多信息,請參見此處 - http://www.awslessons.com/2017/lambda-api-gateway-internal-server-error/
在我的情況下,標頭的拼寫是錯誤的,它是“標頭”而不是“標頭”,因此請確保您擁有正確的 JSON 響應正文。
就我而言,問題是我從 Lambda 創建了 API Gateway。 在這種情況下,沒有在 REST API 的 API Gateway 端創建任何方法。
通過轉到 API Gateway、手動創建方法 (GET)、附加 Lambda 函數和 (!) 部署更改來修復。
在此鏈接開始工作后。
有時 CloudWatch 不會為此錯誤記錄任何內容。 要在 Lambdas 頁面上查看錯誤詳細信息 go,請單擊“測試”選項卡,然后使用測試事件執行您的 function。 您應該看到 CloudWatch 沒有顯示的內容。
當返回 JSON 主體時,添加isBase65Encoded = False
解決了它,這實際上是在 API 網關上使用代理集成時發生的,
所以這應該有效:
import json
return {
“statusCode”: 200,
“headers”:{‘Content-Type’: ‘application/json’},
“body”: json.dumps(json_body),
“isBase64Encoded”: False
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.