在AWS中计划创建和删除快照

时间:2016-11-03 14:13:14

标签: amazon-web-services aws-lambda

我已经编写了一个 lambda函数 来创建快照,并在 Cloud Watch Events 中应用了一个cron作业这样他们每天下午12点就会被创造出来。

import boto3
import datetime

ec2 = boto3.resource('ec2')

def lambda_handler(event,handler):
print("\n\nAWS Snapshots starting at %s" % datetime.datetime.now())
instances = ec2.instances.filter(Filters=[
        {'Name': 'instance-state-name', 'Values': ['running']}
    ])

for instance in instances:
    instance_name = filter(lambda tag: tag['Key'] == 'Name', instance.tags)[0]['Value']
    print("name: %s -id: %s" % (instance_name , instance.id))

    for volume in ec2.volumes.filter(Filters=[
        {'Name': 'attachment.instance-id', 'Values': [instance.id]}
    ]):
        description = 'scheduled-%s.%s-%s' % (instance_name, volume.volume_id, datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))

        print 'description: %s' % (description)

    if volume.create_snapshot(VolumeId=volume.volume_id, Description=description):
        print("Snapshot created with description [%s]" % description)


print("\n\nAWS Snapshots completed at %s" % datetime.datetime.now())
return True

现在,我要做的就是 删除 快照 7天 后的快照lambda function.And我写了以下内容。

import sys
import boto3

from datetime import datetime, timedelta

try:
    days = int(sys.argv[1])
except IndexError:
    days = 7

delete_time = datetime.utcnow() - timedelta(days=days)

print 'Deleting any snapshots older than {days} days'.format(days=days)

ec2 = boto3.resource('ec2')

snapshots = ec2.get_all_snapshots(filters=filters)

deletion_counter = 0
size_counter = 0

for snapshot in snapshots:
    start_time = datetime.strptime(
            snapshot.start_time,'%Y-%m-%dT%H:%M:%S.000Z'
    )

    if start_time < delete_time:
        print 'Deleting {id}'.format(id=snapshot.id)
        deletion_counter = deletion_counter + 1
        size_counter = size_counter + snapshot.volume_size  
        snapshot.delete(dry_run=False)

print 'Deleted {number} snapshots totalling {size} GB'.format(number=deletion_counter,size=size_counter)

通过这样做,我收到以下错误:

module initialization error: 'ec2.ServiceResource' object has no attribute 'get_all_snapshots'

我该怎么办?

1 个答案:

答案 0 :(得分:2)

首先,我会更新您创建快照的Lamdba函数,以便为每个快照添加一个标记,该快照包含可以删除快照的日期。您可以将标记命名为:backup-expiry-time,标记的值是可以删除的日期,例如03-11-2016

接下来,我将创建另一个Lamdba函数,其唯一目的是删除快照(这样您就不会创建具有两个角色的Lambda函数,例如创建和删除快照)。

然后我会使用:http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Client.describe_snapshots

获取包含backup-expiry-time标记的所有快照的列表。循环遍历此快照列表,并删除backup-expiry-time标记的值显示可以安全删除的任何位置。

使用cron通过CloudWatch调用快照删除Lambda函数,方法与创建快照创建函数的方式相同。