
🧠 Мониторинг памяти и диска EC2 через CloudWatch Agent: пошаговая настройка
Ваш инстанс EC2 перестал отвечать, а CloudWatch показывает, что всё в порядке? Классика. AWS «из коробки» даёт метрики CPU, сети, дискового ввода-вывода, но не показывает использование памяти и свободное место на диске. Эти цифры спрятаны внутри виртуальной машины, и пока вы их не вытащите наружу, вы летите вслепую.
Когда память заканчивается, инстанс не предупреждает, он просто падает. OOM Killer прибивает процессы в случайном порядке, и вы гадаете: плагин отвалился? база легла? А дело в том, что закончились гигабайты RAM, которые вы не мониторили. С диском та же история: логи, бэкапы, временные файлы забивают хранилище незаметно, и однажды утром No space left on device.
Решается это CloudWatch Agent, штатным агентом AWS, который собирает memory, disk, swap и ещё два десятка системных метрик и отправляет их в CloudWatch. Настройка занимает 20 минут и укладывается в бесплатный лимит (10 пользовательских метрик в месяц). Дальше, по шагам, от IAM до готового дашборда.
💡 Быстрый обзор:
- Создайте политику IAM с
cloudwatch:PutMetricDataи привяжите её к пользователю - Скачайте и установите CloudWatch Agent на Ubuntu-инстанс
- Настройте конфигурационный JSON: memory, disk, swap
- Запустите агента и проверьте, что метрики идут в CloudWatch
- Соберите кастомный дашборд с графиками использования памяти и диска
Управление идентификацией и доступом AWS
Агенту нужны права на отправку метрик в CloudWatch. Для этого создадим политику IAM и привяжем её к пользователю с программным доступом.
Политика IAM
Откройте консоль IAM, перейдите в Политики → Создать политику и переключитесь на вкладку JSON. Вставьте этот документ:
1 { 2 "Version": "2012-10-17", 3 "Statement": [ 4 { 5 "Sid": "CloudWatchAgentMetrics", 6 "Effect": "Allow", 7 "Action": [ 8 "cloudwatch:PutMetricData", 9 "ec2:DescribeTags", 10 "cloudwatch:GetMetricStatistics", 11 "cloudwatch:ListMetrics" 12 ], 13 "Resource": "*" 14 } 15 ] 16 }
Нажмите Проверить политику, задайте имя (например CloudWatchAgentPolicy) и нажмите Создать политику.
Пользователь IAM
Перейдите в Пользователи → Добавить пользователя. Задайте имя и обязательно отметьте чекбокс «Программный доступ», он даст Access Key ID и Secret Access Key, которые агент будет использовать для аутентификации.

На экране разрешений выберите Прикрепить существующие политики напрямую. В фильтре по типу политики укажите Управляемые клиентом, так вы быстрее найдёте только что созданную CloudWatchAgentPolicy.

Отметьте политику галочкой и нажмите Далее → Создать пользователя. AWS покажет экран с ключами доступа, сохраните Access Key ID и Secret Access Key прямо сейчас. Закроете страницу, ключи исчезнут навсегда, придётся пересоздавать.

