Удалить снимки, кроме тех, которые имеют конкретное описание - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь удалить старые снимки AWS, но мне нужно исключить любые со значением описания, начинающимся с «Создано CreateImage».

Я пробовал варианты boto3.resource и boto3.client.

from datetime import datetime, timedelta, timezone

import boto3
client = boto3.client('ec2')
snapshots = client.snapshots.filter(Description!='Created by CreateImage')

def lambda_handler(event, context):
    for snapshot in snapshots:
        start_time = snapshot.start_time
        delete_time = datetime.now(tz=timezone.utc) - timedelta(days=790)
        if delete_time > start_time:
            snapshot.delete()
            print('Snapshot with Id = {} is deleted '.format(snapshot.snapshot_id))

Прямо сейчас у меня есть около 10 снимков старше 790 дней, 5 с описанием, которое начинается с «Создано с помощью CreateImage», и 5, которые этого не делают. При тестировании я хочу удалить эти снимки без этого описания.

ошибка, которую я получаю:

Ошибка инициализации модуля: объект 'EC2' не имеет атрибута 'snapshots'

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Вот версия, которая работает.

Обратите внимание на использование OwnerIds=['self'], которое ограничивает результаты только снимками, созданными вашей учетной записью AWS. Без этого он вернет все общедоступные снимки, созданные любой учетной записью AWS.

from datetime import datetime, timedelta, timezone

import boto3

def lambda_handler(event, context):

    delete_time = datetime.now(tz=timezone.utc) - timedelta(days=790)

    ec2_resource = boto3.resource('ec2', region_name='ap-southeast-2')
    snapshots = ec2_resource.snapshots.filter(OwnerIds=['self'])

    for snapshot in snapshots:
        if not snapshot.description.startswith('Created by CreateImage') and delete_time > snapshot.start_time:
            snapshot.delete()
            print('Snapshot with Id = {} is deleted '.format(snapshot.snapshot_id))
0 голосов
/ 29 мая 2019

Вам нужно использовать describe_snapshots и правильно передать фильтры.

Кроме того, результаты будут словарём, а не ссылками на класс Snapshot, поэтому вам нужно обновить способ извлечения атрибутов и удалить снимок.

Что-то вроде:

from datetime import datetime, timedelta, timezone

import boto3
client = boto3.client('ec2')
snapshots = client.describe_snapshots(Filters=[
        {
            'Name': 'description',
            'Values': [
                'Created by CreateImage',
            ]
        },
    ])['Snapshots']

def lambda_handler(event, context):
    for snapshot in snapshots:
        start_time = snapshot['StartTime']
        delete_time = datetime.now(tz=timezone.utc) - timedelta(days=790)
        if delete_time > start_time:
            client.delete_snapshot(SnapshotId=snapshot['SnapshotId'])
            print('Snapshot with Id = {} is deleted '.format(snapshot['SnapshotId']))

Ссылка: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.describe_snapshots

...