簡體   English   中英

使用 Lambda 代理集成通過 API Gateway 從 AWS Lambda 拋出錯誤

[英]Throw errors from AWS Lambda through API Gateway with Lambda Proxy Integration

我有一個基本的 AWS Lambda 函數(Java 8),可以返回成功消息或錯誤。 我希望它拋出一個錯誤,以便實際的 Lambda 函數失敗。 但是,我不知道如何將這個錯誤對象從 lambda 函數通過 API 網關“傳遞”到客戶端。 我一直在嘗試更改網關響應,但到目前為止沒有運氣。

因為我需要啟用 Lambda 代理集成,所以我沒有成功。 我已經閱讀了有關錯誤處理指南,很多人都喜歡它,但它們似乎都關閉了 Lambda 代理集成。

我的代碼:

package com.amazonaws.lambda.demo;

import java.util.HashMap;
import java.util.Map;

import org.json.JSONObject;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;

public class LambdaFunctionHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

      @Override
      public APIGatewayProxyResponseEvent handleRequest( APIGatewayProxyRequestEvent input, Context context ) {
          APIGatewayProxyResponseEvent response = getSuccessResponse();

          // Fake some error happening that causes a runtime exception
          Map<String, Object> errorObj = getErrorObjectMap(context);
          JSONObject json = new JSONObject(errorObj);
          throw new RuntimeException(json.toString());
          //return response;

      }

      private APIGatewayProxyResponseEvent getSuccessResponse() {

            Map<String, String> headers = new HashMap<>();
            headers.put("Content-type", "text/plain");

            APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent()
                    .withStatusCode(200)
                    .withHeaders(headers)
                    .withBody("Success!")
                    .withIsBase64Encoded(Boolean.FALSE);



            return response;
      }

      private Map<String, Object> getErrorObjectMap(Context context){
            Map<String, Object> errorPayload = new HashMap<>();
            errorPayload.put("errorType", "BadRequest");
            errorPayload.put("httpStatus", 400);
            errorPayload.put("requestId", context.getAwsRequestId());
            errorPayload.put("message", "An unknown error has occurred. Please try again.");

            return errorPayload;
      }
}

我嘗試將默認 4XX 網關響應以及所有其他網關響應更改為自定義消息。 但是,它不起作用。 我仍然只收到{"message": "Internal server error"}消息。

因為請求是代理的,所以我無法在集成響應中添加模板。 因此,我不確定如何處理這些錯誤。 現在,我只返回一個正常的響應對象。 這有效,但 Lambda 函數不知道它失敗了。

Map<String, String> headers = new HashMap<>();
headers.put("Content-type", "text/plain");

APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent()
                    .withStatusCode(400)
                    .withHeaders(headers)
                    .withBody("Error!")
                    .withIsBase64Encoded(Boolean.FALSE);

如何在 lambda 函數中拋出錯誤並在 API 網關中處理它以便將自定義消息發送到客戶端?

使用Lambda 代理集成時,返回錯誤響應的工作方式不同。 您不會拋出異常,而是返回一個包含異常信息的 Map。

如果您啟用了代理集成並拋出異常,您的 Lambda 函數將被假定為意外失敗(因此您收到錯誤 500)。

試試這個代碼:

package org.example.basicapp;

import java.util.HashMap;
import java.util.Map;

public class LambdaFunctionHandler {

    public static Map<String, Object> handleRequest(final Map<String, Object> request) {

        final Map<String, Object> requestContext = (Map) request.get("requestContext");

        final Map<String, Object> responseHeaders = new HashMap<>();
        responseHeaders.put("x-OriginalAwsRequestId", requestContext.get("requestId"));

        final Map<String, Object> responseMap = new HashMap<>();
        responseMap.put("statusCode", 400);
        responseMap.put("headers", responseHeaders);
        responseMap.put("body", "An unknown error has occurred. Please try again.");
        return responseMap;
    }
}

在 API Gateway 中測試時將顯示這一點:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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