Установка CloudWatch Agent
Старые Perl-скрипты мониторинга (CloudWatchMonitoringScripts-1.2.2.zip) давно помечены как deprecated. Актуальный способ, унифицированный CloudWatch Agent, который собирает не только память и диск, но и swap, загрузку процессора, сетевые интерфейсы и ещё два десятка метрик «из коробки».
Загрузка и установка
Подключитесь к инстансу по SSH и скачайте пакет агента для Ubuntu:
1 wget https://amazoncloudwatch-agent.s3.amazonaws.com/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
Установите пакет через dpkg:
1 sudo dpkg -i amazon-cloudwatch-agent.deb
Если менеджер пакетов пожалуется на отсутствующие зависимости, доставьте их одной командой:
1 sudo apt-get install -f
Агент установлен, но ещё не знает, какие метрики собирать и с какими ключами ходить в CloudWatch. Зададим конфигурацию.
Обратите внимание: агент также доступен через AWS Systems Manager (SSM), если у вас десятки инстансов, удобнее развернуть его централизованно через Run Command, без SSH на каждую машину. Для одного-двух инстансов ручная установка проще и быстрее.
Конфигурация агента
Создание конфигурационного файла
Конфигурация CloudWatch Agent, это JSON-документ, который описывает, какие метрики собирать и с какой периодичностью. Запустите встроенный мастер:
1 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
Мастер задаст несколько вопросов в интерактивном режиме: на каком сервере (EC2/on-premises), куда отправлять метрики (CloudWatch), какие метрики собирать. Для отслеживания памяти и диска ответьте так:
- Operating system: Linux
- Are you using Amazon EC2?: Yes
- Which metrics to collect: Custom metrics (
memиdisk_used_percent) - Resolution: 60 секунд (Standard)
- Log files: пропустите, если логи не нужны
На выходе мастер сгенерирует файл config.json в директории /opt/aws/amazon-cloudwatch-agent/bin/. Вот минимальный рабочий пример, memory used percent + disk used percent + swap:
1 { 2 "agent": { 3 "metrics_collection_interval": 60, 4 "run_as_user": "root" 5 }, 6 "metrics": { 7 "metrics_collected": { 8 "mem": { 9 "measurement": [ 10 "mem_used_percent" 11 ] 12 }, 13 "disk": { 14 "measurement": [ 15 "disk_used_percent" 16 ], 17 "resources": [ 18 "/" 19 ] 20 }, 21 "swap": { 22 "measurement": [ 23 "swap_used_percent" 24 ] 25 } 26 } 27 } 28 }
Параметр resources для disk указывает точку монтирования: "/", корневой EBS-том NVMe SSD, основное хранилище инстанса. Если у вас дополнительные тома (например, /data), добавьте их в массив.
Креды агента
Ключи доступа, сохранённые на этапе IAM, нужно передать агенту. Создайте файл с креденшелами в домашней директории пользователя:
1 sudo nano /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Добавьте секцию:
1 [credentials] 2 shared_credential_profile = "AmazonCloudWatchAgent"
И пропишите креды в стандартном AWS credentials-файле:
1 aws configure --profile AmazonCloudWatchAgent
Система запросит Access Key ID, Secret Access Key и регион. После заполнения агент сможет отправлять метрики от имени созданного IAM-пользователя.
Альтернативный путь, IAM-роль, прикреплённая к инстансу. Это безопаснее (ключи не лежат на диске) и проще при масштабировании. Если вы запускаете EC2 с IAM-ролью, у которой есть cloudwatch:PutMetricData, агент подхватит права автоматически, шаг с креденшелами можно пропустить.
Тестирование
Запустите агента вручную и проверьте, что метрики уходят:
1 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ 2 -a fetch-config \ 3 -m ec2 \ 4 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json \ 5 -s
Флаг -s стартует агента как сервис. Через минуту-две первые метрики появятся в CloudWatch. Чтобы убедиться, что данные идут, откройте консоль CloudWatch, перейдите в раздел Metrics → All metrics и найдите неймспейс CWAgent (агент по умолчанию пишет именно туда).

Разверните неймспейс, вы увидите измерения InstanceId, разбитые по метрикам: mem_used_percent, disk_used_percent и swap_used_percent. Клик по любой строке строит график, можно сразу оценить, что данные приходят и выглядят осмысленно.
Четыре базовые метрики (память, диск, swap, CPU) на двух инстансах, это 8 метрик. Бесплатный лимит CloudWatch, 10 пользовательских метрик в месяц, описан на странице цен. Вы в него укладываетесь. Если инстансов больше трёх, часть метрик выйдет за лимит, но ценник скромный: $0,30 за метрику в месяц (данные AWS на 2026 год).
Настройка расписания
Агент по умолчанию работает как systemd-сервис и отправляет метрики с интервалом, заданным в metrics_collection_interval (60 секунд в нашем конфиге). Дополнительных cron-записей не требуется, systemd сам следит, чтобы агент был жив и перезапускался при падении.
Проверьте статус:
1 sudo systemctl status amazon-cloudwatch-agent
Убедитесь, что сервис active (running) и включён в автозагрузку (enabled). Если нет, запустите и включите:
1 sudo systemctl enable amazon-cloudwatch-agent 2 sudo systemctl start amazon-cloudwatch-agent
После перезагрузки инстанса агент поднимется автоматически.
Наглядная демонстрация всего процесса, от IAM до дашборда, в этом видео:
Собираем кастомный дашборд
Метрики приходят, теперь их нужно красиво упаковать. Я покажу, как собрать дашборд для мониторинга продакшен-инстанса: память, диск, загрузка CPU и кредитный баланс (для T-серии) на одном экране.
Создание дашборда
В консоли CloudWatch перейдите в Dashboards → Create dashboard. Задайте имя (например Production-EC2) и выберите тип виджета.

Выберите Line для первого графика, этот тип лучше всего подходит для отображения метрик за период.

Виджет графика
Нажмите Add widget и выберите тип Line, простой линейный график, лучший вариант для большинства метрик. В открывшемся диалоге нажмите Configure и перейдите к неймспейсу CWAgent.

Найдите метрику mem_used_percent для вашего инстанса (по InstanceId) и кликните по строке, CloudWatch сразу покажет график.
Совет: тип Stacked area подходит, когда на одном виджете несколько метрик (например, память + swap); Number, для мгновенного считывания текущего значения (удобно вынести в угол дашборда); Text, для заголовков и заметок между графиками.
Тонкая настройка графика

