从一个CloudFormation堆栈获取信息以在另一个CloudFormation堆栈中使用

我正在尝试为AWS中的Web服务设置构buildpipe道。 计划是让服务在Auto Scale Group中运行,并使用Jenkins构build一个一次性的EC2实例,运行testing,并成功映像实例并将其传递给现有的Auto Scale Group。

为了创build所有必要的资源,我创build了两个CloudFormation模板,一个用于构buildAutoscale组和周围的资源,另一个用于构build一个可testing的实例。

我已经注意到这个问题:每个区域和每个EC2实例types有不同的基础图像。 这意味着,jenkins需要知道该地区和实例typesbuild立。

理想的解决scheme是select目标CloudFormation堆栈,并从那里拉取信息(区域,实例types等)。 这意味着如果我们对Auto Scale Group进行任何更改,它们将自动反映在Jenkins版本中。 如果我们创build了第二个组,我们可以复制Jenkins作业并更改一个参数,将它指向新的堆栈。 但是这似乎不是一个选项…

这些是我能想到的潜在解决scheme,但我并不特别喜欢它们中的任何一个:

  • 在两个模板中硬编码这个信息
    这与CF模板的想法背道而驰,因为我理想的是要保持这些东西的灵活性。

  • 将信息发送给API,然后让Jenkins查找它
    这是相当多的额外工作,因为我必须构build和维护一台机器来存储一些variables。 更不用说,我不确定是否可以通过脚本将信息输出到API,因此必须将其包装在另一个脚本中,才能从AWS CLI工具中获取信息。

  • 分类最终的图像
    我可以允许所有参数的灵活性,然后通过这些参数对最终图像进行分类。 然后我可以确保自动缩放组只加载具有正确参数的图像。 这将防止使用不正确的基本图像,但可能导致构build与错误的信息(如果我们改变一个,我们必须记得改变另一个)。

感觉就像我想做的事情不应该那么难,但我不能找出最好的办法。

CloudFormation包含一个伪参数AWS::Region ,可以查询它在哪个区域运行。 见http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html

您可以使用映射来根据区域selectAMI的AMI图像列表。 请参阅http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-findinmap.html

通常,AMI的select不受实例types的影响。 但是,我不熟悉你的用例,所以它可能很重要。

至于你的工作stream程,我不会“改变”你的Autoscaling组。 它应该是另一种方式:更改您的CloudFormation模板,然后更新您的堆栈以更新您的Autoscaling组。

所以你会:

  1. 从您的CFN模板构build您的单一实例,确认它是否有效,并构build新的AMI。
  2. 采取新的AMI图像ID并更新您的自动缩放组的CFN模板。
  3. 通过更新堆栈来更新您的自动扩展组

直接对自动缩放组进行更改的危险是这些更改不会反映在堆栈的模板中。 如果您不得不重build堆栈或复制副本,则会丢失这些更改。 理想情况下,从CloudFormation堆栈创build的资源应被视为只读,并且只能通过更改CFN模板进行更新。

上面列出的一个稍微好一点的选项(实际上是一种可能性)是使用AWS CLI工具来获取有关当前堆栈的信息。 这可以包装在脚本中,以获取返回的JSON并find所需的参数/输出。

它仍然通过将其移动到外部脚本而不是将其混淆在CloudFormation模板中,所以我将把问题留在开放中,希望有人有更好的答案。

这是一个荒谬简单的例子:

 <?php $result = `aws cloudformation describe-stacks --stack-name=GROUPSTACKNAME`; $stack = json_decode($result); $stack = $stack->Stacks[0]; if(!$stack) { throw new Exception("Stack no found"); } $parameters = []; foreach($stack->Parameters as $param) { $parameters[$param->ParameterValue] = $param->ParameterKey; } echo http_build_query($parameters); 

将您需要传输的信息定义为来自第一个堆栈的输出。 使用区域的伪参数等

当你创build第二个堆栈时,在第一个堆栈上调用describe-stack来获得输出,并将参数值传递给第二个堆栈。