Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何列出和筛选具有Bot3 cloudformation资源的堆栈?_Python_Amazon Web Services_Amazon Cloudformation_Boto3 - Fatal编程技术网

Python 如何列出和筛选具有Bot3 cloudformation资源的堆栈?

Python 如何列出和筛选具有Bot3 cloudformation资源的堆栈?,python,amazon-web-services,amazon-cloudformation,boto3,Python,Amazon Web Services,Amazon Cloudformation,Boto3,我想得到一个基于给定状态集的堆栈列表。我知道有一种解决方案使用boto3客户端进行云计算,例如: (旁注:我认为|应该是,,但无论如何) 但是,我知道“推荐”的方式是使用boto3资源访问AWS服务。不幸的是,boto3 cloudformation资源没有列出和筛选堆栈的方法(请参阅) 我希望避免在所有堆栈上循环,并检查每个检索到的堆栈对象的状态 到目前为止,我发现的唯一方法是通过访问资源的客户机来解决问题,尽管这感觉有点不太正常,并且没有办法对stackname进行过滤 cf = boto3

我想得到一个基于给定状态集的堆栈列表。我知道有一种解决方案使用boto3客户端进行云计算,例如:

(旁注:我认为
|
应该是
,但无论如何)

但是,我知道“推荐”的方式是使用boto3资源访问AWS服务。不幸的是,boto3 cloudformation资源没有列出和筛选堆栈的方法(请参阅)

我希望避免在所有堆栈上循环,并检查每个检索到的堆栈对象的状态

到目前为止,我发现的唯一方法是通过访问资源的客户机来解决问题,尽管这感觉有点不太正常,并且没有办法对stackname进行过滤

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

问题:你知道如何为
cf
获取类似
list\u堆栈(StackStatusFilter=…)
的东西吗,这是一个
cloudformation.ServiceResource
对象,允许对状态和堆栈名进行筛选?

有趣;这是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响应,而不是资源对象。如果可以的话,只需使用cloudformation客户端而不是资源。理解将返回
Stack
资源对象,而不是dict


最终,两者中的任何一个都会起作用,这是一个偏好的问题;如果可以的话,尽量避免混用范例。

这是一篇老文章,但我认为这个详细的答案会对其他人有所帮助

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]
请注意以下两者之间的差异:

  • 回滚_COMPLETE:堆栈创建过程已启动,并在由于某些失败而创建某些资源后回滚。通常,在创建具有相同名称的堆栈之前,需要删除此堆栈
  • 更新\u回滚\u完成:更新过程在现有堆栈上启动,但由于某些失败而在修改某些资源后回滚

谢谢@bimsapi这基本上是我目前的解决方案。但是,像这样,我必须迭代整个堆栈集。如果没有API支持,这是唯一的选择,并且开销不大。我认为更重要的问题是决定资源与客户端,并在代码中坚持一致性。cf.staks.all()只列出“活动”堆栈,因此它不适用于DELETE\u COMPLETE等状态。换句话说,您将需要使用client.list_堆栈来查询这些状态。stacks1=cf.meta.client.list_stacks(StackStatusFilter=['DELETE_COMPLETE'])stacks2=[cf.stacks.all()如果stack.stack_status处于['DELETE_COMPLETE']]状态,则stacks1将为您提供已删除堆栈的列表,而stacks2将始终为您提供空列表。对于具有大量堆栈的环境,可能使用boto3客户端是一种方式,因此过滤器应用于AWS端,而不是您在客户端对其进行过滤。我喜欢这个解决方案:
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]