Linux
AWS
script
logrotate
CloudWatch-Logs

EC2(Linux)の操作ログ(Scriptコマンドの結果)をCloudwatch logsに送りたい

EC2(Linux)の操作ログをクラウドに保存できないかなぁと思って考えたときのメモです。
AWS Logs エージェントは導入済みの環境を想定してます。

操作ログ出力先作成

# mkdir /var/log/script
# chmod 777 /var/log/script

操作ログ出力スクリプト作成

# touch /etc/profile.d/scriptlog.sh
# chmod 644 /etc/profile.d/scriptlog.sh
# vi /etc/profile.d/scriptlog.sh
-------
#!/bin/bash
#===================================
# Script Name   : scriptlog.sh
# Description   : This script outputs the operation log for each user to the specified directory.
#===================================

LOGDIR=/var/log/script
LOGFILE=`whoami`.log

P_PROC=`ps -ef|grep $PPID|grep bash|awk '{print $8}'`

if [ "$P_PROC" = -bash ];then
  #/bin/script -faq ${LOGFILE}
  # タイムスタンプを追加
  /bin/script -fq >(awk '{print strftime("%F %T "), $0} {fflush() }'>> ${LOGDIR}/${LOGFILE})
  exit
fi
-------

ログインしなおしてログが出てるか確認

# id
uid=0(root) gid=0(root) groups=0(root)
# ls -la /var/log/script/
-rw-r--r-- 1 root root  3 Mar 15 03:16 root.log

logrotate設定

touch /etc/logrotate.d/scriptlog
vi /etc/logrotate.d/scriptlog
-------
/var/log/script/*.log
{
    daily                       # 日次ローテーション
    rotate 7                    # 世代数は7
    missingok                   # ファイルがなくてもエラーとしない
    notifempty                  # ファイルが空なら実行しない
    copytruncate                # コピー後に元ファイルの中身を削除する
    dateext                     # ファイル末尾の日付フォーマット
    dateformat .%Y%m%d          # 日付は.%Y%m%dの形式にする
    compress                    # ファイルを圧縮する
    su root root                # root権限で実行する
}
-------

logrotateおためし

dry-run
# logrotate -dv /etc/logrotate.d/scriptlog
強制実行
# logrotate -f /etc/logrotate.d/scriptlog
# ls -la /var/log/script
-rw-r--r-- 1 root root  3 Mar 15 03:16 root.log
-rw------- 1 root root 20 Mar 14 16:19 root.20180315.gz

awslogs設定

# vi /var/awslogs/etc/awslogs.conf
-------
[general]
state_file = /var/awslogs/state/agent-state

[/var/log/script/root.log]    #root用の設定
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/script/root.log
initial_position = start_of_file
log_group_name = /product/var/log/script/root.log
buffer_duration = 5000
log_stream_name = {hostname}

[/var/log/script/ec2-user.log]    #ec2-user用の設定
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/script/ec2-user.log
initial_position = start_of_file
log_group_name = /product/var/log/script/ec2-user.log
buffer_duration = 5000
log_stream_name = {hostname}
-------

awslogs 再起動

# service awslogs restart

こんな感じでクラウドに残せるんじゃないかなーというメモになります。
テストした結果、日付がないとAWS Logs エージェントでうまく送れなかったのでタイムスタンプを付加できるように変えました。