S3ファイルをバッチ削除する最も効率的な方法


16

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

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

回答:


12

AWSは、S3 REST APIとそのさまざまなラッパーを使用して、リクエストごとに最大1000個のオブジェクトの一括削除をサポートしています。このメソッドは、削除するS3オブジェクトキーを知っていることを前提としています(つまり、保持ポリシー、特定のサイズを超えるファイルなどを処理するようには設計されていません)。

S3 REST APIは、1回のリクエストで最大1000個のファイルを削除するように指定できます。これは、個別のリクエストを行うよりも速くする必要があります。各リクエストはHTTP(つまりTCP)リクエストであることに注意してください。したがって、各リクエストにはオーバーヘッドが伴います。オブジェクトのキーを知り、HTTPリクエストを作成するだけです(または選択した言語でラッパーを使用します)。AWSは、この機能とその使用法に関する優れた情報を提供します。最も快適な方法を選択してください!

ユースケースには、一度に削除する特定のファイルの数を指定するエンドユーザーが関係すると想定しています。「画像ファイルを参照するすべてのオブジェクトを消去する」や「特定の日付より古いすべてのファイルを消去する」などのタスクを開始するのではなく(S3で簡単に個別に設定できると思います)。

その場合、削除する必要があるキーがわかります。また、ファイルが正常に削除されたかどうかについて、ユーザーがよりリアルタイムのフィードバックを好むことも意味します。S3は非常に大量のデータを処理するにも関わらず、効率的にスケーリングするように設計されているため、正確なキーへの参照は非常に高速であると想定されています。

そうでない場合は、非同期API呼び出しを調べることができます。一般的にどのように機能するかについては、このブログ投稿から読むか、選択した言語でそれを行う方法を検索してください。これにより、削除要求が独自のスレッドを占有し、ユーザーを待たせずに残りのコードを実行できます。または、リクエストをキューにオフロードできます。。。しかし、これらのオプションは両方とも、コード(非同期コードは迷惑になる可能性があります)または環境(キューを処理するためにサービス/デーモン/コンテナ/サーバーが必要です。不必要に複雑になります。

編集:3つ以上のリンクを投稿する評判はありません。しかし、あなたはここに要求レートとパフォーマンス上のアマゾンのコメントを見ることができます:http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.htmlとS3よくある質問コメントバルクdeleitonであること可能であれば行く方法。


17

耐え難いほど遅いオプションがありs3 rm --recursive、あなたが待っている実際のような場合。

s3 rm --recursive異なる--includeパターンでの並列実行はわずかに高速ですが、各プロセスがローカルで--includeパターンマッチングを実行するためにキーリスト全体を個別にフェッチするため、待機に多くの時間がかかります。

一括削除を入力します。

を使用して一度に1000個のキーを削除することで、最も高速に処理できることがわかりましたaws s3api delete-objects

次に例を示します。

cat file-of-keys | xargs -P8 -n1000 bash -c 'aws s3api delete-objects --bucket MY_BUCKET_NAME --delete "Objects=[$(printf "{Key=%s}," "$@")],Quiet=true"' _
  • -P8上のオプションxargsのコントロール並列処理。この場合は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

9
素晴らしいアプローチですが、キーをリストすることがボトルネックであることがわかりました。これははるかに高速です: aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys そして、オブジェクトを削除します(1つの並列プロセスを超えるとオブジェクト削除のレート制限に達するのに十分でした): tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
SEK

2
おそらく_最後に重要性を強調しているはずです:)私はそれを逃し、最初の要素がスキップされる理由を理解するのにかなり時間がかかりました。ポイントは、bash -cすべての引数をで始まる位置パラメータとして渡すのに対して$0、「$ @」はで始まるパラメータのみを処理すること$1です。したがって、の位置を埋めるには下線ダミーが必要です$0
Vlad Nikiforov

@VladNikiforov乾杯、編集。
antak

3
このアプローチ(antakまたはVladのいずれか)で私が見つけた問題の1つは、エラーがあった場合に簡単に再開できないことです。多くのキー(私の場合は10M)を削除している場合、ネットワークエラー、またはスロットリングエラーが発生している可能性があります。そのため、これを改善するためにsplit -l 1000、キーファイルを1000個のキーバッチに分割しました。これで、ファイルごとにdeleteコマンドを発行して、ファイルを削除できます。何か問題が発生した場合、続行できます。
joelittlejohn

キーのリストだけが必要な場合は、aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'もっと簡単になると思うので| grep、そこからa を追加してフィルタリングできます。
ヘイデン

3

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

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

大きなファイル階層の場合、これにはかなりの時間がかかる場合があります。あなたには、このランニングを設定することができますtmuxまたはscreenセッション、後で戻って確認してください。


2
このaws s3 rm --recursiveコマンドはファイルを個別に削除するようです。より高速なWebコンソールよりもののたくさんのファイルを削除するときに、それが大量に削除した場合、それははるかに高速になる可能性
ブランドン


0

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

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

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


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.