2016-11-30 3 views
7

Я получаю исключение при попытке загрузить файл в Amazon S3 из приложения Java Spring. Метод довольно прост:AWS Java S3 Ошибка загрузки: «файл профиля не может быть пустым»

private void productionFileSaver(String keyName, File f) throws InterruptedException { 

     String bucketName = "{my-bucket-name}"; 
     TransferManager tm = new TransferManager(new ProfileCredentialsProvider());   
     // TransferManager processes all transfers asynchronously, 
     // so this call will return immediately. 
     Upload upload = tm.upload(
       bucketName, keyName, new File("/mypath/myfile.png")); 

     try { 
      // Or you can block and wait for the upload to finish 
      upload.waitForCompletion(); 
      System.out.println("Upload complete."); 
     } catch (AmazonClientException amazonClientException) { 
      System.out.println("Unable to upload file, upload was aborted."); 
      amazonClientException.printStackTrace(); 
     } 
    } 

Это в основном те же, что Амазонка обеспечивает here и то же исключение с точно таким же сообщением («Файл профиля не может быть пустым») появляется при попытке this other версии. Проблема не связана с файлом, который не существует или является нулевым (я уже проверил тысячу способов, что аргумент File, полученный методом TransferManager.upload, существует до его вызова).

Я не могу найти информацию о моем сообщении об исключении "файл профиля не может быть". Первые строки журнала ошибок являются следующими:

com.amazonaws.AmazonClientException: Unable to complete transfer: profile file cannot be null 
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.unwrapExecutionException(AbstractTransfer.java:281) 
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.rethrowExecutionException(AbstractTransfer.java:265) 
    at com.amazonaws.services.s3.transfer.internal.AbstractTransfer.waitForCompletion(AbstractTransfer.java:103) 
    at com.fullteaching.backend.file.FileController.productionFileSaver(FileController.java:371) 
    at com.fullteaching.backend.file.FileController.handlePictureUpload(FileController.java:247) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 

Моей S3 политики позволяет получать и puttings объектов для всех типов пользователей.

Любая идея о том, что происходит?

ответ

9

ProfileCredentialsProvider() creates a new profile credentials provider that returns the AWS security credentials configured for the default profile.

Так что, если у вас нет какой-либо конфигурации для профиля по умолчанию в ~/.aws/credentials, при попытке поставить объект, он дает эту ошибку.

Если вы запустите свой код в службе Lambda, он не предоставит этот файл. В этом случае вам также не нужно предоставлять учетные данные. Просто назначьте правильную роль IAM вашей лямбда-функции, а затем использовать конструктор по умолчанию должен решить проблему.

Возможно, вы захотите изменить конструктор TransferManager в соответствии с вашими потребностями.

+1

Спасибо. То же самое в 'Lambda', я передавал' ProfileCredentialsProvider' в конструктор, который вызывает эту ошибку. Использование 'AmazonS3 s3Client = new AmazonS3Client();' работает. –

+1

FYI - У меня была эта проблема в контейнере ECS докера. Это то же самое, что и с Лямбдой. Посмотрите в свой код для 'new ProfileCredentialsProvider (someProfile))' и замените его на 'DefaultAWSCredentialsProviderChain.getInstance()' –

+0

Я оставил ответ с примерами кода здесь: http://stackoverflow.com/questions/41796355/aws-error- загрузки объектно-из-s3-Профиль-файл, не может-быть-нуль/44079772 # 44079772 –