Первоначально опубликовано на Наш блог Анкет
Э -э … почему в этом месяце счет 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»