EC2ホストのログをCloudWatch Logsに集約

AWS

概要

  • /var/log/messages などのOSのログ、/var/log/httpd/access.log などのサーバ・ソフトウェアのログをCloudWatch Logsに集約します。設定はかんたんです。
  • EC2インスタンスやContainerなどの計算資源は使い捨てですが、ログだけは監査などのために保管しておきたいため一通り設定しました。

設定

ssm-agentを使っていない場合は、ssm-agentを設定しておいたほうが良いです。(AWS Access keyでの認証もできますが、面倒だし少しセキュアではないので)

Amazon Linux 2の場合

設定は楽です。こちらの公式ドキュメントを参考にインストールすればOKです。

% sudo yum install -y awslogs

/etc/awslogs/awscli.conf を変更します。デフォルトだとusになっているので、ap-northeast-1などに書き換えます。

つぎに、/etc/awslogs/awslogs.conf を開いて以下の設定を末尾の方に記述します。

[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages


[/var/log/secure]
datetime_format = %b %d %H:%M:%S
file = /var/log/secure
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/secure

datetime_formatは、読み込むログファイル内で、日付がどのようなフォーマットで表記されているかです。これをもとにtimestampを生成した上で、CloudWatchに送信されます。

最後に、systemctlでサービスを有効にします。

% sudo systemctl start awslogsd
% sudo systemctl enable awslogsd.service

Ubuntuの場合

Amazon Linux 2のようにパッケージは用意されていません。Pythonのセットアップスクリプトを実行することによって、/var/awslogs に必要ファイルが展開されます。

セットアップ方法はこちらが一番綺麗に整理されているので参考にするのが良いです。

途中で、regionのパラメータを設定する必要があるのでそちらは適宜置き換えます。以下は東京の例。

$ sudo python ./awslogs-agent-setup.py --region ap-northeast-1

セットアップ中に、AWS access key IDとAWS secret access keyが聞かれますが、ssm-agentを使っているならば空白で飛ばしてOKです。

インストールが完了すると、設定ファイルは/var/awslogs/etc/awslogs.confに置かれているので開きます。

Ubuntu/Debianの場合は以下のような設定を追記します。

[/var/log/syslog]
datetime_format = %b %d %H:%M:%S
file = /var/log/syslog
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/syslog

[/var/log/auth.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/auth.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/auth.log

[/var/log/kern.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/kern.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/kern.log

[/var/log/dpkg.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/dpkg.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/dpkg.log

最後にリスタートを忘れずに。

%  sudo service awslogs restart

設定の確認

こんな感じでインスタンスIDごとにログストリームができます。

Logs Insightで横断的に検索できます。使い方はこちらの記事を参照。

このようにCloudWatch Logsに入ってしまえば、メッセージや流量をトリガーにSNS経由でアラートを発行できるようになります。

とりあえずシステムのログはCloudWatchに入れてしまうのが良いと思います。

まとめ

  • システム系のログは流量が少ないので何も考えずにCloudWatch Logsに入れてしまって良いと思います。
  • アプリケーション系は要望によって、要設計。

コメント