【问题标题】:Programmatically utilize resources created with CloudFormation以编程方式利用使用 CloudFormation 创建的资源
【发布时间】:2016-08-30 03:45:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 3 号是我们所做的。我们只是从堆栈中获取输出并将每个键/值对写入一个由 bash 获取的文件。然后这些输出总是可以从process.env 对象获得。

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


【解决方案1】:

您可以使用 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 的依赖或了解,但需要在配置文件中提供堆栈特定信息。我喜欢运行时方法,它允许将相同的构建部署到多个堆栈,并且只需要堆栈名称即可找到所有相关资源。

【讨论】:

  • 我使用过 CloudFormation API describe-stack-resources,我同意这是对直接查询服务的改进。如果您可以在最后排除哈希,您可以即时构建资源名称,但这还不是一个功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多