From 41288ca4949ae283ea043e05140db9703e94b0b8 Mon Sep 17 00:00:00 2001 From: msailes Date: Fri, 19 Mar 2021 13:33:29 +0000 Subject: [PATCH 1/3] Feat: S3 Object Lambda support --- .../runtime/events/S3ObjectLambdaEvent.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java new file mode 100644 index 00000000..e8486cf6 --- /dev/null +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java @@ -0,0 +1,63 @@ +package com.amazonaws.services.lambda.runtime.events; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@Builder(setterPrefix = "with") +@NoArgsConstructor +@AllArgsConstructor +public class S3ObjectLambdaEvent { + + private String xAmzRequestId; + private GetObjectContext getObjectContext; + private Configuration configuration; + private UserRequest userRequest; + private UserIdentity userIdentity; + private String protocolVersion; + + @Data + @Builder(setterPrefix = "with") + @NoArgsConstructor + @AllArgsConstructor + public static class GetObjectContext { + private String inputS3Url; + private String outputRoute; + private String outputToken; + } + + @Data + @Builder(setterPrefix = "with") + @NoArgsConstructor + @AllArgsConstructor + public static class Configuration { + private String accessPointArn; + private String supportingAccessPointArn; + private String payload; + } + + @Data + @Builder(setterPrefix = "with") + @NoArgsConstructor + @AllArgsConstructor + public static class UserRequest { + private String url; + private Map headers; + } + + @Data + @Builder(setterPrefix = "with") + @NoArgsConstructor + @AllArgsConstructor + public static class UserIdentity { + private String type; + private String principalId; + private String arn; + private String accountId; + private String accessKeyId; + } +} \ No newline at end of file From bf4162dce9fb7c4f3aa7a7558e7ef5314324da7d Mon Sep 17 00:00:00 2001 From: msailes Date: Fri, 19 Mar 2021 14:32:17 +0000 Subject: [PATCH 2/3] docs. --- .../services/lambda/runtime/events/S3ObjectLambdaEvent.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java index e8486cf6..36b83ffd 100644 --- a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java @@ -7,6 +7,12 @@ import java.util.Map; +/** + * Event to allow transformations to occur before an S3 object is returned to the calling service. + * + * https://aws.amazon.com/blogs/aws/introducing-amazon-s3-object-lambda-use-your-code-to-process-data-as-it-is-being-retrieved-from-s3/ + */ + @Data @Builder(setterPrefix = "with") @NoArgsConstructor From ec238959abd675cedb0749f6e579e441da5c7ef1 Mon Sep 17 00:00:00 2001 From: msailes Date: Tue, 23 Mar 2021 13:29:19 +0000 Subject: [PATCH 3/3] Helpers for the most used methods. Improved javadocs. Example usage added. --- .../runtime/events/S3ObjectLambdaEvent.java | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java index 36b83ffd..ca9136a1 100644 --- a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java @@ -10,7 +10,41 @@ /** * Event to allow transformations to occur before an S3 object is returned to the calling service. * - * https://aws.amazon.com/blogs/aws/introducing-amazon-s3-object-lambda-use-your-code-to-process-data-as-it-is-being-retrieved-from-s3/ + * Documentation + * + * Writing and debugging Lambda functions for S3 Object Lambda Access Points + * + * Example: + * + *
+ * import com.amazonaws.services.lambda.runtime.Context;
+ * import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
+ * import org.apache.http.client.fluent.Request;
+ * import software.amazon.awssdk.services.s3.S3Client;
+ * import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;
+ *
+ * import java.io.IOException;
+ *
+ * import static software.amazon.awssdk.core.sync.RequestBody.fromString;
+ *
+ * public class S3ObjectRequestHandler {
+ *
+ *      private static final S3Client s3Client = S3Client.create();
+ *
+ *      public void handleRequest(S3ObjectLambdaEvent event, Context context) throws IOException {
+ *          String s3Body = Request.Get(event.inputS3Url()).execute().returnContent().asString();
+ *
+ *          String responseBody = s3Body.toUpperCase();
+ *
+ *          WriteGetObjectResponseRequest request = WriteGetObjectResponseRequest.builder()
+ *              .requestRoute(event.outputRoute())
+ *              .requestToken(event.outputToken())
+ *              .build();
+ *          s3Client.writeGetObjectResponse(request, fromString(responseBody));
+ *      }
+ * }
+ * 
+ * 
*/ @Data @@ -26,6 +60,39 @@ public class S3ObjectLambdaEvent { private UserIdentity userIdentity; private String protocolVersion; + /** + * A pre-signed URL that can be used to fetch the original object from Amazon S3. + * + * The URL is signed using the original caller’s identity, and their permissions + * will apply when the URL is used. If there are signed headers in the URL, the + * Lambda function must include these in the call to Amazon S3, except for the Host. + * + * @return A pre-signed URL that can be used to fetch the original object from Amazon S3. + */ + public String inputS3Url() { + return getGetObjectContext().getInputS3Url(); + } + + /** + * A routing token that is added to the S3 Object Lambda URL when the Lambda function + * calls the S3 API WriteGetObjectResponse. + * + * @return the outputRoute + */ + public String outputRoute() { + return getGetObjectContext().getOutputRoute(); + } + + /** + * An opaque token used by S3 Object Lambda to match the WriteGetObjectResponse call + * with the original caller. + * + * @return the outputToken + */ + public String outputToken() { + return getGetObjectContext().getOutputToken(); + } + @Data @Builder(setterPrefix = "with") @NoArgsConstructor