2016-11-03 2 views
0

Я написал функцию лямбда для создания снимка и прикладной хрон в Облако смотреть События таким образом, что они получают созданные ежедневно в 12 часов вечера.Запланированное создание и удаление снимков в AWS

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 дней создания через лямбда 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' 

Что мне делать?

ответ

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 так же, как вы сделали для своей функции создания моментальных снимков.

+0

Не могли бы вы рассказать мне, как добавлять теги к этим моментальным снимкам ..? Какое изменение я должен внести в свой сценарий выше? – prudhvi

+0

Я отредактировал мой вопрос. Пожалуйста, посмотрите его. Спасибо. – prudhvi

Смежные вопросы