【问题标题】:CloudWatch agent per-instance streamsCloudWatch 代理每个实例流
【发布时间】:2018-05-01 19:04:44
【问题描述】:

我在 Windows 实例上使用 CloudWatch 代理(不是 CloudWatch Logs 代理)。配置文件 amazon-cloudwatch-agent.toml 包含一个硬编码的实例 ID。如果我为自动扩展组创建 AMI,则启动的每个实例都将相同的陈旧实例 ID 用于日志流。它们都写入同一个流。

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

【问题讨论】:

    标签: amazon-web-services amazon-cloudwatch


    【解决方案1】:

    来自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 生成仅在安装时完成。也许您可以使用以下命令强制重新生成 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 脚本中。代理可能也需要重新启动。

    【讨论】:

    • 问题是 JSON 可以接受这些变量,并且默认使用 {instance_id}。但随后您必须将 JSON 转换为 TOML 文件,并对实例 ID 进行硬编码。实际的 CloudWatch 代理读取 TOML 文件。我认为需要一种方法来告诉实例在启动时生成 TOML 文件。我真的希望代理读取 JSON 并对其进行解释,这对我来说更有意义。
    • 如何启动 cloudwatch 代理?也许将其添加到您的用户数据中:sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:configuration-file-path -s
    • 这是一个 Windows 实例,CloudWatch 代理将自身注册为系统服务,该服务在启动时启动。但是您可能对通过用户数据脚本运行 fetch-config 是正确的。我不知道这是对系统服务的补充还是代替。与系统服务直接读取 JSON 相比,这实在是太复杂了。或者,如果默认值是“使用我的实例 ID”而不是“使用过时的实例 ID”。
    • 您是否使用 SSM 安装代理?如果您查看 amazon-cloudwatch-agent-ctl.ps1,有一行调用 config-translator.exe 进行 json 到 toml 的转换,您可能必须强制它运行然后重新启动 CWAgent 服务
    【解决方案2】:

    我相信从您的用户数据执行“amazon-cloudwatch-agent-ctl start”可能是他们希望您执行的操作。他们不会在任何地方告诉你,不是我发现的,而是应该创建 TOML(如果你确保它不存在)然后启动/重新启动服务。但是“开始”有一个下载部分,鉴于我的 JSON 文件是本地的,我不确定那里有什么。

    所以我做了一些不同但相同的想法:

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

    以下批处理文件将创建 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 代理的日志和我自己的日志。所以每个实例都是从新开始的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2021-01-04
      • 2021-07-02
      • 2020-09-15
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多