2016-11-30 10 views
7

Java SpringアプリケーションからAmazon S3にファイルをアップロードしようとすると例外が発生します。この方法は非常に簡単です:AWS Java S3アップロードエラー:「プロファイルファイルをnullにできません」

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(); 
     } 
    } 

それはAmazonがhereを提供し、this otherバージョンをしようとしたときとまったく同じメッセージ(「プロファイルファイルをnullにすることはできません」)と同じ例外が表示されることを基本的に同じです。 この問題は、存在しないか、またはnullであるファイルに関連していません(呼び出す前にFileメソッドのTransferManager.uploadメソッドが既に存在することを何千もチェックしています)。

私の例外メッセージ "のプロファイルファイルはnullでない可能性があります"に関する情報は見つかりませんでした。エラーログの最初の行は次のとおりです。

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) 

My S3ポリシーでは、すべての種類のユーザーのオブジェクトを取得して配置できます。

何が起こっているか考えてみませんか?

答えて

9

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

をオブジェクトを置くしようとしたときには、~/.aws/credentialsでデフォルトのプロファイルの任意の構成を持っていないのであれば、それはそのエラーを生成します。

ラムダサービスでコードを実行すると、このファイルは提供されません。その場合、資格情報を提供する必要もありません。ちょうど私のラムダ関数に右の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-profile-file-from-null-nullにすることはできません/ 44079772#44079772 –

関連する問題