我有一个云形成模板,我设置了一个等待条件,以便在用户数据脚本完成执行时接收信号。这很完美!
现在我正在使用cfn-hup用新版本更新我的应用程序。我使用新参数更新堆栈,脚本下载新版本并将其安装在服务器上。但由于我没有更新等待条件资源,因此不会重新创建它,也不会等到信号。无论如何强制等待条件资源重建?
答案 0 :(得分:2)
好问题。我自己一直在寻找解决方案,但看起来这似乎是不可能的。从2013 re:Invent会话:
- cfn-hup无法与CloudFormation工作流进行交互
- 工作流程不会等待cfn-hup
- cfn-hup无法使工作流失败
- cfn-hup无法将数据注入堆栈
"如果cfn-hup崩溃并烧伤,并且惨遭失败,那么CloudFormation 工作流程会说更新完成。"
答案 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上的文件中。
不优雅,但有效:)