web-dev-qa-db-ja.com

S3ファイルを一括削除する最も効率的な方法

S3で一度に数千または数万のファイルを一括削除できるようにしたいと思います。各ファイルは1MBから50MBの範囲になります。当然のことながら、ファイルが削除されている間、ユーザー(またはサーバー)が待機するのは望ましくありません。したがって、質問:

  1. 特に大量のファイルを削除する場合、S3はファイルの削除をどのように処理しますか?
  2. これを実行してAWSにほとんどの作業を行わせる効率的な方法はありますか?効率的とは、S3への要求の数を最小限に抑え、サーバー上のリソースを最小限にして、最短時間で処理することです。
17
SudoKill

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は、可能であれば、バルク遅延が行く方法であるとコメントしています。

12
Ed D'Azzo

手に負えないほど遅いオプションは、実際に待つのが好きなら_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オプションは、xargsaws 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
20
antak

このタスクのWebコンソールのパフォーマンスに不満を感じていました。 AWS CLI コマンドがこれをうまく行うことがわかりました。例えば:

aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files

大きなファイル階層の場合、これにはかなりの時間がかかる場合があります。これをtmuxまたはscreenセッションで実行するように設定し、後で確認することができます。

4
dannyman

きちんとしたトリックは、削除を処理するためにライフサイクルルールを使用することです。ルールをキューに入れて、必要なプレフィックスまたはオブジェクトを削除できます。Amazonが削除を処理します。

https://docs.aws.Amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html

2
cam8001

s3 sync コマンドについてはすでに言及していますが、--deleteオプションに関する例とWordはありません。

S3バケットmy_bucket内のフォルダのコンテンツを削除する最も速い方法は次のとおりです。

aws s3 sync --delete "local-empty-dir/" "s3://my_bucket/path-to-clear"

1
Hubbitus

S3バケットの管理方法がわからない場合、これは特に役立つ場合とそうでない場合があります。

AWS CLIツールには、「同期」と呼ばれるオプションがあり、s3が正しいオブジェクトを持っていることを確認するのに特に効果的です。あなたまたはあなたのユーザーがローカルファイルシステムからS3を管理している場合、CLIツールを使用して削除する必要があるオブジェクトを決定する大量の作業を保存できる場合があります。

http://docs.aws.Amazon.com/cli/latest/reference/s3/sync.html

0
Bill B