每个实例的云观察代理流



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

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

来自文档:

log_stream_name – 可选。指定在 CloudWatch Logs 中用作日志流名称的内容。作为名称的一部分,可以使用 {instance_id}、{主机名}、{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

您甚至可以将其粘贴在用户数据脚本中。 代理可能还需要重新启动。

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

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

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

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

SET CLOUD_WATCH="C:Program FilesAmazonAmazonCloudWatchAgent"
SET CLOUD_WATCH_DATA=C:ProgramDataAmazonAmazonCloudWatchAgent
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"。

最新更新