Эффективный способ проверить, что у тысяч экземпляров EC2 есть Снимок? - PullRequest
0 голосов
/ 12 марта 2020

Мне поручено разработать способ обеспечения того, чтобы у всех запущенных экземпляров был текущий снимок (обычно выполняется ежедневно). В настоящее время я делаю следующее:

  1. Разбивка на все экземпляры
  2. Перекрестная ссылка на идентификатор тома с любым снимком с этим идентификатором тома
  3. Фильтровать только снимки, созданные «сегодня» .

Мой код работает, он очень медленный ... Это не подойдет для организации с десятками тысяч экземпляров. Какими способами я мог бы ускорить это, не превышая ограничение скорости для вызова API?

Код:

'''
Checks for a current snapshot for every instance, if it has one it is compliant, otherwise non-compliant.
'''

from datetime import datetime, date, timedelta
import boto3
ec2client = boto3.client('ec2', region_name='us-east-1')

# Create a  Paginator
paginator = ec2client.get_paginator('describe_instances')
instances = paginator.paginate().build_full_result()

for reservation in instances["Reservations"]:
    for instance in reservation["Instances"]:

        # Set base value
        compliant = "Non-compliant"

        # Lists all storage devices attached to instance.
        block_device_mappings = instance["BlockDeviceMappings"]

        for block in block_device_mappings:
            ebs = block.get("Ebs", False)

            # Volume ID of instances storage, use to find Snapshots.
            volume_id = ebs.get("VolumeId", False)

            # Wild card for filtering snapshots that occured today
            compliant_time_frame = date.isoformat(date.today()) + '*'

            snapshots = ec2client.describe_snapshots(
                    Filters=[
                    {'Name': 'volume-id','Values': [volume_id]},
                    {'Name': 'start-time', 'Values': [compliant_time_frame]}
                ]
            )
            snapshots = snapshots.get("Snapshots", [])

            # If snapshots exist, instance is compliant
            # We have already drilled down for current snapshots in .describe_snapshots() filter
            if len(snapshots) > 0:
                compliant = "Compliant"

        print(instance.get("InstanceId"), compliant)

1 Ответ

2 голосов
/ 13 марта 2020

Похоже, что код вызывает describe_snapshots() для каждого экземпляра.

Вероятно, будет быстрее сначала получить список ВСЕХ снимков , созданных в течение требуемого периода времени. Сохраните их в списке или словаре.

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

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