zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

【AWS】(AmazonLinux・CentOS)nginxのログをデイリーでローテーションしつつs3に上げる

いろんなところから切貼。主に以下の本p181。
gihyo.jp

■AmazonLinux(EC2)で、サーバにS3アクセス可能ロールが付与されている場合

※以下はS3への十分なアクセス権ロールが付与されていることが前提。FullAccessとか・・・


/etc/logrotate.d/nginx を以下の様に。

/var/log/nginx/*.log {
    daily
    rotate 24
    compress
    missingok
    notifempty
    sharedscrits
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript

    lastaction
        HOSTNAME=`hostname`
        filename=$1
        today=`date +"%Y%m%d"`
        echo "uploading ${filename}" > /var/log/logrotate.nginx
        for f in `ls -l ${filename}`; do
            upload_file="${f}-${today}.gz"
            aws s3 cp ${upload_file} s3://hogehoge-logs/${HOSTNAME}/`basename ${upload_file}` >> /var/log/logrotate.nginx 2>&1
        done
    endscript

}

■AmazonLinuxじゃない(EC2じゃない)CentOSでもやってみた

s3アクセスを許可したIAMアカウントを作成し、アクセスキー等を取得しておく

(手順省略)

AWS Cliをインストールする
yum install -y python-setuptools
easy_install pip
pip install awscli

# 確認
aws --version

# 作業ユーザのタブ補完有効化
vi ~/.bashrc

末尾に以下を追記

# for AWS Cli
complete -C /usr/bin/aws_completer aws

aws s3 [TAB]などで補完が効きます。

定義ファイル(credentials)の作成

aws configure
AWS Access Key ID [None]: <アクセスキー>
AWS Secret Access Key [None]: <シークレットアクセスキー>
Default region name [None]:<リージョン>
Default output format [None]:

→~/.aws/credentialsに上記内容が保存される。

# s3コマンド叩いてみる
aws s3 ls

# nginx のログローテーションに追記
事前にS3バケット:hogehoge-logs を作成しておく

vi /etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily
    rotate 24
    compress
    missingok
    notifempty
    sharedscrits
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript

    lastaction
        export AWS_SHARED_CREDENTIALS_FILE=/root/.aws/credentials
        HOSTNAME=`hostname`
        filename=$1
        today=`date +"%Y%m%d"`
        echo "uploading ${filename}" > /var/log/logrotate.nginx
        for f in `ls -l ${filename}`; do
            upload_file="${f}-${today}.gz"
            aws s3 cp ${upload_file} s3://hogehoge-logs/${HOSTNAME}/`basename ${upload_file}` >> /var/log/logrotate.nginx 2>&1
        done
    endscript

}
上記との違いについて

> export AWS_SHARED_CREDENTIALS_FILE=/root/.aws/credentials
を追記し、credentialsの場所を明示的に指定してやっています。

S3からログ取得メモ

上記の様にしてS3に保存したログをまとめて取得したい

# 一覧確認
aws s3 ls s3://hogehoge-logs/server01/2017/

server01_log.20170201.tar.gz
server01_log.20170202.tar.gz
…
server01_log.20170228.tar.gz


# ログをまとめて取得

aws s3 cp s3://hogehoge-logs/server01/2017/ . --recursive --exclude "*" --include "*_log.201702*"

# ワイルドカードはそのまま使えない。このようにしてexcludeでいったん全部対象外とした後、includeで対象を指定する
# 参照:http://dev.classmethod.jp/cloud/aws/s3-logfile-copy-by-awscli/

以上。