バックアップやビッグデータ分析などバッチ処理する大容量のデータ保存に使われているクラウドストレージ Amazon S3。
ファイルの整理せずに使っていると大容量のデータがバケット内に溜まってしまうことも。
Amazon S3 の課金は、保存データ容量によって決まるので、
ムダなデータを削除してコントロールしながら使っていきたいものです。
Amazon S3 には、
オブジェクトのライフサイクル管理で有効期限を決めて、その有効期限が切れたならば、
オブジェクト (ファイル) を削除することができます。
これでファイルの整理をすることができます。
参考: オブジェクトのライフサイクル管理
しかし、ライフサイクル管理は時間な面を見てコントロールできますが、
ファイル数など物理的な数値の面からコントロールするアプローチがなかったので、
今回 AWS CLI でバックアップに最適なワンライナーコマンドを紹介したいと思います。
バケット内でファイル数で制限してファイルのローテーションをするバックアップに最適な環境が実現します。
バケット内のファイル一覧を取得して、削除対象ファイル名を抽出・削除するワンライナーコマンド
aws s3 ls <S3_URI> | sort -n | head -n -<MAX_SAVED_FILES> | awk '{ print $4 }' | xargs -I% aws s3 rm <S3_URI>%
解説
1. バケットまたは prefix (ディレクトリorフォルダ) にあるファイル一覧を取得
aws s3 ls <S3_URI>
<S3_URI>
S3の仮想ホスト形式の URL
参考: バケットへのアクセス
2. ファイル一覧を昇順でソート
sort -n
3. ファイル一覧から保存しておくファイル数分を取り除いた削除対象ファイル一覧にする。
head -n -<MAX_SAVED_FILES>
-<MAX_SAVED_FILES>
保存しておくファイル数
保存しておくファイル数にマイナスを付けて、
昇順でソートした一覧の最後から -<MAX_SAVED_FILES>
分だけ取り除くことで
削除対象のファイル一覧を取得。
4. 削除対象のファイル名を抽出する
awk '{ print $4 }'
AWK (オーク) でレコードのファイル名に当たる4番目のフィールドを取得。
フィールドは、日付 時間 ファイルサイズ ファイル名の順番が
2018-01-21 02:21:03 21819150 file-001.tar.gz
2018-01-22 02:21:10 21824555 file-002.tar.gz
2018-01-23 02:21:00 21821971 file-003.tar.gz
こうなる。
file-001.tar.gz
file-002.tar.gz
file-003.tar.gz
5. コマンドを組み立ててファイルを削除
xargs -I% aws s3 rm <S3_URI>%
<S3_URI>
S3の仮想ホスト形式の URL
xargs (エックスアーグズ) で
改行で区切られたファイル名を標準入力として読み込み、
それを引数としてコマンドへ渡して、コマンドを組み立てる。
-I オプションを付けて、標準入力から読み込んだファイル名を
コマンドテンプレート aws s3 rm <S3_URI>%
を元に%
をファイル名に置き換えて削除対象の S3 の URL の引数を作る。
そして組み立てた aws s3 rm
コマンドを実行してファイルを削除。
以上できあがり。
バケットの管理は、一つの目的で管理した方がシンプルでいいと思いますが、
管理の仕方によっては、ファイルの種類やファイル拡張子がいろいろ混ざっていたり、
prefix を付けてファイルを管理していたりする場合もあると思います。
その場合、ワンライナーコマンドは、パイプで繋いでいるだけなので、
途中フィルタリングを追加したりしてファイルの抽出など応用ができます。
是非参考にしてみてください。