CloudWatch агент для каждого экземпляра потоков

Я использую Агент CloudWatch (не Агент CloudWatch Logs) на экземпляре Windows. Файл конфигурации amazon-cloudwatch-agent.toml содержит жестко закодированный идентификатор экземпляра. Если я создаю AMI для группы автоматического масштабирования, каждый запущенный экземпляр использует один и тот же устаревший идентификатор экземпляра для потока журнала. Все они пишут в один поток.

Я хотел бы, чтобы каждый экземпляр записывал в поток со своим собственным instance_id. Что похоже на то, что вы почти всегда хотели бы. Как это возможно?

2 ответа

Решение

Из документации:

log_stream_name - необязательно. Указывает, что использовать в качестве имени потока журнала в журналах CloudWatch. В качестве части имени вы можете использовать {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. агенту может потребоваться перезагрузка.

Я полагаю, что "запуск amazon-cloudwatch-agent-ctl" из ваших пользовательских данных, вероятно, то, что они хотят, чтобы вы делали. Они нигде не сообщают вам об этом, не то, что я нашел, но это должно создать TOML (если вы убедитесь, что он еще не существует), а затем запустить / перезапустить службу. Но у "начала" есть часть загрузки, и я не был уверен, что там, учитывая, что мой JSON-файл является локальным.

Так что я сделал что-то другое, но идея та же:

  1. Установите сервис AmazonCloudWatchAgent на ручной запуск
  2. Запустите приведенный ниже пакетный файл при загрузке с помощью Task Scheduler

Приведенный ниже пакетный файл создаст 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", если смогу заставить его работать.

Другие вопросы по тегам