【问题标题】:CloudFormation wait condition in a update stack更新堆栈中的 CloudFormation 等待条件
【发布时间】:2014-02-24 05:52:19
【问题描述】:

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

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

【问题讨论】:

  • 我认为这不可能。如果新的等待条件失败,你想做什么?要删除堆栈吗?
  • 不,我希望它被回滚。如果我创建一个具有不同逻辑名称的新等待条件,它会起作用,但我不想这样做,因为我需要更改模板。我只是想强制每次更新或更新某个位 ec2 实例时重新创建等待条件。
  • 好问题。在 AutoScaleGroup 资源上的“UpdatePolicy”支持下,可以创建新资源,同样存在同样的问题。堆栈的创建遵循适当的顺序,但是我们无法动态生成新的 WaitCondition 以确保不仅新框“正在运行”,而且在进一步开始滚动更新其他资源之前已通过 UserData 块正确配置沿着依赖链。如果我让它与 ASG 合作,我会再次对此发表评论,因为这是一种非常相似的方法。

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

很好的问题。我自己一直在寻找解决方案,但似乎这是不可能的。来自 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

【讨论】:

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

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

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

【讨论】:

  • 所以基本上我想做的事情是不可能的,我应该寻找另一种方法来检查我的更新是否成功?
  • 我不想说这是不可能的。我只是不明白怎么做。
【解决方案3】:

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

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

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

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

不优雅,但它有效:)

【讨论】:

  • 感谢您的建议。这样做的缺点是您的 CF 堆栈更新不会反映您想要的状态。如果出现故障,虽然您的管道可能会反映这一点,但您的 CF 堆栈会显示“UPDATE_COMPLETE”,对吗?
猜你喜欢
  • 2018-12-15
  • 2021-06-27
  • 2018-06-05
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多