S3で一度に数千または数万のファイルを一括削除できるようにしたいと思います。各ファイルは1MBから50MBの範囲になります。当然のことながら、ファイルが削除されている間、ユーザー(またはサーバー)が待機するのは望ましくありません。したがって、質問:
AWSは、S3 REST APIおよびそのさまざまなラッパーを使用して、リクエストごとに最大1000オブジェクトの一括削除をサポートしています。このメソッドは、削除するS3オブジェクトキーがわかっていることを前提としています(つまり、設計されていません)保存ポリシー、特定のサイズを超えるファイルなどを処理する場合)。
S3 REST APIは、1つのリクエストで削除するファイルを最大1000個指定できます。これは、個々のリクエストを行うよりも高速でなければなりません。各リクエストはHTTP(したがってTCP)リクエストです。各リクエストはオーバーヘッドを伴います。オブジェクトのキーを把握し、HTTPリクエストを作成する必要があります(または、選択した言語でラッパーを使用します) AWSはこの機能とその使用法に関する優れた情報を提供します 。最も快適な方法を選択してください!
私はあなたのユースケースがエンドユーザーが一度に削除する特定のファイルの数を指定することを含むと想定しています。 「画像ファイルを参照するすべてのオブジェクトを削除する」や「特定の日付より古いすべてのファイルを削除する」などのタスクを開始するのではなく(S3で個別に設定するのは簡単だと思います)。
その場合は、削除する必要のあるキーがわかります。また、ユーザーはファイルが正常に削除されたかどうかについてのリアルタイムのフィードバックを好むことを意味します。 S3は非常に大量のデータを処理するにもかかわらず効率的にスケーリングするように設計されているため、正確なキーへの参照は非常に迅速になるはずです。
そうでない場合は、非同期API呼び出しを調べることができます。あなたはこれから ブログ投稿 からそれらが一般的にどのように機能するかについて少し読むことができます、またはあなたが選んだ言語でそれを行う方法を検索してください。これにより、削除要求が独自のスレッドを使用するようになり、残りのコードはユーザーを待たせることなく実行できます。または、リクエストをキューにオフロードすることもできます。 。 。しかし、これらのオプションはどちらも、コード(非同期コードは煩わしい場合があります)または環境(キューを処理するためにservice/daemon/container/serverが必要になる)を不必要に複雑にします。したがって、可能であればこのシナリオは避けます。
編集:2つを超えるリンクを投稿するという評判はありません。ただし、リクエストレートとパフォーマンスに関するAmazonのコメントはこちらで確認できます。 http://docs.aws.Amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html そしてs3 faqは、可能であれば、バルク遅延が行く方法であるとコメントしています。
手に負えないほど遅いオプションは、実際に待つのが好きなら_s3 rm --recursive
です。
異なるs3 rm --recursive
パターンを使用して--include
を並列実行すると、わずかに速くなりますが、ローカルで--include
パターンマッチングを実行するために各プロセスがキーリスト全体を個別にフェッチするため、待機に長い時間がかかります。
一括削除を入力してください。
aws s3api delete-objects
を使用して一度に1000個のキーを削除することで、最大の速度が得られることがわかりました。
次に例を示します。
cat file-of-keys | xargs -P8 -n1000 bash -c 'aws s3api delete-objects --bucket MY_BUCKET_NAME --delete "Objects=[$(printf "{Key=%s}," "$@")],Quiet=true"' _
xargs
の-P8
オプションは、並列処理を制御します。この場合は8です。つまり、一度に1000個の削除のインスタンスが8つあります。-n1000
オプションは、xargs
にaws s3api delete-objects
呼び出しごとに1000個のキーをバンドルするように指示します。,Quiet=true
を削除するかfalse
に変更すると、サーバーの応答が発生します。_
があります。 @VladNikiforovが コメントの内容の優れた解説 を投稿したので、これにリンクします。しかし、どのようにfile-of-keys
を取得しますか?
鍵のリストをすでに持っている場合は、これで十分です。ジョブが完了しました。
そうでない場合は、ここに私が推測する1つの方法があります。
aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | sed -nre "s|[0-9-]+ [0-9:]+ +[0-9]+ |SOME_SUB_DIR|p" >file-of-keys
このタスクのWebコンソールのパフォーマンスに不満を感じていました。 AWS CLI コマンドがこれをうまく行うことがわかりました。例えば:
aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files
大きなファイル階層の場合、これにはかなりの時間がかかる場合があります。これをtmux
またはscreen
セッションで実行するように設定し、後で確認することができます。
きちんとしたトリックは、削除を処理するためにライフサイクルルールを使用することです。ルールをキューに入れて、必要なプレフィックスまたはオブジェクトを削除できます。Amazonが削除を処理します。
https://docs.aws.Amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
s3 sync
コマンドについてはすでに言及していますが、--delete
オプションに関する例とWordはありません。
S3
バケットmy_bucket
内のフォルダのコンテンツを削除する最も速い方法は次のとおりです。
aws s3 sync --delete "local-empty-dir/" "s3://my_bucket/path-to-clear"
S3バケットの管理方法がわからない場合、これは特に役立つ場合とそうでない場合があります。
AWS CLIツールには、「同期」と呼ばれるオプションがあり、s3が正しいオブジェクトを持っていることを確認するのに特に効果的です。あなたまたはあなたのユーザーがローカルファイルシステムからS3を管理している場合、CLIツールを使用して削除する必要があるオブジェクトを決定する大量の作業を保存できる場合があります。
http://docs.aws.Amazon.com/cli/latest/reference/s3/sync.html