Как удалить снимки с тегом, установив срок хранения - PullRequest
0 голосов
/ 11 июня 2019

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

from botocore.exceptions import ClientError
import datetime

# Set the global variables
globalVars  = {}
globalVars['Owner']                 = "Cloud"
globalVars['Environment']           = "Test"
globalVars['REGION_NAME']           = "ap-south-1"
globalVars['tagName']               = "Testing"
globalVars['findNeedle']            = "DeleteOn"
globalVars['RetentionDays']         = "1"
globalVars['tagsToExclude']         = "Do-Not-Delete"

ec2_client = boto3.client('ec2')

"""
This function looks at *all* snapshots that have a "DeleteOn" tag containing
the current day formatted as YYYY-MM-DD. This function should be run at least
daily.
"""

def janitor_for_snapshots():
    account_ids = list()
    account_ids.append( boto3.client('sts').get_caller_identity().get('Account') )

    snap_older_than_RetentionDays = ( datetime.date.today() - datetime.timedelta(days= int(globalVars['RetentionDays'])) ).strftime('%Y-%m-%d')
    delete_today = datetime.date.today().strftime('%Y-%m-%d')

    tag_key = 'tag:' + globalVars['findNeedle']
    filters = [{'Name': tag_key, 'Values': [delete_today]},]

    # filters={ 'tag:' + config['tag_name']: config['tag_value'] }

    # Get list of Snaps with Tag 'globalVars['findNeedle']'
    snaps_to_remove = ec2_client.describe_snapshots(OwnerIds=account_ids,Filters=filters)

    # Get the snaps that doesn't have the tag and are older than Retention days
    all_snaps = ec2_client.describe_snapshots(OwnerIds=account_ids)
    for snap in all_snaps['Snapshots']:
        if snap['StartTime'].strftime('%Y-%m-%d') <= snap_older_than_RetentionDays:
            snaps_to_remove['Snapshots'].append(snap)

    snapsDeleted = {'Snapshots': []}

    for snap in snaps_to_remove['Snapshots']:
        try:
            ec2_client.delete_snapshot(SnapshotId=snap['SnapshotId'])
            snapsDeleted['Snapshots'].append({'Description': snap['Description'], 'SnapshotId': snap['SnapshotId'], 'OwnerId': snap['OwnerId']})
        except ClientError as e:
            if "is currently in use by" in str(e):
                print("Snapshot {} is part of an AMI".format(snap.get('SnapshotId')))

    snapsDeleted['Status']='{} Snapshots were Deleted'.format( len(snaps_to_remove['Snapshots']))

    return snapsDeleted

def lambda_handler(event, context):
    return janitor_for_snapshots()

if __name__ == '__main__':
    lambda_handler(None, None)

Я хочу удалить снимки только с тегом "DeleteOn". Но этот скрипт удаляет все, что прошло срок хранения. Это не проверка части тега.

Пожалуйста, проверьте и помогите по этому вопросу. Спасибо.

1 Ответ

0 голосов
/ 13 июня 2019

Если вы спрашиваете, как исправить код, чтобы он удалял только снимки, которые:

  • Имеют данный тег, И
  • прошел срок хранения

затем внимательно посмотрите на свой код.

Эта часть:

# Get list of Snaps with Tag 'globalVars['findNeedle']'
snaps_to_remove = ec2_client.describe_snapshots(OwnerIds=account_ids,Filters=filters)

получает список снимков по тегу. Отлично!

Тогда эта часть:

# Get the snaps that doesn't have the tag and are older than Retention days
all_snaps = ec2_client.describe_snapshots(OwnerIds=account_ids)
for snap in all_snaps['Snapshots']:
    if snap['StartTime'].strftime('%Y-%m-%d') <= snap_older_than_RetentionDays:
        snaps_to_remove['Snapshots'].append(snap)

получает НОВЫЙ список снимков и проверяет сохранение.

Затем полученный snaps_to_remove содержит результаты ОБА из них.

Вам нужно будет объединить свою логику, чтобы она добавляла только снимки, соответствующие обоим критериям, а не составляла список снимков по отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...