簡體   English   中英

消息:嘗試訪問 AWS 網關 api 時出現“內部服務器錯誤”

[英]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'}
});

不要忘記單擊 AWS API Gateway 下的 Deploy API。 沒有它,改變是行不通的。

在此處輸入圖片說明

要從 api 網關通過 lambda 函數訪問 dynamodb,它需要:

  1. 在 AWS 控制台中創建一個有權訪問 dynamodb 操作的角色。

  2. 創建一個 lambda 函數並將上面創建的角色分配給您的 lambda 函數。

  3. 在 AWS 管理控制台中從 API 網關創建一個 api 並允許它訪問您的 lambda 函數。

  4. 為了讓您的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM