EC2的终止计划

问题描述 投票:0回答:1

我需要为我拥有的所有EC2实例创建一个终止计划。

即如果服务器连续7天停止运行,则只能终止该ec2。如果没有,那就不能。

关于如何执行此操作的任何想法?我正在考虑通过将所有已停止的实例拉大7天来通过Cloud Watch Events规则执行此操作,并且它的目标是通过Lambda,因此它将检查该规则并终止该规则。这样行吗?如果是,怎么办?请提出想法。

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()
python amazon-web-services amazon-ec2 aws-lambda amazon-cloudwatch
1个回答
0
投票

似乎您的要求是:

  • 查找已被停止超过给定时间的实例
  • 终止它们

基于Reddit: How can I see how long 'stopped' EC2 instances have been stopped for?,似乎可以从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']])

[注意-编写终止实例的代码可能很危险。您应该在部署之前对其进行测试!您可能还需要添加其他保护措施,例如仅终止具有特定标签的实例。

© www.soinside.com 2019 - 2024. All rights reserved.