CloudWatchAgentでロググループの保持期間の設定が可能になったのでやってみた

2022.03.13

お久しぶりです。AWS事業本部コンサルティングの後藤です。去年の10月頃から休職しており、久々のブログ投稿になります。

2月25日にCloudWatchAgentのアップデートでログの保持期間を設定できるようになったようなので、試してみました。 今までCloudWatchAgentでOS内のログをCloudWatchLogsに収集して何かする時、毎回CloudWatchLogsのロググループに対してログの保持期間を設定する必要がありましたが、今回のアップデートでその手間が無くなるという地味ですが自動化等をしている人には嬉しい機能になります。

では、やっていきましょう!

CloudWatchAgent取得

今回はEC2、AmazonLinux2を使用して試しています。

最新のアップデート機能を使用するため、S3から最新版のCWAgentを取得します。

# 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設定

ウィザードを使用してログ収集するだけのConfigを作成します。

するともう変化を感じました。ここでもうログ保持期間を指定できるようになってるじゃないですかー!ステキー

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
~ 省略 ~

Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
1
Log file path:
/home/ec2-user/test.log
Log group name:
default choice: [test.log]

Log stream name:
default choice: [{instance_id}]

Log Group Retention in days
1. -1
2. 1
3. 3
4. 5
5. 7
6. 14
7. 30
8. 60
9. 90
10. 120
11. 150
12. 180
13. 365
14. 400
15. 545
16. 731
17. 1827
18. 3653
default choice: [1]:

Log Group Retention in Day」でログの保持期間を設定出来ます。デフォルトは「-1」、つまり無制限で保持するような設定になっているようです。今回は試しに30日期間と無制限の2つを設定してみました。

下記が出来上がった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
                                        },
                                        {
                                                "file_path": "/home/ec2-user/test02.log",
                                                "log_group_name": "test02.log",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": -1
                                        }
                                ]
                        }
                }
        }
}

config.jsonが出来たらこれを読み込ませて実行します。私は毎回config.jsonを読み込ませるコマンドを忘れます。

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
sudo systemctl restart amazon-cloudwatch-agent.service

IAMポリシーの設定追加

さあ後はログを流して収集して保持期間を確認するだけ!と思ったら、あれ!?無制限のままじゃないですかー!

なんで?とドキュメントを読んでみたところ、しっかり書いてありました。 CloudWatchAgentでログ保持期間を設定する場合、IAMポリシーで「logs:PutRetentionPolicy」の権限を与える必要があるそうです。

EC2には事前に「CloudWatchAgentServerPolicy」のIAMポリシーを設定したIAMロールを付与していたのですが、こちらには「logs:PutRetentionPolicy」が設定されておらず、ログ保持期間が設定出来なかったようです。

追加で以下のIAMポリシーを作成してIAMロールに付与しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutRetentionPolicy"
            ],
            "Resource": "*"
        }
    ]
}

ログ収集して保持期間を確認

権限も整ったので収集対象のログファイルにログを流してみます。

$ echo test dayo >> /home/ec2-user/test.log
$ echo test dayo >> /home/ec2-user/test02.log

ログを流し込んだので、CloudWatchLogsのロググループを確認しにいきましょう。

ロググループの作成と保持期間が設定されている事を確認出来ました。

まとめ

今回はCloudWatchAgentでCloudWatchLogsにログを送信する際に保持期間を設定出来るようになったので試してみました。これでCloudWatchLogsに保持期間を設定しにいく手間が省けて自動化が捗りますね。既にウィザードで設定出来るようになっていて簡単に試せますので、是非みなさん試してみてください!