Как составлять списки и фильтровать стеки с облачным ресурсом boto3? - PullRequest
0 голосов
/ 09 октября 2018

Я хочу получить список стеков на основе заданного набора состояний.Мне известно о решении, использующем клиент boto3 для облачной информации, например, из документации :

response = client.list_stacks(
    NextToken='string',
    StackStatusFilter=[
        'CREATE_IN_PROGRESS'|'CREATE_FAILED'|'CREATE_COMPLETE'|
        'ROLLBACK_IN_PROGRESS'|'ROLLBACK_FAILED'|'ROLLBACK_COMPLETE'|
        'DELETE_IN_PROGRESS'|'DELETE_FAILED'|'DELETE_COMPLETE'|
        'UPDATE_IN_PROGRESS'|'UPDATE_COMPLETE_CLEANUP_IN_PROGRESS'|
        'UPDATE_COMPLETE'|'UPDATE_ROLLBACK_IN_PROGRESS'|'UPDATE_ROLLBACK_FAILED'|
        'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS'|'UPDATE_ROLLBACK_COMPLETE'|
        'REVIEW_IN_PROGRESS',
    ]
)

(примечание: я думаю, что | должно быть ,, нов любом случае)

Однако я понимаю, что «рекомендуемый» способ - использовать ресурсы boto3 для доступа к сервисам AWS.К сожалению, у ресурса облачной информации boto3 нет метода для составления списка и фильтрации стеков (см. документацию ).

Я бы хотел избежать зацикливания всех стеков и проверки каждого полученного объекта стека на предмет его статуса..

Единственный способ, который я нашел до сих пор, - это обойти доступ к клиенту ресурса, хотя он выглядит немного хакерским, и нет способа фильтрации, например, по имени стека.

cf = boto3.Session().resource('cloudformation')
cf.meta.client.list_stacks(StackStatusFilter=['ROLLBACK_COMPLETE'])

Вопрос : Есть идеи, как я мог получить что-то вроде list_stacks(StackStatusFilter=..) для cf, который является cloudformation.ServiceResource объектом, который позволяет фильтровать статус и имя стека?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Это старый пост, но я подумал, что этот подробный ответ будет полезен для других.

import boto3
COMMA = ','
GOOD_STATES = ('CREATE_COMPLETE,UPDATE_COMPLETE,UPDATE_ROLLBACK_COMPLETE').split(COMMA)
BUSY_STATES = ('CREATE_IN_PROGRESS,ROLLBACK_IN_PROGRESS,DELETE_IN_PROGRESS,UPDATE_IN_PROGRESS,UPDATE_COMPLETE_CLEANUP_IN_PROGRESS,UPDATE_ROLLBACK_IN_PROGRESS,UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS,REVIEW_IN_PROGRESS').split(COMMA)
BAD_STATES  = ('CREATE_FAILED,ROLLBACK_FAILED,DELETE_FAILED,UPDATE_ROLLBACK_FAILED,DELETE_COMPLETE,ROLLBACK_COMPLETE').split(COMMA)

cfn_rs = boto3.resource('cloudformation')

#use one of the following that serves your purpose

good_stacks = [stack for stack in cfn_rs.stacks.all() if stack.stack_status in GOOD_STATES]
good_stack_names = [stack.name for stack in cfn_rs.stacks.all() if stack.stack_status in GOOD_STATES]

busy_stacks = [stack for stack in cfn_rs.stacks.all() if stack.stack_status in BUSY_STATES]
busy_stack_names = [stack.name for stack in cfn_rs.stacks.all() if stack.stack_status in BUSY_STATES]

bad_stacks = [stack for stack in cfn_rs.stacks.all() if stack.stack_status in BAD_STATES]
bad_stack_names = [stack.name for stack in cfn_rs.stacks.all() if stack.stack_status in BAD_STATES]

my_stacks = [stack for stack in cfn_rs.stacks.all() if stack.stack_status not in BAD_STATES]
my_stack_names = [stack.name for stack in cfn_rs.stacks.all() if stack.stack_status not in BAD_STATES]

Обратите внимание на разницу между следующими двумя:

  • ROLLBACK_COMPLETE:Процесс создания стека начался и откатился после того, как некоторые ресурсы были созданы из-за некоторых сбоев.Обычно вам необходимо удалить этот стек перед созданием стека с тем же именем.
  • UPDATE_ROLLBACK_COMPLETE: Процесс обновления запущен в существующем стеке, но откатан после изменения некоторых ресурсов из-за некоторых сбоев.
0 голосов
/ 09 октября 2018

Интересный;это неудачная асимметрия в API boto.Тем не менее, я бы придерживался ресурса и использовал бы понимание списка, а не прохождение через атрибут meta:

statuses = ['ROLLBACK_COMPLETE', 'CREATE_COMPLETE', 'UPDATE_COMPLETE']
cfn = boto3.resource('cloudformation')
stacks = [stack for stack in cfn.stacks.all() if stack.stack_status in statuses]

Возвращаясь к meta.client, вы получите ответ в полных условиях, а не ресурсобъекты.Если все в порядке, просто используйте клиент cloudformation вместо ресурса.Понимание вернет Stack объекты ресурсов вместо dicts

В конечном счете, либо работает, и это вопрос предпочтений;просто избегайте смешивания парадигм, если можете.

...