Поиск сценария Python для удаления снимка AWS с указанием идентификатора или имени экземпляра в качестве параметра с датой хранения - PullRequest
0 голосов
/ 12 апреля 2020

Привет! Я ищу сценарий python для удаления моментального снимка, указав в качестве параметра идентификатор моментального снимка или имя экземпляра и срок хранения. У меня есть сценарий ниже, который удаляет все снимки старше, чем заданный период хранения, однако хочу выполнить удаление только для указанного c имени экземпляра.

# Delete snapshots older than retention period

import boto3
from botocore.exceptions import ClientError

from datetime import datetime,timedelta

def delete_snapshot(snapshot_id, reg):
    try:
        ec2resource = boto3.resource('ec2', region_name=reg)
        snapshot = ec2resource.Snapshot(snapshot_id)
        snapshot.delete()
    except ClientError as e:
        print "Caught exception: %s" % e

    return

def lambda_handler(event, context):
    account_id = 'xxxxxxxxxxxxxxx'
    retention_days = 10
    # Get current timestamp in UTC
    now = datetime.now()

    # AWS Account ID

    # Define retention period in days

    # Create EC2 client
    ec2 = boto3.client('ec2')

    # Get list of regions
    regions = ec2.describe_regions().get('Regions',[] )

    # Iterate over regions
    for region in regions:
        print "Checking region %s " % region['RegionName']
        reg=region['RegionName']

        # Connect to region
        ec2 = boto3.client('ec2', region_name=reg)

        # Filtering by snapshot timestamp comparison is not supported
        # So we grab all snapshot id's
        result = ec2.describe_snapshots( OwnerIds=[account_id] )

        for snapshot in result['Snapshots']:
            print "Checking snapshot %s which was created on %s" % (snapshot['SnapshotId'],snapshot['StartTime'])

            # Remove timezone info from snapshot in order for comparison to work below
            snapshot_time = snapshot['StartTime'].replace(tzinfo=None)

            # Subtract snapshot time from now returns a timedelta
            # Check if the timedelta is greater than retention days
            if (now - snapshot_time) > timedelta(retention_days):
                print "Snapshot is older than configured retention of %d days" % (retention_days)
                delete_snapshot(snapshot['SnapshotId'], reg)
            else:
                print "Snapshot is newer than configured retention of %d days so we keep it" % (retention_days)

1 Ответ

0 голосов
/ 14 апреля 2020

Похоже, вы спрашиваете, как определить, какой экземпляр Amazon EC2 связан с данным снимком.

Простой способ - добавить тег при создании снимка с тегом. содержащий идентификатор экземпляра и, возможно, даже теги из экземпляра. Это означает, что вся соответствующая информация будет прикреплена к самому снимку.

В противном случае вы можете:

  • Получить VolumeId из результатов describe_snapshots()
  • Вызовите describe_volumes(), передав VolumeId
  • Если том все еще подключен к экземпляру EC2, тогда Attachments.InstanceId предоставит идентификатор экземпляра

Если том не прикрепленный к экземпляру, эта информация будет недоступна. Однако при запуске экземпляра теги могут распространяться от экземпляра к тому. Это может быть хорошим способом определения назначения тома.

Можно также использовать другой подход:

  • Начать со списка идентификаторов экземпляров
  • Для каждого экземпляра:
    • Позвоните describe_instance(), чтобы получить VolumeId подключенных томов
    • Позвоните describe_snapshots(), передав VolumeId

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

Вы можете сделать то же самое с тегами, вызвав describe_instances() для данного тег, затем l oop через каждый полученный экземпляр.

...