如何确定AWS资源所属的CloudFormation堆栈?

时间:2016-09-22 16:18:47

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

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

4 个答案:

答案 0 :(得分:2)

您可以将test.foo(); 资源传递给PhysicalResourceId并获取堆栈信息(如果它属于CF堆栈) 例如,找到EC2主机

desribe_stack_resources

AWS文档 http://boto3.readthedocs.io/en/latest/reference/services/cloudformation.html#CloudFormation.Client.describe_stack_resources

答案 1 :(得分:2)

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

某些资源根本不支持标记,因此您必须扫描堆栈。

三个标签被添加到Cloudformation生成的资源中,所有这些名称都被AWS保留:

  • aws:cloudformation:stack-name
  • aws:cloudformation:stack-id
  • aws:cloudformation:logical-id

Cloudformation将允许您通过堆栈的名称或ID查找堆栈。但是,我们不应该使用该名称。

最好,您要按stack-id进行查找,并检查堆栈状态以查看其是否为活动堆栈。

stack-id使我们能够正确处理堆栈删除,因为一旦具有给定堆栈ID的堆栈为DELETE_COMPLETE,它就永远不会退出该状态。

考虑这种情况:

我们使用AWS :: HypotheticalResource创建一个名为ExampleStack的堆栈。假设标签将被标记为ExampleStack和ID arn:...:1234

假设我们将资源标记为在删除期间保留,然后删除堆栈。

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

如果我们查看arn:...:1234,Cloudformation会告诉我们堆栈状态为“ DELETE_COMPLETE”,因此我们知道它曾经与活动堆栈相关联。如果我们按堆栈名称进行搜索,则会错误地将我们定向到 new 堆栈。

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

我们可以进一步检查logical-id使其与stack's resources中的逻辑ID相匹配,并确定特定资源是否有故障,例如它可能处于DELETE_FAILED状态。

相关API

没有获取标签的标准方法,不幸的是,通常您必须创建正确的ARN。例如,对于DynamoDB,一个API是ListTagsOfResource,但有时在它们的describe方法中。通常,只需在boto的docs中搜索服务页面上的“标签”,就可以轻松找到它。据我所知,Cloudformation标记本身就是标准的。

DescribeStacks API;请注意,StackName是您将ID传递给的参数,它应该是(IIRC)ARN的UUID部分。

答案 2 :(得分:1)

是。 Boto3 CF 客户有获取所需信息的方法。

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']

答案 3 :(得分:1)

您还可以使用AWS CLI确定资源所属的堆栈:

aws cloudformation describe-stack-resources --physical-resource-id "resourceId"