Рубрики
Uncategorized

Как разрезать неиспользованные экземпляры EC2 с помощью AWS Lambda

Первоначально опубликовано в нашем блоге. Эм-м-м… Почему в этом месяце счет AWS такой высокий? Забытый AWS EC2 Insta … Tagged с помощью AWS, DevOps, без сервера, учебник.

Первоначально опубликовано на Наш блог Анкет

Э -э … почему в этом месяце счет AWS настолько высок?

Забытые экземпляры AWS EC2 заставили всех карманов. Если вы не устойчиво очистите неиспользованные экземпляры EC2, облачные расходы могут быстро выйти из -под контроля. Тем не менее, может быть утомительно регулярно проверять, какие экземпляры EC2 все еще используются, отслеживать старые и удалять их. К счастью — мы знаем, как автоматизировать эти задачи!

Этот пост проводит вас через неиспользованные экземпляры EC2, используя AWS Lambda и CloudFormation, чтобы развернуть жнец EC2, который использует простые теги для сокращения расходов.

Чтобы увидеть полный код, проверьте это репо Анкет

AWS EC2 Reaper Обзор

Жнец AWS работает, проверяя и применяя теги, которые установлены на экземплярах EC2. Все экземпляры EC2 должны быть помечены Lifetime или Termination_date Анкет Termination_date Определяет будущую дату, после которой экземпляр EC2 будет прекращен. В качестве альтернативы, Жнец ищет Lifetime TAG — если обнаружен, он вычисляет новую будущую дату и добавляет эту дату как Termination_date тег для экземпляра EC2.

Сначала давайте посмотрим на Reaper.py Анкет Основная логика жнец для обработки экземпляров — в Tranment_expired_instances Функция, которая перечисляет экземпляры и ищет тег даты завершения для каждого экземпляра:

instances = ec2.instances.filter(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
        print(instances)
        for instance in instances:
          ec2_termination_date = get_tag(instance, 'termination_date')

Неправильно помеченные экземпляры

Если мы найдем экземпляр, который не имеет Termination_date Или мы находим, что тег не может быть проанализирован, мы останавливаем:

if ec2_termination_date is None:
            print("No termination date found for {0}".format(instance.id))
            stop_instance(instance, "EC2 instance has no termination_date")
            improperly_tagged.append(instance)
            continue

Это позволяет нам остановить выставление счетов B̶l̶e̶e̶d̶n̶n̶g̶, пока мы связываемся с владельцем экземпляра, чтобы увидеть, следует ли он все еще оставаться рядом.

Срок действия случаев

Для всех случаев, которые мы находим, истек, мы разрушаем:

if ec2_termination_date != INDEFINITE:
  try:
    if dateutil.parser.parse(ec2_termination_date) > timenow_with_utc():
       ttl = dateutil.parser.parse(ec2_termination_date) - timenow_with_utc()
       print("EC2 instance will be terminated {0} seconds from now, roughly".format(ttl.seconds))
    else:
       terminate_instance(instance, "EC2 instance is expired")
       deleted_instances.append(instance)

Развертывание жнеца EC2

Теперь мы могли бы просто запустить этот сценарий Python с различными регионами AWS, и нам уже было бы лучше, чем делать это вручную. Тем не менее, мы бы вообще не провели время присмотра за детьми. Мы собираемся развернуть это в AWS, используя Стеки облаков Анкет

Развертывание AWS Reaper имеет две части:

  • deploy_to_s3.yaml Шаблон AWS CloudFormation, который помещает ZIP -ресурсы Lambda в ведра S3 в каждом регионе, чтобы шаблон Deploy_Reaper мог читать их для развертывания Жнеца.
  • Deploy_Reaper.yaml Шаблон AWS CloudFormation, который устанавливает жнец, создает роль IAM и развертывает функцию Lambda для выполнения экземпляра.

Deploy_to_S3 шаблон

Чтобы использовать этот шаблон, вы должны сначала вручную создать ведро S3, которое содержит ресурсы для копирования во всех регионах. Вам нужно будет сделать это один раз на регион; Ресурсы S3 могут быть прочитаны между учетными записями, но не между регионами для AWS Lambda. Это должно быть сделано только один раз для административного счета.

  • Вручную создайте ковш S3, доступный из административной учетной записи. Застегивайте два файла Python Reaper, Reaper.py и Slack_notifier.py и поместите их в ведро, назвав их Reaper.zip и Slack_notifier.zip Анкет
  • Из административной учетной записи создайте новый набор стека и используйте deploy_to_s3 шаблон. Пример CLI -вызов будет выглядеть как:
$ aws cloudformation create-stack-set --stack-set-name reaper-assets --template-body 
file://path/to/deploy_to_s3.yaml --capabilities CAPABILITY_IAM --parameters
ParameterKey=OriginalS3Bucket,ParameterValue=reaperfiles
  • Развертывание стека-установки для этого набора стека, по одному на регион в административной учетной записи. Проверьте документацию Amazon для самого современного списка региона. Например:
$ aws cloudformation create-stack-instances --stack-set-name --accounts 123456789012
--regions "us-west-1" "us-west-2" "eu-west-1" ...

Deploy_reaper Шаблон

После того, как ресурсы для Жнеца были распределены, вы можете использовать deploy_reaper Шаблон CloudFormation для развертывания жнеца в учетную запись.

Вам нужно будет следовать приведенным ниже шагам для каждой учетной записи, в которую вы разверните жнец.

  • Во -первых, создайте набор стека, представляющий учетную запись, в которой вы хотите запустить жнец. Пример вызов:
$ aws cloudformation create-stack-set --stack-set-name reaper-aws-account --template-body
file://path/to/deploy_reaper.yaml --capabilities CAPABILITY_IAM --parameters
ParameterKey=SLACKWEBHOOK,ParameterValue=1234567 ...
  • Развернуть жнеца в учетную запись.
$ aws cloudformation create-stack-instances --stack-set-name reaper-aws-account --accounts
098765432109 --regions "us-west-1" "us-west-2" "eu-west-1" ...

Включение жнеца EC2

После развертывания жнец EC2 ничего не получит, если не переменная среды LiveMode установлен на ПРАВДА . Это только сообщит, что это сделало бы с Slack.

Если вы хотите активировать жнец, обновите значение параметра LiveMode к «истинному» (режима нечувствительна).

$ aws cloudformation update-stack-set --stack-set-name reaper-aws-account
--use-previous-template --parameters ParameterKey=LIVEMODE,ParameterValue=TRUE --capabilities CAPABILITY_IAM

Вывод

Теперь вы узнали, как контролировать расходы на AWS, пожимая старые экземпляры EC2. Чтобы узнать больше о нашей миссии и продукте, подпишитесь на наши обновления о https://relay.sh Анкет Наша миссия состоит в том, чтобы освободить вас от утомительных облачных рабочих процессов с автоматизацией, управляемой событиями!

Оригинал: «https://dev.to/kenazkwa/how-to-cut-unused-ec2-instances-with-aws-lambda-5eph»