java - 使用 Java lambda 读取 aws s3 上的文件

标签 java amazon-web-services amazon-s3 aws-lambda

上下文:

我正在尝试读取 AWS s3 上的 csv 文件,计算其数据并将结果写入同一 s3 存储桶中的另一个 csv 上。

我尝试使用以下代码创建一个可以读取我的 Main 的类,并将参数存储在名为 lambdaCmd.txt 的文本文件中。每次修改lambdaCmd.txt时,都会触发lambda函数,并将lambdaCmd.txt的内容通过s3event传递给下面的类参数:

public class LambdaCmd implements RequestHandler<S3Event, Void>{

    static final Logger LOGGER = LogManager.getLogger(LambdaCmd.class);

    @Override
    public Void handleRequest(S3Event s3event, Context context) {

        //Getting my txt file's path
        S3EventNotification.S3EventNotificationRecord record = s3event.getRecords().get(0);
        String bkt = record.getS3().getBucket().getName();
        String key = record.getS3().getObject().getKey().replace('+', ' ');
        try {
            key = URLDecoder.decode(key, "UTF-8");
        } catch (UnsupportedEncodingException ex) {
            LOGGER.error(ex);
        }

        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

        try {

            //Getting my text file as a String Stream
            InputStreamReader cmdStream =
                new InputStreamReader(s3Client.getObject(bkt, key).getObjectContent());
            BufferedReader br = new BufferedReader(cmdStream);

            //Parsing the command in cmdStream
            //...
            //The command is now "String[] cmdArray" to be passed to my main

            MyMain.main(cmdArray);
            //The main function reads and write from s3 with a similar use of s3Client

            br.close();

        } catch (IOException | IllegalArgumentException | NullPointerException ex) {
            LOGGER.error(ex);
        }

        return null;
    }
}

问题:

在这段代码中记录一些调试消息后,我发现 lambda 函数在这一行停止:

        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

这是 CloudWatch 日志(我使用 ########## 隐藏个人信息):

START RequestId: ########## Version: $LATEST
16:12:11.596 [main] DEBUG path.to.mylambdaclass.LambdaCmd - LambdaCmd started
16:12:11.616 [main] DEBUG path.to.mylambdaclass.LambdaCmd - Just before creating s3Client
END RequestId: ##########
REPORT RequestId: ##########    Duration: 12398.45 ms   Billed Duration: 12400 ms Memory Size: 128 MB   Max Memory Used: 67 MB

我在创建s3Client后也有一条日志消息,但它没有打印在日志中。

问题:

为什么我的 lambda 提前结束?我是否滥用了某些对象?

最佳答案

添加以下 try/catch 后,将所有代码包装在 handleRequest 方法中(我没有捕获错误,这就是我没有看到它的原因):

try {
    //My code above
} catch (Error | Exception e) {
    LOGGER.error(e);
}

我遇到了java.lang.OutOfMemoryError。我已将 lambda 内存设置为 128MB,因为我在本地的代码使用的内存小于该内存。但似乎从 s3 读取需要多一点,现在 512MB 就可以正常工作了。

关于java - 使用 Java lambda 读取 aws s3 上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53783800/

相关文章:

java - 默认值 `server.servlet.session.persistent`

java - 卡在java中播放wav文件上......需要一些指导

java - 如何在不使用括号的情况下解决这个问题?

amazon-web-services - AWS ARN 的最大长度是多少?

java - IoC 在运行时决定具体实现

node.js - 无法在 EB CLI 中设置 CodeCommit

node.js - 在 AWS Lambda/Pulumi 中等待 http 请求

javascript - 使用 NodeJS 从 AWS S3 流式传输文件

hadoop - hadoop fs上的internal.S3AbortableInputStream-将s3获取到EMR

amazon-web-services - AWS Alert监控一个key是否定期创建一个bucket