S3でログ収集(パージ編)
前回の記事で各種ログをS3へ転送するところまで書きましたが、永久にS3に
溜め続けるのはスマートではないので、適切に削除するスクリプトを作成し
ました。
・前回の記事 (S3にログ転送)
http://xoxo-infra.hatenablog.com/entry/2013/05/13/183114
前提
・S3上に、s3://ログ保存用バケット/ノード名/yyyy-mm-dd のフォルダが
存在すること。
・R53でローカルドメイン名(プライベートIP)の名前解決ができること。
仕様
・スクリプト変数内で指定したドメインに対して、route53コマンドでノード名
を取得する。
・スクリプトの第1引数は、保存世代を指定する。
・保存世代数から過去日付を取得し、S3に対してgrepを行い、フォルダが存在
すれば、そのフォルダを削除する。
スクリプト (s3-archlog-del.sh)
・s3-archlog-del.sh 保存世代数 で実行する。
(ex.) s3-archlog-del.sh 30
※30日前の s3://log-arch/[nodename]/[yyyy-mm-dd]/ を削除。
DOMAIN=".local-domain." の部分は各自置き換えて下さい。
#!/bin/bash . /home/xxx/.bash_profile GENE=$1 DATE=`date -I` SHELL_NAME=`basename ${0}` LOG=/pathto/logs/${SHELL_NAME}.log DOMAIN=".local-domain." S3_OBJECT="s3://log-arch" RETVAL=0 #set -x #-------------------------- # Output Messages #-------------------------- Output() { if [ ${RETVAL} -eq 0 ] ; then printf "[`date '+%Y%m%d %H:%M:%S'`] ${NODENAME} ${PROC} is Sucusess\n" elif [ ${RETVAL} -eq 1 ] ; then printf "[`date '+%Y%m%d %H:%M:%S'`] ${NODENAME} ${PROC} is Abnormal End\n" elif [ ${RETVAL} -eq 2 ] ; then printf "[`date '+%Y%m%d %H:%M:%S'`] ${NODENAME} ${PROC} is Skip (There are no objects to be deleted)\n" fi } >> ${LOG} #-------------------------- # Main #-------------------------- Main() { PROC=ArgumentCheck if [ -n "${GENE}" ] ; then RETVAL=0 KEEPDATE=`date -I -d ''${GENE}'days ago'` else RETVAL=1 fi Output PROC=DeleteObject DOMAIN_ID=`/usr/bin/route53 ls | grep -B1 "${DOMAIN}" | head -1 | awk '{print $3}'` NODES=`/usr/bin/route53 get ${DOMAIN_ID} | awk '$2~/^A$/ {print $1}' | sed -e 's/'${DOMAIN}'//g' | sort` for NODENAME in ${NODES} ; do if /usr/bin/s3cmd ls ${S3_OBJECT}/${NODENAME}/ | grep ${KEEPDATE} ; then if /usr/bin/s3cmd del -r ${S3_OBJECT}/${NODENAME}/${KEEPDATE} ; then RETVAL=0 else RETVAL=1 fi else RETVAL=2 fi Output done } >> ${LOG} 2>&1 #-------------------------- # Call Func #-------------------------- Main
・cron に以下のように仕込む。
# S3 archivelog delete 01 10 * * * /pathto/s3-archlog-del.sh 365 || logger "cron failed. ret=$? `/bin/awk '{print $1}' /proc/$$/cmdline`"