【问题标题】:CloudFormation: How to handle errors in UserDataCloudFormation:如何处理 UserData 中的错误
【发布时间】:2022-01-13 23:09:58
【问题描述】:

作为我的 CloudFormation 模板的一部分,我利用 UserData 运行一系列命令来安装我的应用程序。我想知道是否有办法在运行 UserData 时响应退出错误,以便 EC2 实例终止并且不会添加到我的 Auto Scaling 组中。

我研究了cfn-initcfn-signal,我认为它们可以提供此功能,但通过示例我只看到它们与元数据configSets 结合使用。

这就是我的AWS::AutoScaling::LaunchConfiguration 下的UserData 的样子:

"WebServerLaunchConfig": {
    "Type": "AWS::AutoScaling::LaunchConfiguration",
    "Metadata": ...,
    "Properties": {
        ...
        "UserData": {"Fn::Base64": {
            "Fn::Join": [
            "\n",
            [
                "#!/bin/bash -xe",
                "\n",
                "cd /var/www"
                "git clone myrepo html",
                "cd /var/www/html",
                "/usr/bin/aws s3 cp s3://my-bucket/env.development .env",
                ... // several more commands, etc.
            ]
        ]}
        }
    }
}

概括地说,我的 CF 结构如下所示:

Load Balancer -> Auto Scaling Group for EC2 instances (desired 1, min 1, max 3)

我的 ASG 中有动态扩展策略,可根据负载进行扩展和缩减。因此,假设触发了扩大规模政策。将创建一个新的 EC2 实例并将其放入池中。如果由于某种原因我的堆栈的UserData 部分出现故障,EC2 实例仍将成功创建。如果UserData 的退出代码错误,我希望触发某种警报,以便可以终止实例并通知我。

这可能吗?

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-cloudformation


    【解决方案1】:

    这应该在UserData 级别进行配置。将UserData 简单地视为在机器上运行的shell 脚本。您可以完全控制脚本运行时发生的事情。很少有选项可以实现您正在寻找的行为:

    • 设置脚本,以便在出错时向 CloudWatch 发送警报
    • 设置脚本,以便在出错时使用 SNS/SES 向您发送电子邮件
    • 设置脚本,以便实例在出错时自动关闭

    (或者实际上你可以结合以上)。

    关于shell脚本应该如何配置,我建议使用trap,这样如果脚本出错,你可以轻松运行任何你想要的逻辑。

    一个例子:

    #!/bin/bash -xe
    
    notify() {
      echo "UserData was unsuccessful!"
      ... 
      # use this function to implement the notification/shutdown behavior
    }
    
    trap 'notify' ERR
    
    cd /var/www
    git clone myrepo html
    ...
    

    【讨论】:

    • 谢谢。事实上,这就是我决定如何处理他的方式。感谢推荐使用trap
    【解决方案2】:

    如果 UserData 的退出代码错误,我希望触发某种警报,以便可以终止实例并通知我。

    这是你必须在你的UserData 中自己编程的东西。 AWS 没有自动开箱即用的方法来检查您的 UserData 中的错误。

    【讨论】:

      【解决方案3】:

      是的,我认为您正在尝试在您的 userData 中重新启动 Nginx,因此您可以修改您的 asg( 目标组) 健康检查,以检查来自创建的 ec2 的响应是否来自您启动的 nginx ,如果它符合其认为的健康状态,并且如果它没有运行它被认为不健康并被替换

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 2017-01-11
        相关资源
        最近更新 更多