Amazon s3はバッチアップロードをサポートしていますか?毎晩最大1Gのファイルを100Kまでアップロードする必要があるジョブがありますが、小さなファイルに強く偏っています(90%は100バイト未満で、99%は1000バイト未満です)。
S3 APIは、単一のHTTP呼び出しでの複数のオブジェクトのアップロードをサポートしていますか?
すべてのオブジェクトは、S3で個々のオブジェクトとして使用可能でなければなりません。他の場所(FTPなど)や別の形式(データベース、EC2ローカルドライブなど)でホストすることはできません。これは外部の要件であり、変更することはできません。
S3 APIは、単一のHTTP呼び出しでの複数のオブジェクトのアップロードをサポートしていますか?
いいえ、 S3 PUT操作 は、HTTPリクエストごとに1つのオブジェクトのアップロードのみをサポートします。
リモートバケットと同期するマシンに S3 Tools をインストールし、次のコマンドを実行できます。
s3cmd sync localdirectory s3://bucket/
次に、このコマンドをスクリプトに配置し、スケジュールされたジョブを作成して、このコマンドを毎晩実行できます。
これはあなたが望むことをするはずです。
このツールはMD5ハッシュとファイルサイズに基づいてファイル同期を実行するため、衝突はまれです(本当に必要な場合は、「s3cmd put」コマンドを使用して、ターゲットバケット内のオブジェクトのブラインドオーバーライトを強制できます)。
編集:また、S3 Toolsにリンクしたサイトのドキュメントを必ずお読みください-ローカルで削除されたファイルをバケットから削除するか無視するかなど、さまざまなフラグが必要です。
または、syncコマンドを使用して AWS CLIツール を介してS3をアップロードできます。
aws s3 synclocal_folders3:// bucket-name
この方法を使用して、S3へのファイルのバッチアップロードを非常に高速に行うことができます。
すべてのファイルを単一のディレクトリに配置することなく、CLIの代わりにJavaコード)を実行したい場合は、誰もが言っていることに追加します。アップロードするファイルのリストと、そのリストをAWS TransferManagerのuploadFileListメソッドに提供します。
1つのファイル(またはファイルの一部)= 1つのHTTPリクエスト、ただしJava APIは、 TransferManagerを使用して、独自にマルチスレッド
Javaプログラムを使用してそれを行うには、次のようにします。
public void uploadFolder(String bucket, String path, boolean includeSubDirectories) {
File dir = new File(path);
MultipleFileUpload upload = transferManager.uploadDirectory(bucket, "", dir, includeSubDirectories);
try {
upload.waitForCompletion();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
テストする場合、ローカルS3に接続するためのs3clientと転送マネージャーの作成は次のとおりです。
AWSCredentials credentials = new BasicAWSCredentials(accessKey, token);
s3Client = new AmazonS3Client(credentials); // This is deprecated but you can create using standard beans provided by spring/aws
s3Client.setEndpoint("http://127.0.0.1:9000");//If you wish to connect to local S3 using minio etc...
TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(s3Client).build();