gpt4 book ai didi

java - 如何读取直接触发lambda执行的上传文件?

转载 作者:行者123 更新时间:2023-12-01 17:54:09 26 4
gpt4 key购买 nike

我当前的 AWS 设置是一个 lambda 函数,每当我将对象放入 S3 存储桶时就会触发该函数。我用 Java 实现了 lambda 的处理函数。我想要做的只是访问已上传的文件并触发 lambda 函数的执行。例如,如果我将 sample.json 上传到存储桶,我想在处理函数中访问此文件的内容。

我知道我可以做这样的事情:

public Void handleRequest(S3Event input, Context context) {
for (S3EventNotificationRecord record : input.getRecords()) {
String key = record.getS3().getObject().getKey();
String bucket = record.getS3().getBucket().getName();
AmazonS3 s3Client = new AmazonS3Client(credentials);
try {
S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucket, key));
InputStream input = s3Object.getObjectContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
while (true) {
String line = reader.readLine();
if (line == null) break;
// Do something with line...
}
// ...

问题是我不允许使用访问 key 。因此,我无法创建 s3Client 来下载文件。换句话说,我必须从处理程序方法采用的参数(即 S3Event input)中获取对象。我该怎么做?

最佳答案

如果您的 Lambda 函数配置了适当的 IAM 角色(允许相关 S3 对象的 s3:GetObject),则您无需在代码中显式提供凭据。

以下是获取对象以响应对象上传 Lambda 事件的示例 Java 代码:

public class S3GetTextBody implements RequestHandler<S3Event, String> {
public String handleRequest(S3Event s3event, Context context) {
try {
S3EventNotificationRecord record = s3event.getRecords().get(0);
// Retrieve the bucket & key for the uploaded S3 object that
// caused this Lambda function to be triggered
String bkt = record.getS3().getBucket().getName();
String key = record.getS3().getObject().getKey().replace('+', ' ');
key = URLDecoder.decode(key, "UTF-8");
// Read the source file as text
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
String body = s3Client.getObjectAsString(bkt, key);
System.out.println("Body: " + body);
return "ok";
} catch (Exception e) {
System.err.println("Exception: " + e);
return "error";
}
}
}

进口:

import java.net.URLDecoder;    
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.S3Event;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;

关于java - 如何读取直接触发lambda执行的上传文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46805594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com