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..ca9136a1 --- /dev/null +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/S3ObjectLambdaEvent.java @@ -0,0 +1,136 @@ +package com.amazonaws.services.lambda.runtime.events; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * Event to allow transformations to occur before an S3 object is returned to the calling service. + * + * 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 +@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; + + /** + * 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 + @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