java.io.FileNotFoundException при доступе из корзины S3? - PullRequest
0 голосов
/ 01 мая 2018

Я делаю небольшой POC в AWS. Я пытаюсь прочитать CSV-файл из корзины S3 и отображения в лог-файлах 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

enter image description here

Ошибки журнала CloudWatch

Я внутри лямбда-функции

Я внутри лямбда-функции2

Я внутри лямбда-функции3

Я внутри лямбда-функции4

Я внутри лямбда-функции5

Я внутри лямбда-функции6

Я внутри лямбда-функции7

Я внутри лямбда-функции8

Я внутри лямбда-функции9

Событие S3 получено: readfilefromcsvfile / def_nhtsa_crash_test.csv

Я внутри лямбда-функции10

java.io.FileNotFoundException:

readfilefromcsvfile / def_nhtsa_crash_test.csv (нет такого файла или каталога) java.io.FileNotFoundException: readfilefromcsvfile / def_nhtsa_crash_test.csv (нет такого файла или каталога) at java.io.FileInputStream.open0 (собственный метод)

Если мы посмотрим на вывод журнала, он говорит, что такого файла нет, но я сохранил его в корзине S3. Может кто-нибудь сказать мне, как получить доступ к файлу S3 в Java? или Какой путь я должен дать при доступе к файлу S3 Bucket?

1 Ответ

0 голосов
/ 01 мая 2018

Здесь нет необходимости создавать экземпляр 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());
}
...