Java SpringアプリケーションからファイルをAmazon 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();
}
}
Amazonが here を提供するのと基本的に同じであり、 this other versionを試みると、まったく同じメッセージ(「プロファイルファイルを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)
私のS3ポリシーでは、あらゆる種類のユーザーのオブジェクトを取得および配置できます。
何が起こっているのか考えていますか?
ProfileCredentialsProvider() は、デフォルトのプロファイルに設定されたAWSセキュリティ認証情報を返す新しいプロファイル認証情報プロバイダーを作成します。
したがって、~/.aws/credentials
にデフォルトプロファイルの設定がない場合、オブジェクトを配置しようとすると、そのエラーが発生します。
Lambdaサービスでコードを実行する場合、このファイルは提供されません。その場合、資格情報を提供する必要もありません。ラムダ関数に正しいIAMロールを割り当てるだけで、デフォルトのコンストラクターを使用して問題を解決できます。
必要に応じて TransferManager コンストラクターを変更することもできます。
ソリューションは非常にシンプルでした。私は、Spring用のAmazonS3 Beanなしでこの通信を実装しようとしていました。
このリンクは設定に役立ちます:
私のコードは次のようにうまくいきました:
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(DefaultAWSCredentialsProviderChain.getInstance()).withRegion(clientRegion).build();