Lambda返回200,即使引发异常

时间:2019-04-11 15:57:16

标签: java amazon-web-services exception java-8 aws-lambda

我在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 个答案:

答案 0 :(得分:1)

200与实际的lambda结果或lambda本身的实际调用无关。如果您基本上得到除200以外的任何其他值,则表示无法接受lambda调用,这意味着您的lambda根本不会被调用。

来自AWS

  

API响应中的状态代码不反映函数错误。错误代码是为阻止您的函数执行的错误而保留的,例如权限错误,限制错误或函数的代码和配置问题。例如,如果执行该函数会导致您超出帐户级别(ConcurrentInvocationLimitExceeded)或函数级别(ReservedFunctionConcurrentInvocationLimitExceeded)的并发限制,则Lambda返回TooManyRequestsException。