java.io.FileNotFoundException 从 S3 存储桶访问时?

java.io.FileNotFoundException while accessing from S3 bucket?

我正在 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 函数 2 中

我在 lambda 函数 3 中

我在 lambda 函数 4 中

我在 lambda 函数中5

我在 lambda 函数中 6

我在lambda函数7里面

我在lambda函数8里面

我在lambda函数9里面

收到 S3 事件:readfilefromcsvfile/def_nhtsa_crash_test.csv

我在 lambda 函数中 10

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 存储桶文件时我应该提供的路径名是什么?

这里不需要创建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());
}