Python 如何列出和筛选具有Bot3 cloudformation资源的堆栈?
我想得到一个基于给定状态集的堆栈列表。我知道有一种解决方案使用boto3客户端进行云计算,例如: (旁注:我认为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资源访问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完成:更新过程在现有堆栈上启动,但由于某些失败而在修改某些资源后回滚
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]