バックアップに最適 Amazon S3でバケットのファイル数を制限するワンライナーコマンド (AWS CLI)

バックアップやビッグデータ分析などバッチ処理する大容量のデータ保存に使われているクラウドストレージ 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 を付けてファイルを管理していたりする場合もあると思います。

その場合、ワンライナーコマンドは、パイプで繋いでいるだけなので、
途中フィルタリングを追加したりしてファイルの抽出など応用ができます。
是非参考にしてみてください。

関連サイト

ログ監視ツール Logwatch を使ってみる (アップデート版)

以前の記事から Logwatch のコマンドが変わっていたので、再度書き直しました。

以前から変わったところは、出力のところ。
前は、logwatch --print とするだけで標準出力できましたが、
logwatch --output stdout と出力指定をする必要があります。

Logwatch は、いろいろなログをまとめて集計し、レポートとして毎日定期的にメールで届けてくれる。不正アクセスや不具合の発見とサーバの監視に便利なツール。

Logwatch のインストール

Logwatch は Perl で書かれていて Perl 5.8 以上が必要です。

yumからのインストールは、

$ yum install logwatch

で、

ソースからのインストールは、こちらから

Logwatch をインストールした時点で cron に登録されているので、毎日指定した時刻または anacronでランダムな時刻に Logwatch のスクリプト (/etc/cron.daily/0logwatch) が実行されてレポートが届く。

logwatch の設定

logwatch の設定は、/usr/share/logwatch/default.conf/logwatch.conf を編集する。標準設定のままで十分ですが、以下の項目を確認して設定。

#ログが保存されているディレクトリ
LogDir = /var/log
#メールの送信先
MailTo = user@hoge.com
#アーカイブされたログも含めるかどうか
Archives = Yes
#レポートの日付範囲を3つのオプションから。All, Today, Yesterday
Range = Yesterday
ログの詳細度、Low (=0), Med (=5), High (=10) または 0から10までの数字で
Detail = High
# チェックの対象となるサービスを /usr/share/logwatch/scripts/services/ 以下、あるいは All で指定。
Service = All
# メールコマンドパス
mailer = "/usr/sbin/sendmail -t"

サービスごとの個別設定は、/usr/share/logwatch/default.conf/services/ に用意されている。各サービスの設定ファイルを編集することで個別設定できる。

logwatch コマンドを使ってみる

標準出力

logwatch --output stdout

または、デフォルトで標準出力

logwatch

出力は、標準出力 (stdout) ほか、メール (mail) とファイル (file) への出力がある。

特定のサービスだけ出力

logwatch --output stdout --service http

複数のサービスにも

logwatch --output stdout --service http --service sshd

ログの詳細度を変えてみる

logwatch --output stdout --detail 10 --service http

メールに出力

logwatch --output mail --mailto user@hoge.com

ファイルに出力

logwatch --output file --filename /path/to/logwatch.txt

logwatch --help

Usage: /sbin/logwatch [--detail ] [--logfile ] [--output ]
   [--format ] [--encode ] [--numeric] [--no-oldfiles-log]
   [--mailto ] [--archives] [--range ] [--debug ]
   [--filename ] [--help|--usage] [--version] [--service ]
   [--hostformat ] [--hostlimit <host1,host2>] [--html_wrap ]

--detail : Report Detail Level - High, Med, Low or any #.
--logfile : *Name of a logfile definition to report on.
--logdir : Name of default directory where logs are stored.
--service : *Name of a service definition to report on.
--output : Report Output - stdout [default], mail, file.
--format : Report Format - text [default], html.
--encode : Enconding to use - none [default], base64.
--no-oldfiles-log: Suppress the logwatch log, which informs about the
                   old files in logwatch tmpdir.
--mailto : Mail report to .
--archives: Use archived log files too.
--filename : Used to specify they filename to save to. --filename  [Forces output to file].
--range : Date range: Yesterday, Today, All, Help
                             where help will describe additional options
--numeric: Display addresses numerically rather than symbolically and numerically
           (saves  a  nameserver address-to-name lookup).
--debug : Debug Level - High, Med, Low or any #.
--hostformat: Host Based Report Options - none [default], split, splitmail.
--hostlimit: Limit report to hostname - host1,host2.
--hostname: overwrites hostname
--html_wrap : Default is 80.
--version: Displays current version.
--help: This message.
--usage: Same as --help.
* = Switch can be specified multiple times...
</host1,host2>

関連サイト

最近の投稿

カテゴリー

アーカイブ