0

我正在 AWS 中做一个小型 POC。我试图从 S3 存储桶中读取 csv 文件并显示在 CloudWatch 日志文件中。一切都很好,但是在访问文件时得到 java.io.FileNotFoundException

编码

public class LambdaFunctionHandler implements RequestHandler<S3Event, Report> {

Region AWS_REGION = Region.getRegion(Regions.US_EAST_1);

public Report handleRequest(S3Event s3event, Context context) {
    long startTime = System.currentTimeMillis();
    Report statusReport = new Report();
    LambdaLogger logger = context.getLogger();

    logger.log("Lambda Function Started");
    logger.log("I am inside lambda function");
    Helper helper = new Helper();

    try {
        logger.log("I am inside lambda function2");
        S3EventNotificationRecord record = s3event.getRecords().get(0);
        logger.log("I am inside lambda function3");
        String srcBucket = record.getS3().getBucket().getName();
        logger.log("I am inside lambda function4");
        // Object key may have spaces or unicode non-ASCII characters.
        String srcKey = record.getS3().getObject().getKey().replace('+', ' ');
        logger.log("I am inside lambda function5");
        srcKey = URLDecoder.decode(srcKey, "UTF-8");
        logger.log("I am inside lambda function6");

        AmazonS3 s3Client = new AmazonS3Client();
        logger.log("I am inside lambda function7");
        S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
        logger.log("I am inside lambda function8");
        statusReport.setFileSize(s3Object.getObjectMetadata().getContentLength());
        logger.log("I am inside lambda function9");

        logger.log("S3 Event Received: " + srcBucket + "/" + srcKey);
        logger.log("I am inside lambda function10");

        File file = new File(srcBucket+"/"+srcKey);
        try {
            Scanner readData =new Scanner(file);
            while(readData.hasNext()) {
                String data = readData.next();
                logger.log("I am inside lambda function data ;;got it");
                //System.out.println("data"+data);
            }
            readData.close();
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }

CloudWatch 日志文件输出

在此处输入图像描述

CloudWatch 日志错误

我在 lambda 函数中

我在 lambda function2 里面

我在 lambda function3 里面

我在 lambda function4 里面

我在 lambda function5 里面

我在 lambda function6 里面

我在 lambda function7 里面

我在 lambda function8 里面

我在 lambda function9 里面

收到 S3 事件:readfilefromcsvfile/def_nhtsa_crash_test.csv

我在 lambda function10 里面

java.io.FileNotFoundException:

readfilefromcsvfile/def_nhtsa_crash_test.csv(没有这样的文件或目录)java.io.FileNotFoundException:readfilefromcsvfile/def_nhtsa_crash_test.csv(没有这样的文件或目录)在java.io.FileInputStream.open0(本机方法)

如果我们查看日志输出,则表明没有此类文件,但我已将其保存在 S3 存储桶中。谁能告诉我如何在 java 中访问 S3 文件?或者访问 S3 存储桶文件时我应该提供的路径名是什么?

4

1 回答 1

3

此处无需创建 File 实例。您可以简单地处理 S3 InputStream。

S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
....
Scanner scanner = new Scanner(s3Object.getObjectContent());
while (scanner.hasNext()) {
    System.out.println(scanner.next());
}
于 2018-05-01T09:31:15.253 回答