36
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

logrotateした際にS3にアップロードする

Linuxの各種ログはlogrotateにより設定期間を過ぎるとパージされてしまいますが、証跡管理上、長期間保管したい要件はよくあるものと思います。
そんな要件には容量を気にせず保存できるオブジェクトストレージの活用が効率的かと思います。
そこでlogrotateによりローテーションされる際にS3にアップロードする方法をご紹介します。

動作確認済み環境:CentOS6,CentOS7
(※logrotateでのファイル名付与規則がdateext [-YYYYMMDD形式]であること)

手順

  1. AWS IAMにてアクセスキーを発行
  2. awscliのインストール
  3. S3バケットの作成
  4. シェルスクリプトの設置
  5. logrotate設定への埋め込み

IAMでのアクセスキー発行、awscliのインストール方法は他の記事を参照してください。
以下シェルスクリプトの記載例とlogrotate設定への記載方法を記します。

※注意
なお、通常はawscliインストール後に # aws configure としてアクセスキー等の初期設定を行いますが、cronからawscliを呼び出す場合には設定が反映されず、シェルスクリプト内にも記述する必要があります。

シェルスクリプト記載例

以下のようなスクリプトを作成します。
logrotateにてsharedscriptsが設定されている場合は対象ログが纏めて引数として渡されるため、1つ1つに分解する必要があります。
なお、アクセスキーが含まれるため、rootオーナーでパーミッションは600とすることを忘れずに。

#!/bin/sh
##   s3upload.sh tool $@
##

# initial parameter
export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxx"
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
LOG_FILE="/var/log/backup/logbackup.log"
BUCKET_NAME="s3://(バケット名)"

TOOL=$1
LOGS=${@:2}
YMDDATE=`date +%Y%m%d`
YEAR=`date +%Y`
DEST=$BUCKET_NAME/$YEAR/$YMDDATE/$TOOL
EXT=`echo "-"$YMDDATE`

# ログファイル準備
# フォルダが無い場合は作成
LOG_PATH=${LOG_FILE%/*}
if [ ! -d $LOG_PATH ]; then
     mkdir -p $LOG_PATH
fi
if [ ! -e $LOG_FILE ]; then
     touch $LOG_FILE
fi

echo "$0 START `date "+%Y/%m/%d %H:%M:%S"`">>$LOG_FILE

# 引数が無い場合は異常終了
if [ $# -eq 0 ]; then
    echo "引数が指定されていません" >> $LOG_FILE
    exit 1
else
    # 設定されている全てのログファイルを取得する
    for P in $LOGS; do
        for V in $P; do
            aws s3 cp $V$EXT $DEST/ >> $LOG_FILE 2>&1
        done
    done
fi
echo "$0 END `date "+%Y/%m/%d %H:%M:%S"`">>$LOG_FILE
echo >>$LOG_FILE
exit 0

以上の設定にて、s3://(バケット名)/YYYY/YYYYMMDD/ツール名/ファイル名
以下にローテーション直前のログが保存される。

logrotateへの設定埋め込み

/etc/logrotate.d/以下にある各種設定ファイル内の、postrotateセッションにて呼び出すようにする。
以下は/etc/logrotate.d/syslogに埋め込む例となります。

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        sh /usr/local/bin/s3upload.sh syslog $*
    endscript
}

※注意
postrotateセッション中でプロセスリスタートを実行している場合は、必ずその後に記載する必要があります。
olddir設定とは併用できません。
compress設定とは併用可能です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
36
Help us understand the problem. What are the problem?