我已经编写了一个 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'
我该怎么办?
答案 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函数,方法与创建快照创建函数的方式相同。