Skip to content

Commit 90b723f

Browse files
msailescarlzogh
andauthored
Feat: S3 Object Lambda support (#229)
Co-authored-by: Carl Zogheib <[email protected]>
1 parent 2eb3f70 commit 90b723f

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package com.amazonaws.services.lambda.runtime.events;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.Map;
9+
10+
/**
11+
* Event to allow transformations to occur before an S3 object is returned to the calling service.
12+
*
13+
* <strong>Documentation</strong>
14+
*
15+
* <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/olap-writing-lambda.html">Writing and debugging Lambda functions for S3 Object Lambda Access Points</a>
16+
*
17+
* <strong>Example:</strong>
18+
*
19+
* <pre>
20+
* <code>import com.amazonaws.services.lambda.runtime.Context;
21+
* import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
22+
* import org.apache.http.client.fluent.Request;
23+
* import software.amazon.awssdk.services.s3.S3Client;
24+
* import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;
25+
*
26+
* import java.io.IOException;
27+
*
28+
* import static software.amazon.awssdk.core.sync.RequestBody.fromString;
29+
*
30+
* public class S3ObjectRequestHandler {
31+
*
32+
* private static final S3Client s3Client = S3Client.create();
33+
*
34+
* public void handleRequest(S3ObjectLambdaEvent event, Context context) throws IOException {
35+
* String s3Body = Request.Get(event.inputS3Url()).execute().returnContent().asString();
36+
*
37+
* String responseBody = s3Body.toUpperCase();
38+
*
39+
* WriteGetObjectResponseRequest request = WriteGetObjectResponseRequest.builder()
40+
* .requestRoute(event.outputRoute())
41+
* .requestToken(event.outputToken())
42+
* .build();
43+
* s3Client.writeGetObjectResponse(request, fromString(responseBody));
44+
* }
45+
* }
46+
* </code>
47+
* </pre>
48+
*/
49+
50+
@Data
51+
@Builder(setterPrefix = "with")
52+
@NoArgsConstructor
53+
@AllArgsConstructor
54+
public class S3ObjectLambdaEvent {
55+
56+
private String xAmzRequestId;
57+
private GetObjectContext getObjectContext;
58+
private Configuration configuration;
59+
private UserRequest userRequest;
60+
private UserIdentity userIdentity;
61+
private String protocolVersion;
62+
63+
/**
64+
* A pre-signed URL that can be used to fetch the original object from Amazon S3.
65+
*
66+
* The URL is signed using the original caller’s identity, and their permissions
67+
* will apply when the URL is used. If there are signed headers in the URL, the
68+
* Lambda function must include these in the call to Amazon S3, except for the Host.
69+
*
70+
* @return A pre-signed URL that can be used to fetch the original object from Amazon S3.
71+
*/
72+
public String inputS3Url() {
73+
return getGetObjectContext().getInputS3Url();
74+
}
75+
76+
/**
77+
* A routing token that is added to the S3 Object Lambda URL when the Lambda function
78+
* calls the S3 API WriteGetObjectResponse.
79+
*
80+
* @return the outputRoute
81+
*/
82+
public String outputRoute() {
83+
return getGetObjectContext().getOutputRoute();
84+
}
85+
86+
/**
87+
* An opaque token used by S3 Object Lambda to match the WriteGetObjectResponse call
88+
* with the original caller.
89+
*
90+
* @return the outputToken
91+
*/
92+
public String outputToken() {
93+
return getGetObjectContext().getOutputToken();
94+
}
95+
96+
@Data
97+
@Builder(setterPrefix = "with")
98+
@NoArgsConstructor
99+
@AllArgsConstructor
100+
public static class GetObjectContext {
101+
private String inputS3Url;
102+
private String outputRoute;
103+
private String outputToken;
104+
}
105+
106+
@Data
107+
@Builder(setterPrefix = "with")
108+
@NoArgsConstructor
109+
@AllArgsConstructor
110+
public static class Configuration {
111+
private String accessPointArn;
112+
private String supportingAccessPointArn;
113+
private String payload;
114+
}
115+
116+
@Data
117+
@Builder(setterPrefix = "with")
118+
@NoArgsConstructor
119+
@AllArgsConstructor
120+
public static class UserRequest {
121+
private String url;
122+
private Map<String, String> headers;
123+
}
124+
125+
@Data
126+
@Builder(setterPrefix = "with")
127+
@NoArgsConstructor
128+
@AllArgsConstructor
129+
public static class UserIdentity {
130+
private String type;
131+
private String principalId;
132+
private String arn;
133+
private String accountId;
134+
private String accessKeyId;
135+
}
136+
}

0 commit comments

Comments
 (0)