回答:
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であること可能であれば行く方法。
耐え難いほど遅いオプションがあり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
オプションは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
_
最後に重要性を強調しているはずです:)私はそれを逃し、最初の要素がスキップされる理由を理解するのにかなり時間がかかりました。ポイントは、bash -c
すべての引数をで始まる位置パラメータとして渡すのに対して$0
、「$ @」はで始まるパラメータのみを処理すること$1
です。したがって、の位置を埋めるには下線ダミーが必要です$0
。
split -l 1000
、キーファイルを1000個のキーバッチに分割しました。これで、ファイルごとにdeleteコマンドを発行して、ファイルを削除できます。何か問題が発生した場合、続行できます。
aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'
もっと簡単になると思うので| grep
、そこからa を追加してフィルタリングできます。
このタスクのWebコンソールのパフォーマンスに不満を感じました。AWS CLIコマンドでこれがうまくいくことがわかりました。例えば:
aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files
大きなファイル階層の場合、これにはかなりの時間がかかる場合があります。あなたには、このランニングを設定することができますtmux
またはscreen
セッション、後で戻って確認してください。
aws s3 rm --recursive
コマンドはファイルを個別に削除するようです。より高速なWebコンソールよりもののたくさんのファイルを削除するときに、それが大量に削除した場合、それははるかに高速になる可能性
巧妙なトリックは、ライフサイクルルールを使用して削除を処理することです。ルールをキューに入れて、必要なプレフィックスまたはオブジェクトを削除できます。Amazonが削除を処理します。
https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
s3バケットの管理方法がわからない場合、これは特に役立つ場合とそうでない場合があります。
AWS CLIツールには「syn」と呼ばれるオプションがあり、s3に正しいオブジェクトがあることを確認するのに特に効果的です。自分またはユーザーがローカルファイルシステムからS3を管理している場合、CLIツールを使用して、削除する必要があるオブジェクトを決定する作業を大量に保存できる場合があります。
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
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"' _