S3から大量のファイルを削除するスクリプト
S3からファイルを削除する方法はいくつかある。
簡単なのはダッシュボードから削除する方法。これは手軽にできる反面、せいぜい数十万枚程度のファイルしか消せないし、実行中のタブを離れることができない。
CLIで削除する方法もある。簡単なものとしては aws s3 rm s3://your-bucket-name --exclude "*" --include "*" --recursiveというワンライナー。これを実行すると指定したbucket配下の全ファイルを削除していく。ただしこれもそれほど速くない(GUIよりは遥かにマシ)。
code:sh
aws s3api list-objects-v2 --bucket your-bucket-name --prefix "images/$PREFIX" --output text --query 'Contents[].Key' | \ grep -v -e "'" | \
tr '\n' '\0' | \
xargs -0 -P2 -n500 bash -c \
で、これは確かに速く実行できて最高だが、結構な頻度でInternalErrorという謎エラーが発生してこけるということがわかった(大体はおそらくセッション切れ)。数億枚以上のファイルを削除するわけなので失敗もそれなりにあるわな〜と思うのだがスクリプトが止まると結構困るのでエラーが起きたら少し間を空けてまた実行してくれるようなスクリプトを書いた。
code:sh
echo "Usage: $0 <PREFIX>"
exit 1
fi
PREFIX=$1
execute() {
aws s3api list-objects-v2 --bucket your-bucket-name --prefix "$PREFIX" --output text --query 'Contents[].Key' | \ grep -v -e "'" | \
tr '\n' '\0' | \
xargs -0 -P2 -n500 bash -c \
}
while true; do
if execute; then
echo "Command executed successfully."
break
else
sleep 10
echo "An error occurred. Retrying..."
fi
done
これをdelete_s3_files.shみたいな名前で保存して実行権限を与え、./delete_s3_files.sh images/hogeという感じで削除したいbucket配下のprefix名を与えるとあとは大量削除をやってくれる。
削除が終わるまで無限に実行されるマッチョ実装になってるから回数制限付きの再実行処理とかは必要に応じて入れてほしい。
終わった後に発見したがライフサイクルを1日にして期限切れで削除にするというのが一番楽っぽい。が、削除されるのは1日後なので1日以内で終わらせたいならAPIの方が良いかも。