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-файл является локальным.
Так что я сделал что-то другое, но идея та же:
- Установите сервис AmazonCloudWatchAgent на ручной запуск
- Запустите приведенный ниже пакетный файл при загрузке с помощью 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", если смогу заставить его работать.