たそらぼ

日頃思ったこととかメモとか。

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"
}

ユースケース

Auto Scalingグループごとに、インスタンスのログを管理するようなケースに使えそうです。

f:id:tasotasoso:20191013130340p:plain
インスタンスIDごとにログストリームを管理したい

注意点

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内でスキーマが統一されていないのはちょっと難しいですね。