2016-11-30 164 views
7

嘗試從我的Java Spring應用程序上傳文件到Amazon S3時出現異常。方法很簡單: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版本時完全相同的消息(「配置文件不能爲空」)相同的異常出現。 該問題與文件不存在或爲空無關(我已經用千種方法檢查了在調用它之前存在的TransferManager.upload方法存在的File參數)。

我找不到有關我的異常消息「配置文件不能爲空」的任何信息。錯誤日誌的第一線如下:

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角色分配給您的lambda函數,然後使用默認構造函數即可解決問題。

您可能需要根據需要更改TransferManager構造函數。

+1

謝謝。 'Lambda'中同樣的事情是,我將'ProfileCredentialsProvider'傳遞給導致該錯誤的構造函數。使用'AmazonS3 s3Client =新的AmazonS3Client();'工作。 –

+1

僅供參考 - 我在Docker ECS容器中遇到此問題。這與Lambda一樣。在你的代碼中查找'新的ProfileCredentialsProvider(someProfile))'並用'DefaultAWSCredentialsProviderChain.getInstance()'替換它' –

+0

我在這裏留下了一個代碼示例的答案:http://stackoverflow.com/questions/41796355/aws-error-下載對象,從-S3-輪廓文件不能-是空/ 44079772#44079772 –