Несколько настроек, которые делают график читаемым:
Период: если агент шлёт метрики раз в минуту, выберите период 1 минуту, чтобы видеть полное разрешение данных.
Название: переименуйте легенду графика во что-то человеческое, «RAM used%», а не
mem_used_percent / i-1234567890abcdef0.Максимум по оси Y (Graph options): зафиксируйте лимит (например, 100 для процентов или 16 для 16 ГБ RAM). Без этого CloudWatch автомасштабирует ось, и небольшой всплеск выглядит так же угрожающе, как критическая ситуация. С фиксированным лимитом вы с одного взгляда понимаете, насколько близко к краю.

Нажмите Create widget, первый блок дашборда готов. Повторите для каждой метрики: disk_used_percent, затем swap_used_percent, затем cpu_usage (встроенная метрика EC2, не из CWAgent) и CPUCreditBalance для T-серии. Виджеты можно перетаскивать, менять размер, редактировать. Когда всё выглядит как надо, нажмите Save dashboard.

Дашборд готов. Добавьте его в избранное (звёздочка в верхнем меню), и возвращайтесь одним кликом, когда нужно проверить состояние инстанса перед деплоем или после всплеска трафика.
⁉️🤔 Частые вопросы
Почему стандартные метрики EC2 не включают память и диск?
AWS виртуализирует CPU и сеть на уровне гипервизора, эти метрики доступны снаружи, без захода в гостевую ОС. Память и диск, внутренние ресурсы виртуальной машины, гипервизор о них не знает. Чтобы их увидеть, нужен агент внутри ОС, который считывает
/proc/meminfoиdfи отправляет в CloudWatch. CloudWatch Agent именно это и делает: раз в минуту опрашивает системные счётчики и шлёт их в неймспейсCWAgent. Полный список из двух десятков метрик, в официальной документации AWS.
Сколько это стоит?
Для типового сценария «1-2 инстанса, 4 метрики на каждый», нисколько. Бесплатный лимит CloudWatch включает 10 пользовательских метрик, 10 алармов и 3 дашборда на аккаунт ежемесячно, согласно странице цен CloudWatch. Два инстанса по 4 метрики = 8 из 10 бесплатных. Если инстансов больше трёх, превышение лимита стоит $0,30 за метрику в месяц. Для десятка серверов это $6-9 в месяц, цена за отсутствие сюрпризов в три часа ночи.
Чем CloudWatch Agent лучше старых Perl-скриптов?
Perl-скрипты (
mon-put-instance-data.pl) официально deprecated с 2023 года и не получают обновлений. CloudWatch Agent, штатный поддерживаемый инструмент, который пишет не только в CloudWatch, но и в Amazon Managed Prometheus; собирает метрики через StatsD и collectd; умеет слать логи и трейсы. Главное, он интегрируется с Systems Manager, то есть на 50 инстансов вы разворачиваете его одной командой из консоли, без SSH. Если у вас до сих пор крутятся Perl-скрипты, мигрируйте: старый форматawscreds.confс ключами в открытом виде на диске это дыра в безопасности. CloudWatch Agent работает с IAM-ролями и не требует хранить секреты в текстовом файле.
Что делать, если метрики не появляются в CloudWatch?
Проверьте по порядку: (1) статус сервиса через
systemctl status amazon-cloudwatch-agent, должен бытьactive; (2) логи агента в/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log, там будет конкретная ошибка; (3) права IAM, у пользователя или роли должно быть разрешениеcloudwatch:PutMetricData; (4) регион, агент и консоль должны смотреть в один регион AWS. По моему опыту, в подавляющем большинстве случаев проблема либо в пермишенах, либо в несовпадении региона.
Можно ли мониторить Windows-инстансы?
Да, CloudWatch Agent поддерживает Windows Server наравне с Linux. Установка, через MSI-инсталлятор с того же S3-бакета (
amazon-cloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/). Конфигурация, тот же JSON, но имена метрик отличаются: вместоmem_used_percent,Memory % Committed Bytes In Use. Мастер конфигурации на Windows сам подставит правильные имена.
Что даёт мониторинг памяти и диска на практике
Вы запустили CloudWatch Agent на Ubuntu-инстансе, прописали сбор memory, disk и swap, прикрутили дашборд с графиками. Что изменилось? Ровно одна вещь: слепое пятно исчезло. Вы видите не только CPU и сеть, но и два главных убийцы инстансов, утечку памяти и забитый диск.
На практике это значит: вы замечаете, что память ползёт вверх за три дня ДО того, как OOM Killer прибьёт PHP-FPM. Вы видите, что диск заполнился почти полностью после обновления тем, и чистите логи ДО того, как упадёт база. Без этих метрик каждый инцидент, расследование post mortem. С ними, алерт в канале за полчаса до аварии.
Если у вас больше трёх инстансов, настройте CloudWatch Alarms на пороговые значения (скажем, mem_used_percent > 90 в течение 5 минут) и подключите уведомления через SNS в Slack или Telegram. Агент + алармы = вы узнаёте о проблеме не от клиента, а от AWS.
Настройка агента, разовая инвестиция в 20 минут на инстанс. Дальше он работает сам.



