Скрипт AWS Lambda Python не выполняет итерацию по ‘aws_account_numbers’, как ожидалось

#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’.