LoginSignup
4
6

More than 5 years have passed since last update.

ログファイルをS3に定時バックアップする

Last updated at Posted at 2013-09-19

ログファイルを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にバックアップするようにしています。

以上、ご参考になれば幸いです。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6