以编程方式利用通过 CloudFormation 创建的资源

Programmatically utilize resources created with CloudFormation

我正在使用 AWS CloudFormation 创建一堆应用程序资源,创建资源时,CloudFormation 会在名称末尾添加一个散列以使其唯一。

即如果您想创建一个 Kinesis 流名称 MyStream,实际名称将类似于 my-stack-MyStream-1F8ISNCLP0W4O.

我希望能够以编程方式访问资源,而无需知道散列,无需查询 AWS 以获取我的资源以自己匹配名称,并且无需手动步骤。有人知道以编程方式和可预测的方式在您的应用程序中使用 AWS 资源的简便方法吗?

以下是我能想到的不太理想的选择:

  1. 在资源上设置标签(即name -> MyStream)并查询 AWS 以获取实际资源名称。
  2. 向 AWS 查询资源名称列表并查找与预期名称部分匹配的内容。
  3. 创建资源后,手动将实际名称复制到配置文件中(可能是这些选项中最明智的)

您可以使用 CloudFormation API 获取堆栈中的资源列表。这将为您提供一个逻辑 ID 列表(即 CloudFormation 模板中没有哈希的名称)和匹配的物理 ID(带有堆栈名称和哈希)。使用 AWS CLI,这将显示两个 ID 之间的映射:

aws cloudformation describe-stack-resources
    --query StackResources[].[LogicalResourceId,PhysicalResourceId]
    --stack-name <my-stack>

Amazon 提供的所有各种语言 SDK 中都提供了用于执行相同查询的 CloudFormation API。

您可以通过在运行时查询 CloudFormation 或 #3,通过在构建时查询 CloudFormation 并将结果嵌入到配置文件中,将其用作 #1 的替代方法。我看不出使用自己的标签比简单地查询 CF API 有任何优势。 #2 如果您希望来自同一模板的两个或多个堆栈共存,则会出现问题。

我同时使用了运行时和构建时方法。构建时方法可让您删除对 CloudFormation 的依赖或知识,但需要在配置文件中包含堆栈特定信息。我喜欢允许将同一个构建部署到多个堆栈的运行时方法,它只需要堆栈名称即可找到所有相关资源。