こんにちは、技術1課の多田です。
先週の連休中に大阪に旅行してきました。 大阪は食べ物も観光地も豊富で楽しく過ごせました。また、機会を改めて行きたいものです。
さて、今回の記事は、CloudWatch Logsのエージェント『awslogs』の使用時の注意点として確認を行ったOSは、『Amazon Linux バージョン2015.09.2』になります。 その他のOSの対応状況については、こちらの「CloudWatch Logsエージェントの前提条件」をご覧下さい。
以下、目次です。
- awslogsとは
- logrotateについて
- awslogsのデフォルト設定
- まとめ
awslogsとは
awslogsとは、CloudWatch Logsのエージェントになります。 awslogsは、EC2の各種ログファイルをCloudWatch Logsにて統合監視するために使用します。 セットアップの詳細は、こちらをご覧ください
logrotateについて
本題に入る前にlogrotateについても記します。 logrotateは、放置しておくと肥大化してしまう各種ログファイルに対して何世代までローテーションするかを設定してログディレクトリの逼迫を防ぐために使います。 awslogsもログローテーションするのですが、対象の設定ファイルは「/etc/logrotate.d/awslogs」になります。
awslogsのデフォルト設定
「/etc/logrotate.d/awslogs」のデフォルト設定は下記の通りです。
[root@ip-10-xx-xx-xx ec2-user]# cat /etc/logrotate.d/awslogs # Version: 1.1.2-rpm /var/log/awslogs.log { missingok notifempty size 100M create 0600 root root delaycompress compress rotate 4 postrotate service awslogs condrestart endscript }
尚、各種パラメーターの役割については以下をご覧下さい。
パラメーター名 | 役割 |
missingok |
指定のログファイルが存在しなくてもエラーを出さずに処理実行。 |
notifempty |
元のログファイルが空ならばローテーションしない。 |
size num[K/M] |
ログサイズがnumバイトを超えていればローテーションを行う。 (キロ/メガ)の指定も可能。 |
create [mode] [owner] [group] |
(下記のpostrotateした後)、代わりに空の新規ログファイルを作る。 [mode]ではパーミッション指定できる。 |
delaycompress |
圧縮処理をその次のローテーションの時まで遅らせる。 compressも指定しないと機能しない。 |
compress |
ローテーションした後の旧ファイルに圧縮をかける。 |
rotate num |
世代ローテーションのステップ数。 例えば、numが4でログファイル名がhoge.logの場合、ローテーション後、 ファイル名がhoge.log.1 → hoge.log.2の順番に数字がついてローテーションされ、 hoge.log.4までは作成されるが、それ以降は破棄される。 |
postrotate script endscript |
ローテーションが行われた後に実行するスクリプト。 awslogsでは、「service awslogs condrestart」で、サービスの再起動が実行されます。 |
この設定の中で、「create 0600 root root」という一文があります。 これは、ログローテーションが実行されると、「/var/log/awslogs.log」のパーミッションが「0600」へと変更されることを意味します。
この状態では、当然ながらroot以外の他のユーザーからはログファイルを読み取ることができません。 このような状態ですと、例えばログファイルの状態を監視しようとしても監視できず、障害発生時にもアラートが発生しない等の状況も発生してしまいます。 そのため、下記のようにパラメーターを変更することでログファイルのパーミッションを変更できます。 尚、パラメーター変更前のログファイルのパーミッションは、次の状態だったと仮定します。
【パラメーター変更前】
# ls -l /var/log/awslogs.log* -rw------- 1 root root 1620 3月 22 05:17 /var/log/awslogs.log
【パラメーター変更】
# Version: 1.1.2-rpm /var/log/awslogs.log { missingok notifempty size 100M create 0644 root root ←この行の「0600」の値を「0644」に変更します。 delaycompress compress rotate 4 postrotate service awslogs condrestart endscript }
上記の変更後ログローテーションが実行されると、ログファイルのパーミッションが「0644」になります。 上記の設定ですと、ファイルが100MBを超えるとログローテーションが発生しますが、即座に有効化できているかを確認したい場合は次のコマンドを実行します。
[root@ip-10-xx-xx-xx ec2-user]# /usr/sbin/logrotate -f /etc/logrotate.d/awslogs
上記コマンドでログローテーションが強制的に実行されますので、「/var/log/awslogs.log」のパーミッションを確認します。 【パラメーター変更後】
# ls -l /var/log/awslogs.log* -rw-r--r-- 1 root root 1119 3月 22 05:26 /var/log/awslogs.log -rw------- 1 root root 1620 3月 22 05:17 /var/log/awslogs.log.1
「/var/log/awslogs.log」のパーミッションがパラメーター変更前後で変化していることが確認できました。
まとめ
今回は、awslogsの使用時の注意点として、ログローテーションに焦点を当てた内容になります。 awslogsのサービス起動時のログファイルは、パーミッションが「0644」になっているのですが、そのままログを肥大化させ続けてしまうと、ある日突然ログファイルを読み取れないといった事態になりかねないので、運用時は注意が必要です。