Amazon web services 如何确定AWS资源所属的云信息堆栈?

Amazon web services 如何确定AWS资源所属的云信息堆栈?,amazon-web-services,amazon-cloudformation,boto3,Amazon Web Services,Amazon Cloudformation,Boto3,boto3中是否有可靠的方法来确定AWS资源所属的云信息堆栈?或者它是否属于一个堆栈?假设我有一个DynamoDB表或一个EC2实例,我如何找出它是哪个堆栈的成员?用于CloudFormation的boto3 API在资源级别上变得相当模糊,或者看起来是这样。非常感谢您的帮助。是的。 客户端具有获取所需信息的方法 cf = boto3.client('cloudformation' stacks = cf.list_stacks(StackStatusFilter=['CREATE_COMPLE

boto3中是否有可靠的方法来确定AWS资源所属的云信息堆栈?或者它是否属于一个堆栈?假设我有一个DynamoDB表或一个EC2实例,我如何找出它是哪个堆栈的成员?用于CloudFormation的boto3 API在资源级别上变得相当模糊,或者看起来是这样。非常感谢您的帮助。

是的。 客户端具有获取所需信息的方法

cf = boto3.client('cloudformation'
stacks = cf.list_stacks(StackStatusFilter=['CREATE_COMPLETE'])['StackSummaries'] 
将返回已完成堆栈的堆栈摘要。根据需要更换过滤器

获取堆栈的名称

names = [stack['StackName'] for stack in stacks]
然后获取给定堆栈的所有堆栈资源

for name in names:
  resources = cf.describe_stack_resources(StackName=name)['StackResources']

您可以将资源的
PhysicalResourceId
传递给
desribe\u stack\u resources
,如果它属于CF堆栈,则可以获取堆栈信息 例如,查找EC2主机

cf = boto3.client('cloudformation')
cf.describe_stack_resources(PhysicalResourceId="i-07bd92638b049ccc4")
AWS关于此的文档

没有单个API来确定资源属于哪个堆栈,但是,资源将使用反映原始堆栈的标记来构造。(AWS标记是通过所有服务都与之通信的内部服务完成的,然后它们通过自己的API公开该服务。)

有些资源根本不支持标记,因此您必须扫描堆栈以查找这些标记

Cloudformation生成的资源中添加了三个标记,AWS保留了所有这些名称:

  • aws:cloudformation:堆栈名称
  • aws:cloudformation:堆栈id
  • aws:cloudformation:逻辑id
Cloudformation将允许您通过名称或ID查找堆栈。但是,我们不应该使用该名称

最好是通过
堆栈id
查找堆栈状态,查看它是否为活动堆栈

堆栈id
允许我们正确处理堆栈删除,因为具有给定堆栈id的堆栈一旦完成删除,就永远不会退出该状态

考虑以下情况:

我们创建了一个名为ExampleStack的堆栈,其中包含一个AWS::hypoticalResource。将使用名称ExampleStack和ID
arn:…:1234
标记该假设

假设我们在删除过程中将该资源标记为保留,然后删除堆栈

现在我们重新创建堆栈,相同的模板,相同的名称。现在有一个新的假设,它被标记为ExampleStack和ID
arn:…:4567

如果我们查找
arn:…:1234
,Cloudformation将告诉我们堆栈状态为“DELETE_COMPLETE”,因此我们知道它曾经与活动堆栈关联。如果按堆栈名称搜索,则会错误地将我们指向新的堆栈

如果我们查找
arn:…:4567
,我们可以看到堆栈状态为“CREATE_COMPLETE”,因此它与活动堆栈相关联

我们可以进一步检查
逻辑id
,将其与中的逻辑id匹配,并确定特定资源是否出现故障,例如,它可能处于
删除\u失败的状态

相关API 没有标准的方法来获取标签,不幸的是,通常您必须创建正确的ARN。例如,一个API是针对DynamoDB的,但有时它在其描述方法中。一般来说,只要在boto的文档中搜索服务页面上的“标签”,你就会很容易找到它。据我所知,Cloudformation标签本身是标准的


空气污染指数;请注意,StackName是您将ID传递给的参数,它应该是(IIRC)ARN的UUID部分。

您还可以使用AWS CLI确定资源属于哪个堆栈:


aws cloudformation描述堆栈资源--物理资源id“resourceId”

DynamoDB表的物理资源id是表名。