Давайте оптимизируем использование инфраструктуры 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 более портативной, а при необходимости ее можно будет легко взорвать и воссоздать заново. С другой стороны, оптимизация использования облачной инфраструктуры является необходимостью для снижения затрат на ее эксплуатацию.