LoginSignup
27
37

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-04

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設定とは併用可能です。

27
37
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
27
37