Search in sources :

Example 1 with InvalidRequestContentException

use of com.amazonaws.services.lambda.model.InvalidRequestContentException in project nifi by apache.

the class PutLambda method onTrigger.

@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) {
    FlowFile flowFile = session.get();
    if (flowFile == null) {
        return;
    }
    final String functionName = context.getProperty(AWS_LAMBDA_FUNCTION_NAME).getValue();
    final String qualifier = context.getProperty(AWS_LAMBDA_FUNCTION_QUALIFIER).getValue();
    // Max size of message is 6 MB
    if (flowFile.getSize() > MAX_REQUEST_SIZE) {
        getLogger().error("Max size for request body is 6mb but was {} for flow file {} for function {}", new Object[] { flowFile.getSize(), flowFile, functionName });
        session.transfer(flowFile, REL_FAILURE);
        return;
    }
    final AWSLambdaClient client = getClient();
    try {
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        session.exportTo(flowFile, baos);
        InvokeRequest invokeRequest = new InvokeRequest().withFunctionName(functionName).withLogType(LogType.Tail).withInvocationType(InvocationType.RequestResponse).withPayload(ByteBuffer.wrap(baos.toByteArray())).withQualifier(qualifier);
        long startTime = System.nanoTime();
        InvokeResult result = client.invoke(invokeRequest);
        flowFile = session.putAttribute(flowFile, AWS_LAMBDA_RESULT_STATUS_CODE, result.getStatusCode().toString());
        if (!StringUtils.isBlank(result.getLogResult())) {
            flowFile = session.putAttribute(flowFile, AWS_LAMBDA_RESULT_LOG, new String(Base64.decode(result.getLogResult()), Charset.defaultCharset()));
        }
        if (result.getPayload() != null) {
            flowFile = session.putAttribute(flowFile, AWS_LAMBDA_RESULT_PAYLOAD, new String(result.getPayload().array(), Charset.defaultCharset()));
        }
        if (!StringUtils.isBlank(result.getFunctionError())) {
            flowFile = session.putAttribute(flowFile, AWS_LAMBDA_RESULT_FUNCTION_ERROR, result.getFunctionError());
            session.transfer(flowFile, REL_FAILURE);
        } else {
            session.transfer(flowFile, REL_SUCCESS);
            final long totalTimeMillis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);
            session.getProvenanceReporter().send(flowFile, functionName, totalTimeMillis);
        }
    } catch (final InvalidRequestContentException | InvalidParameterValueException | RequestTooLargeException | ResourceNotFoundException | UnsupportedMediaTypeException unrecoverableException) {
        getLogger().error("Failed to invoke lambda {} with unrecoverable exception {} for flow file {}", new Object[] { functionName, unrecoverableException, flowFile });
        flowFile = populateExceptionAttributes(session, flowFile, unrecoverableException);
        session.transfer(flowFile, REL_FAILURE);
    } catch (final TooManyRequestsException retryableServiceException) {
        getLogger().error("Failed to invoke lambda {} with exception {} for flow file {}, therefore penalizing flowfile", new Object[] { functionName, retryableServiceException, flowFile });
        flowFile = populateExceptionAttributes(session, flowFile, retryableServiceException);
        flowFile = session.penalize(flowFile);
        session.transfer(flowFile, REL_FAILURE);
        context.yield();
    } catch (final AmazonServiceException unrecoverableServiceException) {
        getLogger().error("Failed to invoke lambda {} with exception {} for flow file {} sending to fail", new Object[] { functionName, unrecoverableServiceException, flowFile });
        flowFile = populateExceptionAttributes(session, flowFile, unrecoverableServiceException);
        session.transfer(flowFile, REL_FAILURE);
        context.yield();
    } catch (final Exception exception) {
        getLogger().error("Failed to invoke lambda {} with exception {} for flow file {}", new Object[] { functionName, exception, flowFile });
        session.transfer(flowFile, REL_FAILURE);
        context.yield();
    }
}
Also used : FlowFile(org.apache.nifi.flowfile.FlowFile) ByteArrayOutputStream(java.io.ByteArrayOutputStream) InvokeResult(com.amazonaws.services.lambda.model.InvokeResult) InvalidParameterValueException(com.amazonaws.services.lambda.model.InvalidParameterValueException) ResourceNotFoundException(com.amazonaws.services.lambda.model.ResourceNotFoundException) AmazonServiceException(com.amazonaws.AmazonServiceException) RequestTooLargeException(com.amazonaws.services.lambda.model.RequestTooLargeException) InvalidRequestContentException(com.amazonaws.services.lambda.model.InvalidRequestContentException) UnsupportedMediaTypeException(com.amazonaws.services.lambda.model.UnsupportedMediaTypeException) TooManyRequestsException(com.amazonaws.services.lambda.model.TooManyRequestsException) RequestTooLargeException(com.amazonaws.services.lambda.model.RequestTooLargeException) TooManyRequestsException(com.amazonaws.services.lambda.model.TooManyRequestsException) UnsupportedMediaTypeException(com.amazonaws.services.lambda.model.UnsupportedMediaTypeException) InvalidParameterValueException(com.amazonaws.services.lambda.model.InvalidParameterValueException) AmazonServiceException(com.amazonaws.AmazonServiceException) AWSLambdaClient(com.amazonaws.services.lambda.AWSLambdaClient) InvalidRequestContentException(com.amazonaws.services.lambda.model.InvalidRequestContentException) InvokeRequest(com.amazonaws.services.lambda.model.InvokeRequest) ResourceNotFoundException(com.amazonaws.services.lambda.model.ResourceNotFoundException)

Aggregations

AmazonServiceException (com.amazonaws.AmazonServiceException)1 AWSLambdaClient (com.amazonaws.services.lambda.AWSLambdaClient)1 InvalidParameterValueException (com.amazonaws.services.lambda.model.InvalidParameterValueException)1 InvalidRequestContentException (com.amazonaws.services.lambda.model.InvalidRequestContentException)1 InvokeRequest (com.amazonaws.services.lambda.model.InvokeRequest)1 InvokeResult (com.amazonaws.services.lambda.model.InvokeResult)1 RequestTooLargeException (com.amazonaws.services.lambda.model.RequestTooLargeException)1 ResourceNotFoundException (com.amazonaws.services.lambda.model.ResourceNotFoundException)1 TooManyRequestsException (com.amazonaws.services.lambda.model.TooManyRequestsException)1 UnsupportedMediaTypeException (com.amazonaws.services.lambda.model.UnsupportedMediaTypeException)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 FlowFile (org.apache.nifi.flowfile.FlowFile)1