CloudWatch エージェントから送るログのログストリーム名にインスタンスIDを入れる
CloudWatch エージェントから送るログのログストリーム名にインスタンスIDを入れる方法のメモです。
公式ドキュメントに記載があるのですが、結構深いところにあり、見つけるのに苦労しました。
公式の記載
CloudWatch エージェント設定ファイル: logs セクション の log_group_nameに記載があります。
名前の一部として、名前では変数として {instance_id}、{hostname}、{local_hostname}、{ip_address} を使用することができます。{hostname} は、EC2 メタデータからホスト名を取得し、{local_hostname} は、ネットワーク設定ファイルからホスト名を使用します。
log_group_nameのキーに{instance_id}を入れることで、ログストリーム名にインスタンスIDが入るようです。また、ほかにも{hostname}、{local_hostname}、{ip_address} が入れられるようですね。
logセクションのサンプル
公式ドキュメントにあるjsonを、「CustomizedLogGroup」というロググループ配下に「CustomizedLogStream-[インスタンスID]」がくるように修正してみます。
"logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "c:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\amazon-cloudwatch-agent.log", "log_group_name": "amazon-cloudwatch-agent.log", "log_stream_name": "my_log_stream_name_1", "timestamp_format": "%H: %M: %S%y%b%-d" }, { "file_path": "c:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\Logs\\test.log", "log_group_name": "test.log", "log_stream_name": "my_log_stream_name_2" } ] }, "windows_events": { "collect_list": [ { "event_name": "System", "event_levels": [ "INFORMATION", "ERROR" ], "log_group_name": "System", "log_stream_name": "System" }, { "event_name": "CustomizedName", "event_levels": [ "INFORMATION", "ERROR" ], "log_group_name": "CustomizedLogGroup", "log_stream_name": "CustomizedLogStream-{instance_id}" } ] } }, "log_stream_name": "my_log_stream_name" }
注意点
metrics セクションだと、${aws:InstanceId}でキーにインスタンスIDを入れることができますが、logsセクションではスキーマが異なるようです。ちなみに、logsセクションで${aws:InstanceId}を使うと怒られます。
#参考: これは公式ドキュメントのmetrics セクションのサンプル "append_dimensions": { "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}", "AutoScalingGroupName": "${aws:AutoScalingGroupName}" },
CloudWatch logsエージェントの名残とかなんでしょうか...。同じjson内でスキーマが統一されていないのはちょっと難しいですね。