概要
/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:%Sfile = /var/log/messagesbuffer_duration = 5000log_stream_name = {instance_id}initial_position = start_of_filelog_group_name = /var/log/messages
[/var/log/secure]datetime_format = %b %d %H:%M:%Sfile = /var/log/securebuffer_duration = 5000log_stream_name = {instance_id}initial_position = start_of_filelog_group_name = /var/log/securedatetime_formatは、読み込むログファイル内で、日付がどのようなフォーマットで表記されているかです。これをもとにtimestampを生成した上で、CloudWatchに送信されます。
最後に、systemctlでサービスを有効にします。
% sudo systemctl start awslogsd% sudo systemctl enable awslogsd.serviceUbuntuの場合
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:%Sfile = /var/log/syslogbuffer_duration = 5000log_stream_name = {instance_id}initial_position = start_of_filelog_group_name = /var/log/syslog
[/var/log/auth.log]datetime_format = %b %d %H:%M:%Sfile = /var/log/auth.logbuffer_duration = 5000log_stream_name = {instance_id}initial_position = start_of_filelog_group_name = /var/log/auth.log
[/var/log/kern.log]datetime_format = %b %d %H:%M:%Sfile = /var/log/kern.logbuffer_duration = 5000log_stream_name = {instance_id}initial_position = start_of_filelog_group_name = /var/log/kern.log
[/var/log/dpkg.log]datetime_format = %Y-%m-%d %H:%M:%Sfile = /var/log/dpkg.logbuffer_duration = 5000log_stream_name = {instance_id}initial_position = start_of_filelog_group_name = /var/log/dpkg.log最後にリスタートを忘れずに。
% sudo service awslogs restart設定の確認
こんな感じでインスタンスIDごとにログストリームができます。

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

このようにCloudWatch Logsに入ってしまえば、メッセージや流量をトリガーにSNS経由でアラートを発行できるようになります。
とりあえずシステムのログはCloudWatchに入れてしまうのが良いと思います。
まとめ
- システム系のログは流量が少ないので何も考えずにCloudWatch Logsに入れてしまって良いと思います。
- アプリケーション系は要望によって、要設計。