28
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

28
Last updated at Posted at 2016-06-04

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

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

手順

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

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

準備

当該S3バケットに書き込みできるポリシーをアタッチしたIAMユーザーを作成、アクセスキーを発行する

AWS CLIをインストールし、事前にアクセスキーを登録しておく

# aws configure --profile s3upload

シェルスクリプト記載例

以下のようなスクリプトを作成します。
logrotateにてsharedscriptsが設定されている場合は対象ログが纏めて引数として渡されるため、1つ1つに分解する必要があります。

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

# initial parameter
export AWS_CONFIG_FILE="/root/.aws/config"
LOG_FILE="/var/log/backup/logbackup.log"
HOSTNAME_VAL="${HOSTNAME_OVERRIDE:-$(hostname -s)}"
BUCKET_NAME="s3://(バケット名)/${HOSTNAME_VAL}"

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?