我想基于给定的状态获取堆栈列表。我知道使用boto3客户端进行云形成的解决方案,例如来自documentation:
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 cloudformation资源没有列出和过滤堆栈的方法(请参见the documentation)。
我想避免循环遍历所有堆栈,并检查每个检索到的堆栈对象的状态。
到目前为止,我发现的唯一方法是通过访问资源的客户端来解决该问题,尽管这感觉有些棘手,并且无法在堆栈名上进行过滤。
cf = boto3.Session().resource('cloudformation')
cf.meta.client.list_stacks(StackStatusFilter=['ROLLBACK_COMPLETE'])
问题:我不知道如何为list_stacks(StackStatusFilter=..)
得到类似cf
的东西,这是一个cloudformation.ServiceResource
对象,可以过滤状态和堆栈名称?
答案 0 :(得分:1)
有趣;这是boto API中不幸的不对称现象。也就是说,我会坚持使用资源并使用列表理解功能,而不是通过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
,您将获得dict响应而不是Resource对象。如果可以,请使用cloudformation客户端而不是资源。理解将返回Stack
个资源对象,而不是字典
最终,这两种方法都可行,这是一个优先选择的问题;请尽可能避免混合使用范式。
答案 1 :(得分:-1)
这是一篇旧文章,但我认为这个详细的答案对其他人会有所帮助。
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]
请注意以下两个区别: