Adam
Adam

Reputation: 615

Add trigger to AWS Lambda Function using Java SDK for s3

How can I add new trigger for existing AWS Lambda function using Java SDK?

I would like to add S3 trigger.

I have program which converts an image from one format to another. I have two buckets in first, when I add source image in second I want to get result.

Any examples will be appreciated.

Thanks.

Trigger like this:

enter image description here

I try to do it, but it dosn't work:

    final AWSLambda client = AWSLambdaClientBuilder.standard()
                                                   .withCredentials(credentials)
                                                   .build();

  client.listFunctions().getFunctions()
        .stream()
        .filter(f -> f.getFunctionName().equals(FUNCTION_NAME))
        .findFirst()
        .ifPresent(lambda -> {
          final AddPermissionRequest addPermissionRequest = new AddPermissionRequest();
          addPermissionRequest.setStatementId("s3triggerId");
          addPermissionRequest.withSourceArn("arn:aws:s3:::" + INPUT_BUCKET_NAME);
          addPermissionRequest.setAction("lambda:InvokeFunction");
          addPermissionRequest.setPrincipal("events.amazonaws.com");
          addPermissionRequest.setFunctionName(lambda.getFunctionName());

          AddPermissionResult addPermissionResult = client.addPermission(addPermissionRequest);
          System.out.println("Trigger was added to lambda " + addPermissionResult.getStatement());
        });

Upvotes: 1

Views: 1540

Answers (2)

am233dmg
am233dmg

Reputation: 174

For aws java sdk v2:

You can add trigger by adding notification configuration such:

  • PutBucketNotificationConfiguration

You can see your current configuration via:

  • GetBucketNotificationConfiguration

And check other from: https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html

  1. Init S3Client with region and credentials provider( in my case,Region.US_WEST_2 and ProfileCredentialsProvider respectively).
  2. Choose method( type of action's configuration ) from s3client for your action(in my case putBucketNotificationConfiguration).
  3. Build request for your notification configuration with bucketName and notification configuration.
  4. Build notification configuration: (types: topicConfiguration(SNS),queueConfiguration(SQS), lambdaFunctionConfiguration(Lambda)) in my case lambdaFunctionConfiguration.
  5. Build lambdaFunctionConfiguration with arn and events that will triger your lambda function(in my case, "arn:aws:lambda:us-west-2:12345678912:function:your-lambda" and Event.S3_OBJECT_CREATED_PUT; I assign one event, but your can add more).

Also read: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

For this example:

S3lient s3Client = S3Client.builder()
                .region(Region.US_WEST_2)
                .credentialsProvider(ProfileCredentialsProvider.create())
                .build();

s3Client.putBucketNotificationConfiguration(PutBucketNotificationConfigurationRequest.builder()
                .bucket(BUCKET_NAME)
                .notificationConfiguration(NotificationConfiguration.builder()
                        .lambdaFunctionConfigurations(LambdaFunctionConfiguration.builder()
                                .lambdaFunctionArn("arn:aws:lambda:us-west-2:12345678912:function:your-lambda")
                                .events(Event.S3_OBJECT_CREATED_PUT)
                                .build())
                        .build())
                .build());

Upvotes: 1

Robert Kossendey
Robert Kossendey

Reputation: 6998

You can do it either in the console or via SAM.

Upvotes: 0

Related Questions