План прекращения для EC2 - PullRequest
0 голосов
/ 23 октября 2019

Мне нужно создать план завершения для всех экземпляров EC2, которые у меня есть.

т.е. Если сервер останавливается на 7 дней подряд, то только это ec2 может быть прервано. если нет, то не могу.

Есть идеи, как это сделать? я думаю сделать это с помощью правила событий Cloud watch, потянув все остановленные экземпляры на 7 дней больше, и его цель - через лямбду, поэтому он проверит правило и прекратит его. Будет ли это работать? если да как? Идеи, пожалуйста.

import boto3
ec2client = boto3.client('ec2')

def lambda_handler(event, context):
  instancesWithEvent = ec2client.describe_instance_status(
    Filters=[
      {
        'Name': 'event.code',
        'Values': [
            'instance-reboot', 'system-reboot', 'system-maintenance', 'instance-retirement', 'instance-stop' 
        ]
      },
    ],
    MaxResults=1000,
    IncludeAllInstances=False
  )

  instancesToTerminate=[]
  for index in instancesWithEvent['InstanceStatuses']:
    instancesToTerminate.append(index['InstanceId'])
  if len(instancesToTerminate) > 0:
    print("Instances to terminate: %s " % (', '.join(instancesToTerminate)))
    ec2client.terminate_instances( DryRun=False, InstanceIds=instancesToTerminate )
  else:
    print("No instances with events found.")
  return()

1 Ответ

1 голос
/ 25 октября 2019

Похоже, что ваши требования:

  • Найти экземпляры, которые были остановлены дольше, чем заданный период
  • Прекратить их

На основании Reddit: Как я могу увидеть, как долго «остановленные» экземпляры EC2 были остановлены? может показаться, что «дата остановки» может быть извлечена из StateTransitionReason:

aws ec2 describe-instances --filter "Name=instance-state-name,Values=stopped" --query 'Reservations[*].Instances[*].[InstanceId, StateTransitionReason]' --output text
i-xxxxxxxx  User initiated (2016-05-23 17:27:19 GMT)
i-xxxxxxxx  User initiated (2016-02-22 18:23:21 GMT)
i-xxxxxxxx  User initiated (2015-12-09 16:10:24 GMT)
i-xxxxxxxx  User initiated (2016-05-23 17:27:19 GMT)

Таким образом, ваша программа должна будет:

  • Вызвать DescribeInstances(), чтобы получить список экземпляров
  • Найти остановленные экземпляры и извлечь датуиз поля StateTransitionReasonStateTransitionReason
  • Если дата выходит за пределы желаемого периода, тогда позвоните TerminateInstances()

Таким образом, это может быть что-то вроде этого:

import boto3
import re
from datetime import datetime

TERMINATION_AGE = 7

ec2_client = boto3.client('ec2', region_name='ap-southeast-2')

# Get a list of stopped instances
instances = ec2_client.describe_instances(Filters=[{'Name': 'instance-state-name', 'Values': ['stopped']}])

for reservation in instances['Reservations']:
    for instance in reservation['Instances']:

        # StateTransitionReason might be like "i-xxxxxxxx User initiated (2016-05-23 17:27:19 GMT)"
        reason = instance['StateTransitionReason']
        date_string = re.search('User initiated \(([\d-]*)', reason).group(1)
        if len(date_string) == 10:
            date = datetime.strptime(date_string, '%Y-%m-%d')

            # Terminate if older than TERMINATION_AGE
            if (datetime.today() - date).days > TERMINATION_AGE:
                ec2_client.terminate_instances(InstanceIds=[instance['InstanceId']])

Будьте осторожны - может быть опасно писать код, который завершает экземпляры. Вы должны проверить это перед развертыванием! Вы также можете добавить дополнительные меры предосторожности, такие как только завершение экземпляров с определенным тегом.

...