Linux
AWS
S3
aws-cli

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

More than 1 year has passed since last update.

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