Всем привет!
Сегодня я хотел бы поделиться опытом настройки AWS Auto Scaling Group (ASG) на основе использования оперативной памяти (RAM).
Все началось с того, что на одном из проектов нам понадобилось настроить масштабирование EC2-инстансов по использованию памяти, а стандартный ASG Target Tracking Scaling Policy позволяет создавать политики только на основе следующих метрик: среднее использование ЦПУ, средний входящий или исходящий сетевой траффик и количество запросов на цель ALB:
![](https://habrastorage.org/getpro/habr/upload_files/d93/8ac/c8b/d938acc8bf4cabcadbfd26c8aa61197d.png)
Немного погуглив, я выяснил, что для реализации такого решения понадобится воспользоваться ещё одним сервисом AWS – CloudWatch, причём на самих инстансах должен быть установлен агент, который будет считывать использование памяти. Также хотел бы немного обозначить входные данные: приложение работает на инстансах с Ubuntu 18.04, сначала все работы проводятся на одном инстансе, с которого впоследствии будет снят образ и подготовлена AMI, которая будет использоваться для ASG. Весь процесс можно разделить на несколько этапов:
Создание IAM-роли, которая будет работать с CloudWatch-агентом и добавление этой роли к инстансу.
Скачать, установить, настроить и запустить агент на инстансе.
Создать оповещения в Cloudwatch.
Создать Amazon EC2 Auto Scaling policy для ASG.
Создание IAM-роли
Cначала нужно создать IAM-роль с политикой для CW-агента, для этого необходимо выполнить следующие действия:
Войти в консоль управления AWS и открыть консоль IAM.
В области навигации выбрать Роли (Roles), а затем выбрать «Создать роль» (Create role).
В разделе «Выбор типа доверенной организации» (Select type of trusted entity) выберите сервис AWS.
В разделе «Общие варианты использования» (Common use cases) выберите EC2, а затем нажмите «Далее: Разрешения» (Next: Permissions):
![](https://habrastorage.org/getpro/habr/upload_files/ce3/0d7/cf0/ce30d7cf0dfa772bc107658a08312da0.png)
5. В списке политик найдите пункт CloudWatchAgentServerPolicy и установите флажок рядом с ним, как на рисунке ниже:
![](https://habrastorage.org/getpro/habr/upload_files/6ff/320/873/6ff32087398b212c61003e2f75ae1993.png)
6. Далее выберите теги и добавьте одну или несколько пар значений тегов-ключей для организации, отслеживания или управления доступом для этой роли, а затем выберите «Далее: Обзор» (Next: Review).
7. В поле «Имя роли» введите имя для вашей новой роли (например, CloudWatchAgentRole).
8. Если необходимо, то для описания роли введите описание.
9. Убедитесь, что полиси CloudWatchAgentServerPolicy отображается в соответствующем разделе:
![](https://habrastorage.org/getpro/habr/upload_files/915/882/360/915882360314875d5d6540080bc91e61.png)
И нажмите «Создать роль» (Create role).
10. После этого необходимо добавить созданную роль к инстансу, с которым будем работать. Сделать это можно из консоли AWS, выбрав нужный инстанс и выполнив действия: Actions -> Security -> Modufy IAM roles.
Установка, настройка и запуск Cloudwatch-агент на EC2-инстансе с установленным образом Ubuntu 18.04
1. Сначала скачиваем и устанавливаем агент и collectd:
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
sudo apt-get install collectd
2. Запускаем мастера настройки агента
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
и следуем его инструкциям. Во время работы мастера нужно указать путь к логам и место, где хранить конфигурацию, тут есть два варианта:
локально,
AWS Systems Manager Parameter Store.
Я выбрал локально, так как использование Systems Manager не планировалось.
3. Копируем config.json из папки /opt/aws/amazon-cloudwatch-agent/bin/ в папку /opt/aws/amazon-cloudwatch-agent/etc/ и переименовываем в amazon-cloudwatch-agent.json. Конфиг-файл затем можно просто копировать на новые инстансы без запуска мастера настройки.
4. Запускаем сервис и добавляем его в автозагрузку:
sudo service amazon-cloudwatch-agent start
sudo systemctl enable amazon-cloudwatch-agent.service
5. После этого в CloudWatch проверяем, что сбор метрик работает:
![](https://habrastorage.org/getpro/habr/upload_files/a37/fef/ee7/a37fefee71cf0b3140cf530a1b14a2ef.png)
Создание оповещений в CloudWatch и Auto Scaling Actions (добавление/удаление инстансов в ASG)
Я создал два оповещения, первое — на срабатывание выше 80%, который затем использовал для добавления инстансов в ASG, второе — на срабатывание <30%, для того, чтобы убирать один инстанс из ASG. Более подробно о том, как создать оповещение и Auto Scaling Policy на добавление инстанса через консоль AWS, ниже:
1. В консоли выбрать сервис CloudWatch.
2. При необходимости, изменить регион AWS на регион, в котором находится ваша группа автоматического масштабирования (ASG).
3. Выбрать Alarms и Create alarm, затем Select metric.
4. В поиске ввести имя группы автоматического масштабирования (ASG). Затем выбрать метрику использования памяти — MemoryUtilization. Появится страница «Указать метрику и условия» (Specify metric and conditions), на которой отображается график и другая информация о метрике.
5. В качестве периода выбрать период оценки сигнала оповещения (например, 1 минута).
6. В качестве типа порога выбрать «Статический».
7. Для каждого случая использования памяти указать, хотите ли вы, чтобы значение показателя было больше, больше или равно, меньше или меньше или равно пороговому значению для срабатывания аварийного сигнала. Затем ввести пороговое значение, при котором вы хотите вызвать оповещение:
![](https://habrastorage.org/getpro/habr/upload_files/499/421/133/499421133f6cb04b4c22ce4a1ce9f3f3.png)
В разделе «Дополнительная настройка» нужно выполнить следующие действия:
8. Чтобы точки данных вызывали тревогу, нужно ввести количество точек данных (периодов оценки), в течение которых значение показателя должно соответствовать пороговым условиям для срабатывания тревоги. Например, два последовательных периода по 5 минут потребовали бы 10 минут, чтобы сработал сигнал тревоги, после этого нажать «Далее».
9. Если необходимо, в разделе «Уведомление» (Notification) можно выбрать или создать Amazon SNS топик, который будет использоваться для получения уведомлений. В противном случае можно удалить уведомление сейчас и добавить его позже по мере необходимости:
![](https://habrastorage.org/getpro/habr/upload_files/a95/aa4/2e9/a95aa42e9d454d96682afd39b4e66798.png)
10. Чуть ниже на этой же странице можно сразу выбрать действие для ASG (если предварительно вы ее уже создали) при срабатывании оповещения (или добавить его позже):
![](https://habrastorage.org/getpro/habr/upload_files/408/23f/357/40823f35748ae3b9a529ec1d25d3446a.png)
11. После этого остаётся только ввести название оповещения (например, MemoryUtilizationScaleOut) и необязательное описание, затем нажать «Далее» и «Создать оповещение» (Create alarm).
Для удаления одного инстанса я затем создал оповещение на срабатывание при использовании памяти менее, чем 30% и в Auto Scaling action выбрал ScaleInPolicy (Remove 1 instance).
Создание Amazon EC2 Auto Scaling policy (опционально, если не реализовано в предыдущем пункте)
Во время настройки политик масштабирования можно создавать оповещения (Alarms). Кроме того, можно использовать оповещения, созданные в консоли CloudWatch, как описано в предыдущем пункте.
Чтобы создать пошаговую политику масштабирования (step scaling policy) для масштабирования, нужно выполнить следующее:
1. В консоли управления Amazon EC2 выбрать Auto Scaling groups.
2. Установить флажок рядом с вашей группой автоматического масштабирования, созданной заранее, при этом в нижней части страницы откроется разделённая панель, в которой отображается информация о выбранной группе.
3. Убедиться, что Minimum capacity и Maximum capacity установлены надлежащим образом. Например, если ваша группа уже достигла максимального размера, вам необходимо указать новый максимум для масштабирования. Автоматическое масштабирование Amazon EC2 не масштабирует вашу группу ниже минимального или выше максимального значения. Чтобы обновить группу, на вкладке «Сведения» (Details) изменить текущие значения минимума и максимума.
4. Во вкладке Automatic scaling выбрать Dynamic scaling policies и нажать Create dynamic scaling policy:
![](https://habrastorage.org/getpro/habr/upload_files/df0/2f1/a82/df02f1a824c88429fce9b05150d86dfa.png)
5. Чтобы определить политику масштабирования (scale out/increase capacity), необходимо выполнить следующие действия:
a) В Policy Type выбрать Step Scaling.
b) Ввести имя для политики.
c) Выбрать CloudWatch Alarm, созданный ранее в пункте «Создание оповещений в Cloudwatch и Auto Scaling Actions (добавление/удаление инстансов в ASG)». Если вы еще не создали оповещение, то выберите «Create a CloudWatch alarm» и воспользуйтесь пунктом «Создание оповещений в Cloudwatch и Auto Scaling Actions (добавление/удаление инстансов в ASG)».
d) Используйте команду Take the action, чтобы указать изменение текущего размера группы, которое будет произведено при выполнении этой политики. Вы можете добавить определённое количество экземпляров или процент от существующего размера группы.
Например, выберите «Добавить» (Add), введите 80 в следующем поле, а затем выберите процент от группы.
e) Чтобы добавить еще один шаг, нужно выбрать «Добавить шаг» (Add step), а затем определить величину, на которую необходимо масштабировать, а также нижнюю и верхнюю границы шага относительно порога оповещения.
f) Чтобы задать минимальное количество экземпляров для масштабирования, необходимо указать нужное значение в поле «Add capacity units in increments of at least» с шагом не менее 1 единицы.
g) Затем указать время «прогрева инстанса» в течение которого его сервисы будут загружаться и его показатели не будут учитываться в CloudWatch, после этого нажать «Создать» (Create):
![](https://habrastorage.org/getpro/habr/upload_files/3fe/9be/726/3fe9be726f840b1ec1c1ec5c2d276d12.png)
Теперь остаётся добавить ещё одну политику для удаления инстансов при срабатывании оповещения об использовании памяти менее 30%.
В итоге наш CloudWatch Dashboard выглядел так:
![](https://habrastorage.org/getpro/habr/upload_files/ce8/479/a71/ce8479a7139de83c5d33fddfd07d55b0.png)
После этого желательно проверить, что масштабирование работает, как задумано, например, установить утилиту stress. Но нам необходимо было проверить работу всех частей приложения, поэтому мы подготовили несколько скриптов, имитирующих действия пользователей и использовали для этого Fargate, но это уже другая история. А на этом пока все, спасибо за внимание!