Мне поручено разработать способ обеспечения того, чтобы у всех запущенных экземпляров был текущий снимок (обычно выполняется ежедневно). В настоящее время я делаю следующее:
- Разбивка на все экземпляры
- Перекрестная ссылка на идентификатор тома с любым снимком с этим идентификатором тома
- Фильтровать только снимки, созданные «сегодня» .
Мой код работает, он очень медленный ... Это не подойдет для организации с десятками тысяч экземпляров. Какими способами я мог бы ускорить это, не превышая ограничение скорости для вызова 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)