IDCFのオブジェクトストレージに日次でバックアップを取得しているのですが、ほおって置くと当然、溢れますので(※50GBを超えて費用が発生する)、世代管理を行います。
バックアップ要件
とにかく50GB以内に納めれば良いのと、バックアップって結局、あまり古いのは使えないということで、「直近10ファイル(10日分)を残す」というシンプルな要件で世代管理します。これなら、バックアップに失敗したとしても、最新のものを削除してしまうことがありません。日付条件とかにしておくと、時間が経ったら最新も消しちゃうから。
バックアップ世代管理スクリプト
前提は、前回のバックアップ設定のほうを参考に。
とりあえず出来上がったスクリプトは以下の通りです。
#!/bin/bash for bucket in s3://database.backup s3://www.backup; do rm -f /tmp/list.s3 docker run --rm -v `pwd`:/mnt s3cmd s3cmd --no-check-certificate ls ${bucket} | awk '{print $NF}' | sort -n > /tmp/list.s3 for i in {1..10}; do sed -i -e '$d' /tmp/list.s3 ; done for f in `cat /tmp/list.s3` ; do docker run --rm -v `pwd`:/mnt s3cmd s3cmd --no-check-certificate rm $f 2>&1 >/dev/null done done
スクリプト詳細
まず、対象バケットを2つ指定してループで回します。lsで取った結果(バケットリスト)にしようかなと思ったんですが、他のもの保存したとき誤爆しそうなので、あえてターゲットバケットをここで指定します。
次にバケットからファイルリストを取り出します。lsで取り出し、最後の項目($NF)がファイル名なので、これをリストファイルに保存。lsの時点でsortされているはずなのですが、再度一応sortを入れます。
出来上がったファイルを元に、最新の10件を残して、古いものから削除します。こう書くと、スクリプトで書くのがとても難しく見えますが、逆に、削除対象ではない、最新の10件を、このファイルから消してしまえば、リストファイルの中身は「消すべきファイル」になります。
10件削除する方法ですが、いろいろ調べて、結局、「10回、最終行を消す」という処理にしています。10回のループですが、seqコマンド等使わず、「{1..10}」という形で明示的に指定します。回数指定ループの方法としては、expr使って、まともに数で計算する方法もありますが、この程度であれば回したい数の文字列作ってしまったほうが速いです。
あとは、削除対象リストとなったリストファイルの中身に従い、rmコマンドを発行するだけです。
これで、最新10件に維持するスクリプトの完成です。コマンドの出力を捨てていますが、これはcronで動かしたとき、メッセージ(メール)が出ないようにするためです。スクリプト冒頭でexec&loggerするとかがもしかしたら綺麗かな、とは思いつつ、処理を端折っています。
cronに追加。これで放置しても溢れない
初回は手で動かしてみましたが問題無し。cronに仕込んでしまえば、あとは自動でやってくれます。バックアップ作成中(転送中)でも特に動作上問題は無いと思いますが、念のため、時間はずらしておきました。
世代管理も完成して、IDCFのオブジェクトストレージ無料枠内でバックアップを運用することができるようになりました。しかし50GBまで無料なんて、IDCFさん、太っ腹です。たいていの個人ブログであれば、バックアップはこれで間に合ってしまうのではないかと。
コメント