每个实例流的CloudWatch代理

时间:2018-05-01 19:04:44

标签: amazon-web-services amazon-cloudwatch

我在Windows实例上使用CloudWatch Agent(而不是CloudWatch Logs Agent)。配置文件amazon-cloudwatch-agent.toml包括硬编码的实例ID。如果我为自动缩放组创建AMI,则每个启动的实例都会使用相同的陈旧实例ID作为日志流。他们都写到同一个流。

我希望每个实例都使用自己的instance_id写入流。这似乎是你几乎总想要的。这怎么可能?

2 个答案:

答案 0 :(得分:2)

来自documentation

  

log_stream_name - 可选。指定在CloudWatch Logs中用作日志流名称的内容。作为名称的一部分,您可以使用{instance_id},{hostname},{local_hostname}和{ip_address}作为名称中的变量。 {hostname}从EC2元数据中检索主机名,而{local_hostname}使用网络配置文件中的主机名。

     

如果省略此字段,则使用默认的{instance_id}。如果日志流尚不存在,则会自动创建。

所以最简单的方法就是不要定义log_stream_name。

很奇怪,代理使用.toml文件作为其配置而不是json文件,而toml生成仅在安装时完成。也许你可以使用:

强制进行重建
$/opt/aws/amazon-cloudwatch-agent/bin/config-translator \
  --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
  --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml \
  --mode ec2 \
  --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml

您甚至可以将其粘贴在userdata脚本中。代理可能也需要重启。

答案 1 :(得分:1)

我相信从你的用户数据做“amazon-cloudwatch-agent-ctl start”可能就是他们想要你做的。他们不会告诉你任何地方,不是我发现的,但是应该创建TOML(如果你确定它还不存在),然后启动/重启服务。但是“start”有一个下载部分,我不知道在那里我的JSON文件是本地的。

所以我做了一些不同的事情,但同样的想法:

  1. 将AmazonCloudWatchAgent服务设置为手动启动
  2. 使用“任务计划程序”
  3. 在启动时运行以下批处理文件

    下面的批处理文件将创建TOML然后启动服务:

    SET CLOUD_WATCH="C:\Program Files\Amazon\AmazonCloudWatchAgent"
    SET CLOUD_WATCH_DATA=C:\ProgramData\Amazon\AmazonCloudWatchAgent
    
    SET JSON=%CLOUD_WATCH_DATA%\amazon-cloudwatch-agent.json
    SET TOML=%CLOUD_WATCH_DATA%\amazon-cloudwatch-agent.toml
    SET CONFIG=%CLOUD_WATCH_DATA%\common-config.toml
    
    SET TRANSLATOR=%CLOUD_WATCH%\config-translator.exe
    
    rem Translate JSON into TOML
    %TRANSLATOR% --input %JSON% --output %TOML% --mode ec2 --config %CONFIG%
    
    rem Start the service
    sc start AmazonCloudWatchAgent
    

    这似乎对我有用。此外,我确保我的AMI有空的日志文件,包括CloudWatch Agent的日志和我自己的日志。所以每个实例都会重新开始。

    但是如果我可以让它工作的话,我可能会在某些时候切换到用户数据“amazon-cloudwatch-agent-ctl start”。