#python-3.x #amazon-web-services #aws-lambda
#python-3.x #amazon-web-services #aws-lambda
Вопрос:
У меня есть функция AWS Lambda, написанная на Python 3.7, функция настроена на удаление снимков старше 120 дней. Я запускаю это из учетной записи управления и использую 2 дочерние учетные записи, используя ‘aws_account_numbers’. Функция выполняется успешно, но в CloudWatch в журналах отображаются одинаковые снимки, удаляемые для каждой учетной записи. В журнале показано, что снимок x y z удален для AccountA, но затем он показывает, что те же снимки x y z удаляются для AccountB. На самом деле происходит то, что все эти моментальные снимки не хранятся в AccountA или AccountB, а фактически хранятся в учетной записи управления.
from datetime import datetime, timedelta, timezone
import boto3
import collections
import sys
from botocore.exceptions import ClientError
region ='us-east-1'
aws_account_numbers = {"accountA":"xxxxxxxxxxxx", "accountB":"xxxxxxxxxxxx"}
def lambda_handler(event, context):
delete_time = datetime.now(tz=timezone.utc) - timedelta(days=120)
ec2_resource = boto3.resource('ec2')
snapshots = ec2_resource.snapshots.filter(OwnerIds=['self'])
for name, acctnum in aws_account_numbers.items():
roleArn = "arn:aws:iam::%s:role/EOTSS-Snapshot-Cleanup-120days" % acctnum
stsClient = boto3.client('sts')
sts_response = stsClient.assume_role(RoleArn=roleArn,RoleSessionName='AssumeCrossAccountRole', DurationSeconds=1800)
ec2 = boto3.resource(service_name='ec2',region_name=region,aws_access_key_id = sts_response['Credentials']['AccessKeyId'],
aws_secret_access_key = sts_response['Credentials']['SecretAccessKey'], aws_session_token = sts_response['Credentials']['SessionToken'])
for snapshot in snapshots:
try:
if not snapshot.description.startswith('Snapshot created by task soe-backup') and delete_time > snapshot.start_time:
#snapshot.delete()
print ("Snapshot %s is deleted in acct: %s" % (snapshot, acctnum))
except ClientError as e:
if e.response['Error']['Code'] == 'InvalidSnapshot.InUse':
print ("Snapshot %s in use in acct: %s" % (snapshot, acctnum))
continue
else:
print("Unexpected error: %s" % e)
continue
return 'Execution Complete'
Комментарии:
1. Вы обращаетесь
snapshots = ec2_resource
к своей учетной записи управления. Его следует вызывать после того, как вы возьмете на себя роль для других учетных записей.2. То, что вы говорите, имеет для меня логический смысл, я внес это изменение плюс исправил отступы, но я все равно получаю тот же результат.
3. Я не уверен, как опубликовать мой новый код здесь, кроме строки ‘snapshots = ec2_resource.snapshots. фильтр (OwnerIds = [‘self’]) ‘ был перемещен вниз в раздел ‘для имени, acctnum’.