我在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>
答案 0 :(得分:1)
200与实际的lambda结果或lambda本身的实际调用无关。如果您基本上得到除200以外的任何其他值,则表示无法接受lambda调用,这意味着您的lambda根本不会被调用。
来自AWS:
API响应中的状态代码不反映函数错误。错误代码是为阻止您的函数执行的错误而保留的,例如权限错误,限制错误或函数的代码和配置问题。例如,如果执行该函数会导致您超出帐户级别(ConcurrentInvocationLimitExceeded)或函数级别(ReservedFunctionConcurrentInvocationLimitExceeded)的并发限制,则Lambda返回TooManyRequestsException。