有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

即使引发异常,java Lambda仍返回200

我在AWS Lambda中部署了以下代码:

public class MyTrigger implements RequestHandler<Request, Void> {

    private final Service service = new Service();

    @Override
    public Void handleRequest(Request request, Context context) {
        service.process(request);
        return null;
    }
}

.process()方法正在抛出一个IllegalStateException

此lambda通过以下代码“手动”触发:

public class LambdaUtils {

    private static final Logger log = LoggerFactory.getLogger(LambdaUtils.class);

    public static Integer invoke(String functionName, String payload) {
        log.info("Invoking lambda {} with payload {}", functionName, payload);
        final AWSLambdaAsync lambdaClient = AWSLambdaAsyncClientBuilder.standard().withRegion(Regions.EU_WEST_1).build();
        final InvokeRequest request = new InvokeRequest();
        request.withFunctionName(functionName).withPayload(payload);
        final InvokeResult invokeResult = lambdaClient.invoke(request);
        final Integer statusCode = invokeResult.getStatusCode();
        log.info("Invoked lambda. Got status code {} and payload {}", statusCode, StandardCharsets.UTF_8.decode(invokeResult.getPayload()).toString());
        return statusCode;
    }
}

问题是,即使在lambda内部引发异常,状态代码仍然是200: Invoked lambda. Got status code 200 and payload [... stacktrace ...]

我使用以下依赖项创建客户端并执行调用:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-lambda</artifactId>
    <version>1.11.297</version>
</dependency>

共 (1) 个答案

  1. # 1 楼答案

    200与实际的lambda结果或lambda本身的实际调用无关。如果您得到的基本上不是200,这意味着lambda调用不能被接受,这意味着您的lambda根本不会被调用

    AWS

    The status code in the API response doesn't reflect function errors. Error codes are reserved for errors that prevent your function from executing, such as permissions errors, limit errors, or issues with your function's code and configuration. For example, Lambda returns TooManyRequestsException if executing the function would cause you to exceed a concurrency limit at either the account level (ConcurrentInvocationLimitExceeded) or function level (ReservedFunctionConcurrentInvocationLimitExceeded).