使用 CloudFormation 更新流程更新 EC2 实例中的软件

使用 CloudFormation 更新流程更新 EC2 实例中的软件

我想知道是否有任何方法可以更新实例内的软件。我的意思是,我在 EC2 中运行一个软件,我使用 CF 模板部署该软件。该模板有一个带有软件版本的参数。

我已使用以下内容配置了 cfn-hup:

'/etc/cfn/cfn-hup.conf':
    content: !Sub |
        [main]
        stack=${AWS::StackId}
        region=${AWS::Region}
        verbose=true
        interval=5
    mode: '000400'
    owner: root
    group: root
'/etc/cfn/hooks.d/cfn-auto-reloader.conf':
    content: !Sub |
        [cfn-auto-reloader-hook]
        triggers=post.update
        path=Resources.AWSInstance.Metadata.AWS::CloudFormation::Init
        action=/usr/local/bin/update_stack.sh
        runas=root
    mode: '000400'
    owner: root
    group: root

update_stack 脚本有一个参数,其值被我在 CF 参数部分中设置的值替换:

Parameter:
  SoftwareVersion:
    Description: Software version
    Type: String

脚本如下:

#!/bin/bash
...
SOFTWARE_VERSION=${SoftwareVersion}
...

此外文件部分内AWS::CloudFormation::初始化:

我第一次运行模板时,该值被 v1 版本替换。当我尝试使用相同的模板更新堆栈但将版本更改为 v2 时,我可以看到 CF 控制台中的值已更改,但文件在实例中保持不变。CF 控制台显示具有新值的参数,但该值永远不会在实例中结束。

我可以看到 cfn-hup 守护程序如何启动并运行,并检查元数据服务器中的更改,但从未发现任何更改。

所以我的疑问是:更新过程是否仅用于管理 AWS 资源,如 ami 类型或安全组?或者是否有一些技巧可以使我在脚本中编写的参数更改可用文件之内AWS::CloudFormation::初始化:

非常感谢。

答案1

我回覆我自己!

UserData 脚本仅在创建实例时启动,以后再也不会启动。我可以更改脚本但不能再次执行它,而且我可以借助 cfn-hup 守护进程检测元数据中的更改。因此,我所做的就是更改 UserData 脚本 (/var/lib/cloud/instance/scripts/part-001) 中的软件版本,并按如下方式配置 cfn-hup:

[cfn-auto-reloader-hook]
triggers=post.update
path=Resources.MyServer.Metadata.AWS::CloudFormation::Init
action=/usr/local/bin/update_stack.sh
runas=root

该脚本action将从 UserData 脚本中恢复软件版本,并触发堆栈的更新过程。

在 UserData 脚本(在 CloudFormation 模板中)中有一行如下内容:

SOFTWARE_VERSION=${SoftwareVersion}

在更新过程中,用户可以通过 CloudFormation 仪表板进行替换。

干杯!

相关内容