雑多なインフラエンジニア日記

技術ブログでっす~

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`"