【问题标题】:Termination plan for EC2EC2 的终止计划
【发布时间】:2020-02-19 16:44:43
【问题描述】:

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

即如果服务器连续 7 天停止,则只能终止该 ec2。如果不是它不能。

关于如何做到这一点的任何想法?我正在考虑通过 Cloud watch events 规则执行此操作,方法是将所有停止的实例拉 7 天以上,其目标是通过 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()

【问题讨论】:

  • 欢迎来到 StackOverflow!您能否编辑您的问题并告诉我们您尝试了什么以及您面临的具体困难是什么?你试过运行上面的代码吗?如果是这样,您面临什么问题?您是否能够识别已停止 7 天的实例?您是否能够终止实例?谢谢。
  • 我尝试使用云观看事件。提取过去 7 天停止的实例列表。此 lambda 用于终止。因此,根据云观察事件规则,它获取列表并执行此 lambda 。我假设这会奏效。但不确定。需要知道如何解决这个问题?

标签: python amazon-web-services amazon-ec2 aws-lambda amazon-cloudwatch


【解决方案1】:

看来你的要求是:

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

基于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']])

小心——编写终止实例的代码可能很危险。您应该在部署之前对其进行测试!您可能还想添加额外的保护措施,例如仅终止带有特定标签的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多