我需要为我拥有的所有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()
似乎您的要求是:
基于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']])
[注意-编写终止实例的代码可能很危险。您应该在部署之前对其进行测试!您可能还需要添加其他保护措施,例如仅终止具有特定标签的实例。