CloudWatchAgentのログ送信にフィルタ機能が追加されたのでやってみた

2022.03.13

エルデンリングでは信仰ビルドが好きです。AWS事業本部コンサルティング部の後藤です。

2月25日のアップデートでCloudWatchAgentがCloudWatchlogsにログを送信するときにフィルタ設定が可能になっていたので試してみました。OSログやミドルウェアログをCloudWatchLogsに送信して色々やりたいけど、CloudWatchLogsはログの取り込みに費用がかさむため、全てのログをCloudWatchLogsに送信するのは抵抗があったあなたにピッタリな機能追加かもしれません。

やっていきましょう!

CloudWatchAgent最新版取得

最新機能を使用するため、最新バージョンのCloudWatchAgentが必要になるためS3から取得してインストールしましょう。

今回はEC2、AmazonLinux2で試しています。

# wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
# rpm -ivh amazon-cloudwatch-agent.rpm
# cat /opt/aws/amazon-cloudwatch-agent/bin/CWAGENT_VERSION
1.247350.0b251780

CloudWatchAgent設定

以下のようなconfig.jsonを用意しました。

{
        "agent": {
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/home/ec2-user/test.log",
                                                "log_group_name": "test.log",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": 30,
                                                "filters": [
                                                        {
                                                                "type": "include",
                                                                "expression": "hoge"
                                                        }
                                                ]
                                        }
                                ]
                        }
                }
        }
}

Filters設定要素について

今回追加された機能はfiltersの部分になります。filtersでは以下の要素を設定します。

  • type
    • include : 一致するログエントリをCloudWatchLogsに送信。
    • exclude : 一致するログエントリをCloudWatchLogsに送信しない。
  • expression
    • 文字列を記載、正規表現の使用が可能。

上記config.jsonでは、hogeが含まれたログのみCloudWatchLogsに送信する設定となります。試してみましょう。

$ echo hoge >> test.log
$ echo hogehoge >> test.log
$ echo fuga >> test.log

適当なログを指定したファイルに流して、CloudWatchLogsのロググループを見に行きます。

狙い通り、hogeが含まれているログのみCloudWatchLogsに送信されている事が確認できました。

Filters機能の処理について

Filtersが複数設定されている場合、CloudWatchAgentは上から順序に処理を行うようです。以下のconfig.jsonを例に確認してみましょう。

{
        "agent": {
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/home/ec2-user/test2.log",
                                                "log_group_name": "test2.log",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": 30,
                                                "filters": [
                                                        {
                                                                "type": "exclude",
                                                                "expression": "hoge"
                                                        },
                                                        {
                                                                "type": "include",
                                                                "expression": "h(uga|oge)"
                                                        }
                                                ]
                                        }
                                ]
                        }
                }
        }
}

上記config.jsonでは、hogeが含まれるログを除外しつつ、hugahogeが含まれるログをCloudWatchLogsに送信する設定になっています。

Filters機能が上から順序に処理が行われるのであれば、hogeは含まれず、hugaのみ送信されます。試してみましょう。

$ echo hoge >> test2.log
$ echo hogehoge >> test2.log
$ echo huga >> test2.log

適当なログを指定したファイルに流して、CloudWatchLogsのロググループを見に行きます。

hugaのみロググループに送信されている事が確認できました。

まとめ

CloudWatchAgentに追加されたログのFilters機能を試してみました。正規表現が使用出来るため色々やりようがありそうですね。CloudWatchlogsはログ取り込みに結構な費用が掛かりますので、上手く使えば少し費用を抑える事が出来るかもしれません。是非試してみてください!