如何使用boto3 cloudformation资源列出和过滤堆栈?

时间:2018-10-09 09:18:26

标签: python amazon-web-services amazon-cloudformation boto3

我想基于给定的状态获取堆栈列表。我知道使用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对象,可以过滤状态和堆栈名称?

2 个答案:

答案 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]

请注意以下两个区别:

  • ROLLBACK_COMPLETE:由于某些故障而创建了一些资源后,堆栈创建过程开始并回滚。通常,您需要先删除此堆栈,然后再创建具有相同名称的堆栈。
  • UPDATE_ROLLBACK_COMPLETE:更新过程在现有堆栈上开始,但由于某些故障而在修改了一些资源后回滚了。