Поиск неиспользуемого ресурса в AWS - если значение найдено в одном из ключей списка словарей - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь найти неиспользуемые ресурсы (экземпляры ec2, группы автоматического масштабирования, балансировщики нагрузки). Я объявляю это неиспользованным, если идентификатор стека ресурса 1. ни в одном из стеков, которые я получил от list_stacks (). 2. в одном из стеков, которые я получил в качестве ответа от list_stacks (), но его StackStatus имеет значение «DELETE_COMPLETE».

Для группы автоматического масштабирования я создал класс:

class AutoScalingGroup:
def __init__(self):
    self.asgName=''
    self.validity='vikas'
    self.asgTags={}
    self.asgStackId=''
    self.asgStackName=''

Я нахожу все детали класса, используя следующий код:

asg = session.client('autoscaling', region_name='us-west-2')
asg_groups = asg.describe_auto_scaling_groups()
asgs = []
for asgroup in asg_groups['AutoScalingGroups']:
    asg = AutoScalingGroup()
    asg.asgName = asgroup['AutoScalingGroupName']
    for tag in asgroup['Tags']:
        if (tag['Key'] == 'aws:cloudformation:stack-name'):
            asg.asgStackName = tag['Value']
        if(tag['Key'] == 'aws:cloudformation:stack-id'):
            asg.asgStackName = tag['Value']
    asgs.append(asg)

У меня есть атрибут валидности для группы. Ниже мой код, чтобы найти, если группа "notinuse". Ниже мой исходный код:

for asg in asgs:
if (stack['StackId']==asg.asgStackId for stack in stacks['StackSummaries']):
    if stack['StackStatus'] == 'DELETE_COMPLETE':
        asg.validity = 'notinuse'
else:
    asg.validity = 'notinuse'

Но приведенный выше код дал мне сообщение об ошибке, что в третьей строке: if stack['StackStatus'] == 'DELETE_COMPLETE' стек не определен. Я понимаю, что поскольку стек является локальным только для цикла for выше.

Я также попробовал следующий код

for asg in asgs:
if (stack['StackId']==asg.asgStackId for stack in stacks['StackSummaries']):
    a = '1'
else:
    asg.validity = 'notinuse'
for asg in asgs:
for stack in stacks['StackSummaries']:
    if stack['StackId']==asg.asgStackId:
        if stack['StackStatus'] == 'DELETE_COMPLETE':
            asg.validity = 'notinuse'
        else:
            asg.validity = 'inuse'

Но это не дает мне правильных результатов. Я хочу найти, что у asg эти стековые идентификаторы не присутствуют в стековых идентификаторах (list-stacks from cloudformation), и если они присутствуют и их статус равен «DELETE-COMPLETE». Пожалуйста, дайте мне знать, где я получаю это неправильно.

Код, который я использовал для получения списка стеков:

stacks = cf.list_stacks()

Ниже показано, как выглядят стеки:

{
'StackSummaries': [{
    'StackId': 'arn:aws:cloudformation:us-west-2:****************************:stack/PSSIdataEXTRscripts-PROD-West/****************************',
    'StackName': 'PSSIdataEXTRscripts-PROD-West',
    'TemplateDescription': 'COFI PSSI EXTR CFT',
    'CreationTime': datetime.datetime(2018, 10, 26, 22, 50, 14, 113000, tzinfo = tzutc()),
    'DeletionTime': datetime.datetime(2018, 10, 26, 23, 3, 3, 739000, tzinfo = tzutc()),
    'StackStatus': 'DELETE_COMPLETE'
}, {
    'StackId': 'arn:aws:cloudformation:us-west-2:*************:stack/ASVBROKERAGEWEBMOBILE-West-a/****************************',
    'StackName': 'ASVBROKERAGEWEBMOBILE-West-a',
    'TemplateDescription': '****************************',
    'CreationTime': datetime.datetime(2018, 10, 26, 21, 4, 26, 469000, tzinfo = tzutc()),
    'DeletionTime': datetime.datetime(2018, 10, 26, 21, 22, 14, 707000, tzinfo = tzutc()),
    'StackStatus': 'DELETE_COMPLETE'
}],
'NextToken': '**********************************',
'ResponseMetadata': {
    'RequestId': '*****************************',
    'HTTPStatusCode': 200,
    'HTTPHeaders': {
        'x-amzn-requestid': '**************************',
        'content-type': 'text/xml',
        'content-length': '40907',
        'vary': 'Accept-Encoding',
        'date': 'Mon, 05 Nov 2018 01:47:31 GMT'
    },
    'RetryAttempts': 0
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...