EC2快照的Python脚本,使用datetime删除旧快照

时间:2015-03-04 06:20:47

标签: python datetime amazon-web-services amazon-ec2 snapshot

我是Python的初学者,我编写了一个python脚本,它捕获指定卷的快照,然后仅保留为该卷请求的快照数。

#Built with Python 3.3.2
import boto.ec2
from boto.ec2.connection import EC2Connection
from boto.ec2.regioninfo import RegionInfo
from boto.ec2.snapshot import Snapshot
from datetime import datetime
from functools import cmp_to_key
import sys

aws_access_key = str(input("AWS Access Key: "))
aws_secret_key = str(input("AWS Secret Key: "))
regionname = str(input("AWS Region Name: "))
regionendpoint = str(input("AWS Region Endpoint: "))
region = RegionInfo(name=regionname, endpoint=regionendpoint)
conn = EC2Connection(aws_access_key_id = aws_access_key, aws_secret_access_key = aws_secret_key, region = region)
print (conn)

volumes = conn.get_all_volumes()
print ("%s" % repr(volumes))

vol_id = str(input("Enter Volume ID to snapshot: "))
keep = int(input("Enter number of snapshots to keep:  "))
volume = volumes[0]
description = str(input("Enter volume snapshot description: "))


if volume.create_snapshot(description):
    print ('Snapshot created with description: %s' % description)

snapshots = volume.snapshots()
print (snapshots)

def date_compare(snap1, snap2):
    if snap1.start_time < snap2.start_time:
        return -1
    elif snap1.start_time == snap2.start_time:
        return 0
    return 1

snapshots.sort(key=cmp_to_key(date_compare))
delta = len(snapshots) - keep
for i in range(delta):
    print ('Deleting snapshot %s' % snapshots[i].description)
    snapshots[i].delete()

我现在要做的不是使用快照的数量来保持我想要将其更改为指定要保留的快照的日期范围。例如,删除超过特定日期和年龄的任何内容。时间。我有一个想法从哪里开始,基于上面的脚本,我有按日期排序的快照列表。我想要做的是提示用户指定快照将被删除的日期和时间,例如2015-3-4 14:00:00将删除任何早于此的内容。希望有人能让我从这里开始

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,您可以提示用户指定删除快照的日期和时间。

import datetime
user_time = str(input("Enter datetime from when you want to delete, like this format 2015-3-4 14:00:00:"))
real_user_time = datetime.datetime.strptime(user_time, '%Y-%m-%d %H:%M:%S')
print real_user_time  # as you can see here, user time has been changed from a string to a datetime object

其次,删除任何旧版本

解决方案一:

for snap in snapshots:
    start_time = datetime.datetime.strptime(snap.start_time[:-5], '%Y-%m-%dT%H:%M:%S')
    if start_time > real_user_time:
        snap.delete()

解决方案二:

由于快照已排序,因此您只能找到早于real_user_time的第一个快照,并删除所有其他快照。

snap_num = len(snapshots)
for i in xrange(snap_num):
    # if snapshots[i].start_time is not the format of datetime object, you will have to format it first like above
    start_time = datetime.datetime.strptime(snapshots[i].start_time[:-5], '%Y-%m-%dT%H:%M:%S')
    if start_time > real_user_time:
        for n in xrange(i,snap_num):
            snapshots[n].delete()
        break

希望它有所帮助。 :)

答案 1 :(得分:0)

小心点。确保规范化开始时间值(例如,将它们转换为UTC)。将用户本地时区的时间与服务器上使用的时区进行比较是没有意义的。此外,本地时区可能在不同时间具有不同的utc偏移。请参阅Find if 24 hrs have passed between datetimes - Python

如果所有日期都是UTC,那么您可以将快照排序为:

from operator import attrgetter

snapshots.sort(key=attrgetter('start_time'))

如果对snapshots进行了排序,那么您可以&#34;删除超过特定日期和时间的任何内容。时间&#34; 使用bisect模块:

from bisect import bisect

class Seq(object):
    def __init__(self, seq):
        self.seq = seq
    def __len__(self):
        return len(self.seq)
    def __getitem__(self, i):
        return self.seq[i].start_time

del snapshots[:bisect(Seq(snapshots), given_time)]

它会删除start_time <= given_time的所有快照。


您还可以删除较旧的快照而不进行排序:

snapshots[:] = [s for s in snapshots if s.start_time > given_time]

如果您想明确调用.delete()方法而不更改snapshots列表:

for s in snapshots:
    if s.start_time <= given_time:
        s.delete()

如果s.start_time是使用2015-03-04T06:35:18.000Z格式的字符串,那么given_time也应采用该格式(注意:Z此处表示时间为UTC格式)用户使用不同的时区;你必须在比较之前转换时间(str - &gt; datetime - &gt; datetime in utc - &gt; str)。如果given_time已经是正确格式的字符串,那么您可以直接比较字符串,而不首先将它们转换为datetime