Давайте оптимизируем использование инфраструктуры AWS и сэкономим деньги
Введение
Снижение текущих расходов для бизнеса всегда интересно, особенно когда речь идет о переменных расходах, которые зависят от фактического использования услуг.
Круглосуточная эксплуатация инстансов AWS EC2 для размещения и запуска программных приложений в тестовых средах является относительно дорогой, а расходы на постоянную работу этих инстансов могут превышать бюджет, выделенный для проекта.
Очистка учетной записи AWS и завершение работы всех ненужных узлов EC2 - это первый шаг к снижению затрат на работу инстансов EC2. Однако это не единственное, что можно сделать для снижения затрат. В большинстве случаев даже после очистки для процесса разработки программного обеспечения все еще требуется множество экземпляров EC2. Точное количество необходимых экземпляров зависит от размера проекта и количества участников или команд в проекте.
Большинство этих экземпляров будут использоваться в качестве сред тестирования во время разработки программного обеспечения, и инженеры будут активно использовать их в рабочее время для развертывания новых версий исходного кода и тестирования новых функций приложений. Однако такая среда с меньшей вероятностью будет использоваться в выходные дни, а также в нерабочее время. Поэтому не имеет смысла автоматически запускать и останавливать эти экземпляры и делать их доступными только в рабочее время. Одно из предложений по достижению этой задачи представлено ниже:
- Автоматический перезапуск может применяться к отдельным узлам EC2 на основе тегов. Это означает, что чтобы применить автоматический запуск и остановку на данном узле EC2, узел EC2 должен быть помечен определенным тегом (назовем его так
Auto-Start
) с определенным значением. - Все экземпляры EC2, помеченные тегом
Auto-Start
, будут запускаться каждый рабочий день рано утром в6:30 AM
. - Все экземпляры EC2, помеченные тегом
Auto-Start
, будут останавливаться каждый рабочий день вечером в7:00 PM
.
Автоматическая остановка и запуск инстансов EC2 хорошо документирована в учетной записи AWS и может быть реализована, следуя инструкциям на этой странице. Однако у меня есть несколько примечаний по поводу инструкции.
- Инструкцию нужно выполнять вручную с консоли AWS 😢.
- Затронутые узлы EC2 необходимо включить в сценарий запуска и остановки. Это означает, что при необходимости расширения решения путем включения новых узлов EC2 необходимо изменить эти сценарии с помощью идентификаторов новые узлы.
В этом посте я опишу шаги, необходимые для реализации предложенного выше решения и его применения с помощью Terraform.
Реализация
Первым шагом является создание политики IAM, которая позволяет выполнять следующие действия: запускать экземпляр EC2, останавливать экземпляр EC2 и составлять список экземпляров EC2. Эта политика может быть создана с помощью приведенного ниже определения ресурса terraform.
Следующим шагом является определение роли IAM и присоединение политики, созданной на предыдущем шаге, к созданной роли. Ресурс terraform aws_iam_role
используется для создания роли и назначения служб, которые будут использовать эту роль, используя assume_role_policy
. Однако его нельзя использовать для присоединения политик IAM к ролям; для этой цели нам нужно использовать другой ресурс терраформ под названием aws_iam_role_policy_attachment
. В приведенном ниже фрагменте показано, как определять эти ресурсы в Terraform.
Следующим шагом является определение функции lumbda
, которая будет обрабатывать остановку и запуск экземпляров EC2. Но прежде чем перейти к определению функции lumbda
в AWS с помощью terraform, давайте на минутку проиллюстрируем скрипт Python, который можно использовать для такой функции. Boto3 - это клиентская библиотека AWS Python, которую можно использовать для выполнения действий в AWS. Реализованный сценарий должен обеспечивать простой интерфейс для остановки и запуска узлов EC2 на основе тегов экземпляров EC2. Ниже приведена реализация сценария, который определяет две функции: одна для остановки всех экземпляров EC2, помеченных тегом tagAuto-Start
со значением true
. Другая функция запускает тот же список экземпляров EC2.
Теперь, когда сценарий Python для остановки и запуска экземпляров EC2 готов, мы можем приступить к созданию функции lambda
, используя приведенное ниже определение ресурса terraform (имя файла - это путь к сжатому файлу функции Python).
Следующим шагом является определение правил CloudWatch, которые будут запускать выполнение функции lambda
, определенной на предыдущем шаге. Чтобы реализовать это, нам нужно определить правило для каждого из случаев, которые мы хотели бы поддерживать (два случая: один для остановки, а другой для запуска). Эти правила будут срабатывать на основе выражения Cron в определенное время в течение дня. Приведенный ниже фрагмент определяет правило для варианта использования остановки и определяет точное время, в которое функция lambda
должна срабатывать. Тот же фрагмент можно изменить и использовать для запуска узлов EC2.
Последний шаг, необходимый для предоставления разрешений CloudWatch, - выполнение функции lambda
. Это необходимый шаг, и без него CloudWatch не сможет активировать функцию лямбда.
Ниже представлена полная реализация решения, предложенного в этом посте:
Заключение
Всегда полезно автоматизировать как можно больше действий, которые мы обычно выполняем. Terraform - отличный инструмент, который помогает нам автоматизировать задачи и действия инфраструктуры.
Внедрение таких решений с помощью Terraform сделает инфраструктуру AWS более портативной, а при необходимости ее можно будет легко взорвать и воссоздать заново. С другой стороны, оптимизация использования облачной инфраструктуры является необходимостью для снижения затрат на ее эксплуатацию.