AWS CloudWatch Logs – сервис для сбора и мониторинга логов с EC2, CloudTrail и Route53.
На сегодняшний день сбор логов можно выполнять двумя способами:
- старый CloudWatch Logs agent: занимается сбором логов
- новый, Unified CloudWatch Agent: объединяет в себе SSM агент и CloudWatch Logs agent, умеет собирать как метрики инстансов, так и логи. См. Amazon CloudWatch introduces a new CloudWatch Agent with AWS Systems Manager Integration for Unified Metrics and Logs Collection, Getting Started with CloudWatch Logs, New – Amazon CloudWatch Agent with AWS Systems Manager Integration – Unified Metrics & Log Collection for Linux & Windows, Send Logs to CloudWatch Logs (SSM Agent).
Unified CloudWatch Agent напоминает systemd
: попытка впихнуть невпихуемое в один сервис, такой себе “мастер на все руки”. Но лично мне очень импонирует философия UNIX, и в частности концепт Do One Thing and Do It Well.
Ниже рассмотрим пример сбора логов с NGINX на AWS EC2, используя “старый” CloudWatch Logs agent.
Документация – тут>>>.
Содержание
IAM роль
Сначала требуется добавить IAM роль с правами на запись в CloudWatch, которую далее подключим к EC2.
Переходим в IAM > Roles, жмём Create Role, оставляем значение Allows AWS services to perform actions on your behalf, выбираем EC2, жмём Next: Permissions:
Добавляем политику CloudWatchAgentServerPolicy:
Сохраняем роль:
Подключаем политику к инстансу с NGINX, переходим в Instances, правой кнопкой – Instance Settings > Attach/Replace IAM roles:
Выбираем политику, жмём Apply, готово.
Установка агента
Устанавливаем на Ubuntu 16.04:
[simterm]
root@ip-172-31-32-24:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.4 LTS
[/simterm]
Шаманим с Python – обновляем pip:
[simterm]
root@ip-172-31-32-24:~# pip install –upgrade pip
[/simterm]
Устанавливаем virtualenv
:
[simterm]
root@ip-172-31-32-24:~# pip3 install virtualenv
[/simterm]
Загружаем инсталятор:
[simterm]
root@ip-172-31-32-24:~# curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
[/simterm]
Запускаем установку и первоначальную настройку:
[simterm]
root@ip-172-31-32-24:~# python3 ./awslogs-agent-setup.py --region eu-west-1 Launching interactive setup of CloudWatch Logs agent ... Step 1 of 5: Installing pip ...libyaml-dev does not exist in system DONE Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE Step 3 of 5: Configuring AWS CLI ... AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [eu-west-1]: Default output format [None]: Step 4 of 5: Configuring the CloudWatch Logs Agent ... Path of log file to upload [/var/log/syslog]: Destination Log Group name [/var/log/syslog]: Choose Log Stream name: 1. Use EC2 instance id. 2. Use hostname. 3. Custom. Enter choice [1]: 3 Enter Log Stream name [None]: nginx_cf_logs_example Choose Log Event timestamp format: 1. %b %d %H:%M:%S (Dec 31 23:59:59) 2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36) 3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54) 4. Custom Enter choice [1]: 1 Choose initial position of upload: 1. From start of file. 2. From end of file. Enter choice [1]: 1 More log files to configure? [Y]: n Step 5 of 5: Setting up agent as a daemon ...DONE ------------------------------------------------------ - Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf - You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=eu-west-1#logs: - You can use 'sudo service awslogs start|stop|status|restart' to control the daemon. - To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log - You can rerun interactive setup using 'sudo python ./awslogs-agent-setup.py --region eu-west-1 --only-generate-config' ------------------------------------------------------
[/simterm]
Тут:
- AWS Access Key ID [None]: т.к. используем IAM роль, то не укзаываем ничего
- AWS Secret Access Key [None]: т.к. используем IAM роль, то не укзаываем ничего
- Default output format [None]: пропускаем
Единственный момент тут, на котором есть смысл остановиться немного детальнее – это формат даты-времени – Choose Log Event timestamp format.
Проверяем дату в syslog
:
[simterm]
root@ip-172-31-32-24:~# tail -1 /var/log/syslog
May 19 13:14:20 ip-172-31-32-24 amazon-ssm-agent[30899]: #011status code: 400, request id: 35ddcf06-e9a9-4b31-a887-f6f32e5eba2
[/simterm]
May 19 13:14:20 – первый вариант, который предлагает инсталятор, как раз для syslog
– %b %d %H:%M:%S (Dec 31 23:59:59)
.
Другие примеры см. в How to: Set-up and configure AWS CloudWatch LogsChoose Log Event timestamp format.
Файл настроек агента – /var/awslogs/etc/awslogs.conf
.
После настройки и запуска агента – в CloudWatch Logs появится Log Stream с заданным во время настройки именем:
Добавление логов
Например, для логов NGINX:
[simterm]
root@ip-172-31-32-24:~# ls -l /var/log/nginx/
total 0
-rw-r—– 1 www-data adm 0 May 19 11:31 access.log
-rw-r—– 1 www-data adm 0 May 19 11:31 error.log
[/simterm]
Что бы добавить ещё один файл лога в под наблюдение агента – можно запустить awslogs-agent-setup.py
с опцией --only-generate-config
:
[simterm]
root@ip-172-31-32-24:~# python3 ./awslogs-agent-setup.py --region eu-west-1 --only-generate-config Launching interactive setup of CloudWatch Logs agent ... Skipping downloading and installation of agent bits.Step 3 of 5: Configuring AWS CLI ... AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [eu-west-1]: Default output format [None]: Step 4 of 5: Configuring the CloudWatch Logs Agent ... Path of log file to upload [/var/log/syslog]: /var/log/nginx/access.log Destination Log Group name [/var/log/nginx/access.log]: Choose Log Stream name: 1. Use EC2 instance id. 2. Use hostname. 3. Custom. Enter choice [1]: 3 Enter Log Stream name [None]: nginx_cf_logs_example Choose Log Event timestamp format: 1. %b %d %H:%M:%S (Dec 31 23:59:59) 2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36) 3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54) 4. Custom Enter choice [1]: 3 Choose initial position of upload: 1. From start of file. 2. From end of file. Enter choice [1]: More log files to configure? [Y]: Path of log file to upload [/var/log/syslog]: /var/log/nginx/error.log Destination Log Group name [/var/log/nginx/error.log]: Choose Log Stream name: 1. Use EC2 instance id. 2. Use hostname. 3. Custom. Enter choice [1]: 3 Enter Log Stream name [None]: nginx_cf_logs_example Choose Log Event timestamp format: 1. %b %d %H:%M:%S (Dec 31 23:59:59) 2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36) 3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54) 4. Custom Enter choice [1]: 3 Choose initial position of upload: 1. From start of file. 2. From end of file. Enter choice [1]: 1 More log files to configure? [Y]: n Step 5 of 5: Setting up agent as a daemon ...DONE
[/simterm]
Или просто добавить блок настроек в /var/awslogs/etc/awslogs.conf
руками:
... [/var/log/nginx/error.log] datetime_format = %Y-%m-%d %H:%M:%S file = /var/log/nginx/error.log buffer_duration = 5000 log_stream_name = nginx_cf_logs_example initial_position = start_of_file log_group_name = /var/log/nginx/error.log [/var/log/nginx/access.log] datetime_format = %Y-%m-%d %H:%M:%S file = /var/log/nginx/access.log buffer_duration = 5000 log_stream_name = nginx_cf_logs_example initial_position = start_of_file log_group_name = /var/log/nginx/access.log
Перезапускаем агент:
[simterm]
root@ip-172-31-32-24:~# service awslogs restart
[/simterm]
Проверяем в Logs – а там пусто… 🙂
Не сразу понял, что сервер новый, тестовый, и данных в логах NGINX ещё нет.
Делаем вызов к NGINX:
[simterm]
root@ip-172-31-32-24:~# curl localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
[/simterm]
Проверяем Logs:
Настройка хранения логов
По умолчанию логи, собранные в CloudWatch Logs остаются там постоянно.
Что бы изменить срок хранения логов – кликаем на Never Expire, и выбираем период:
Уведомления
Для собираемых логов можно настроить отсылку уведомений при срабатывании определённых фильтров.
Выбираем Log group, жмём Create Metric Filter:
В Filter Pattern указываем шаблон, например – 404.
В Select Log Data to Test можем сразу протестировать срабатывание фильтра – выбрать имеющийся лог из группы, либо указать свои данные.
Доабвляем свои данные, указываем паттерн 404, проверяем:
Жмём Assign Metric, сохраняем фильтр:
Теперь можем создать аларм:
Указываем условия срабатывания аларма, и куда слать уведомление:
Подтверждаем ящик – на него будет отправлено письмо со ссылкой:
Дёргаем пару раз NGINX, что бы получить 404:
[simterm]
root@ip-172-31-32-24:~# curl localhost/nofile <html> <head><title>404 Not Found</title></head> ...
И получаем наши алармы:
Правильнее настраивать фильтры было бы так.
Шаблон:
[ip, dash, user, timestamp, request, statusCode=404, size]
Дефолтный лог NGINX:
log_format compression '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"';
Т.е. в паттерне фильтра считаем первое поле – IP, потом пробел и т.д., и в поле statusCode уже фильтр для кода.
Больше примеров см. в Filter and Pattern Syntax.
Готово.
Ссылки по теме
Centralized Log Management with AWS CloudWatch
A simple way to manage log messages from containers: CloudWatch Logs
How to: Set-up and configure AWS CloudWatch Logs
How to use CloudWatch to generate alerts from logs?