ログファイルをS3にバックアップする / さよならインターネット
デイリーのログファイルをS3へバックアップしたいという事案はよくあると思います。
一つの例として私の方法を載せますので、よりよい方法などあれば教えて頂きたいです。
backup dir
/var/log/backup/nginx/YYYYMMDD/
/var/log/backup/app/YYYYMMDD/
backup file
/var/log/backup/nginx/20130918/access.20130918-00.log.gz
/var/log/backup/nginx/20130918/access.20130918-01.log.gz
/var/log/backup/nginx/20130918/access.20130918-02.log.gz
...
/var/log/backup/app/20130918/app.20130918-00.log.gz
/var/log/backup/app/20130918/app.20130918-01.log.gz
/var/log/backup/app/20130918/app.20130918-02.log.gz
...
上記ディレクトリに、それぞれ
nginx、アプリケーションのログがあるとします。
nginxのログはtd-agentによって
<store>
type file_alternative
time_slice_format %Y%m%d-%H
path /var/log/backup/nginx/access
output_data_type attr:msg
localtime
output_include_time false
</store>
/var/log/aggregated/nginx/access.20130919-00.log
/var/log/aggregated/nginx/access.20130919-01.log
/var/log/aggregated/nginx/access.20130919-02.log
このように吐き出され、それを日付が変わったのち
#!/bin/sh
# set -e
DATE=`date --date '1 days ago' +%Y%m%d`
BASE="/var/log/backup"
for type in nginx app;
do
DIR="${BASE}/${type}/${DATE}"
mkdir "${DIR}"
mv ${BASE}/${type}/*${DATE}*log "${DIR}"
nice gzip --fast ${DIR}/*log
done
こちらのアーカイブスクリプトによって
/var/log/backup/nginx/YYYYMMDD/
というディレクトリを作成し、その配下へ昨日分のログファイルをgzip化し退避します。
そして、退避したログファイルをS3へバックアップします。
バックアップはs3cmdを利用しても良いですが
先日1.0のリリースが行われたawscliを利用します。
backup script
#!/bin/bash
export PATH=/root:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/bin
export AWS_CONFIG_FILE=/opt/aws/awscli.conf
PROG=`basename $0`
LOCKFILE="/tmp/${PROG}.lock"
TIMESTAMP="/tmp/${PROG}.log"
FROM=root
TO=MAILADDR
DATE=`date +%Y%m%d --date '1 day ago'`
BUCKET="backup-bucket"
BACKUP_LIST="nginx app"
### error
error(){
cat <<EOF | sendmail -t
From: $FROM
To: $TO
Subject: error
error: $1
EOF
log "ERROR: $1"
exit 1;
}
### log
log(){
echo "[`date '+%Y/%m/%d %k:%M:%S'`($$)] $1" >> $TIMESTAMP
}
log "*** start ${PROG} ***"
### to s3
for list in ${BACKUP_LIST}
do
[ -d "/var/log/backup/${list}/${DATE}" ] || error "not found backup dir(1)."
aws s3 cp --recursive /var/log/backup/${list}/${DATE}/ s3://${BUCKET}/${list}/${DATE}
for check_file in `ls /var/log/backup/${list}/${DATE}`
do
LOCALFILE_SIZE=`ls -la /var/log/backup/${list}/${DATE}/${check_file} | awk '{print $5}'`
S3FILE_SIZE=`aws s3 ls s3://${BUCKET}/${list}/${DATE}/ | grep ${check_file} | awk '{print $3}'`
[ "${LOCALFILE_SIZE}" = "${S3FILE_SIZE}" ] || error "not same ${check_file} filesize LOCAL and S3"
done
log "FINISHED BACKUP s3://${BUCKET}/${list}/${DATE}"
done
log "*** finish ${PROG} ***"
exit
aws s3 cp --recursive
によって昨日分のログファイルディレクトリを
再帰的にバックアップを行い、ファイルの整合性を担保する為に
ファイルサイズの比較を行っています。(可能であればMD5チェックを行いたい)
このように、深夜に昨日分のログファイルをS3にバックアップするようにしています。
以上、ご参考になれば幸いです。