更新堆栈中的CloudFormation等待条件

时间:2014-01-31 13:50:53

标签: amazon-web-services amazon-cloudformation

我有一个云形成模板,我设置了一个等待条件,以便在用户数据脚本完成执行时接收信号。这很完美!

现在我正在使用cfn-hup用新版本更新我的应用程序。我使用新参数更新堆栈,脚本下载新版本并将其安装在服务器上。但由于我没有更新等待条件资源,因此不会重新创建它,也不会等到信号。无论如何强制等待条件资源重建?

3 个答案:

答案 0 :(得分:2)

好问题。我自己一直在寻找解决方案,但看起来这似乎是不可能的。从2013 re:Invent会话:

  
      
  • cfn-hup无法与CloudFormation工作流进行交互   
        
    • 工作流程不会等待cfn-hup
    •   
    • cfn-hup无法使工作流失败
    •   
    • cfn-hup无法将数据注入堆栈
    •   
  •   

来源:http://www.slideshare.net/AmazonWebServices/aws-cloudformation-under-the-hood-dmg303-aws-reinvent-2013-28437139/72

  

"如果cfn-hup崩溃并烧伤,并且惨遭失败,那么CloudFormation   工作流程会说更新完成。"

来源:https://www.youtube.com/watch?v=ZhGMaw67Yu0&t=36m39s

答案 1 :(得分:1)

要使用CloudFormation更新应用程序,您需要更新Instance或LaucnConfig项目的“元数据”部分中的数据。在您的情况下,您更改“元数据”部分中引用的参数的值。我猜测“源”正在更新?您的实例上的cron作业设置为运行cfn-hup,当它执行时,它会读取CloudFormation堆栈中的信息并发现它已更改。然后它执行hooks.conf文件中指定的操作(或在hooks.d目录中的文件中指定的操作),这通常是运行cfn-init。命令cfn-init从指定的源检索所有文件,并运行“元数据”部分中指定的所有命令。结果是更新的应用程序。

对于“重新激活”的等待条件,必须告诉它,顺便说一句,我认为这不可行。由于您唯一要更改的是实例元数据,并且所有操作都发生在实例的本地,因此我不认为您尝试执行的操作是可能的。必须创建一个新的等待条件并通过cfn-signal发出信号(我相信必须在hooks.conf中调用)。一个有趣的场景:如果发生以下情况该怎么办:重命名等待条件并更改更新的元数据。实例未能发出完整信号,CloudFormation将模板回滚到之前的状态。在下次调用cfn-hup时,实例看到堆栈已更改,但是reversion挂起并再次无法完成信号。我们会陷入无限循环吗?

答案 2 :(得分:1)

感谢分享,我遇到了类似的问题,我已经创建了自己的解决方案,即使它不是很好,但我很乐意在这里分享:

这里的关键问题是cfn-hup以异步方式运行,我们无法将其挂钩回到cloudformation。

这是我的解决方案: - 作为cfn-auto-reload.conf的一部分,    - 我们调用cfn-init cmd来更新堆栈,    - 我们使用另一个脚本来捕获cfn-init cmd的退出代码和已安装应用的版本,    - 然后将它们放在S3上的文件中。

  • 然后作为CI管道上部署的后续工作,验证任务将在S3上检查此文件,以验证退出代码和版本。

不优雅,但有效:)