CloudFormation:如何处理 UserData 中的错误

CloudFormation: How to handle errors in UserData

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

我研究了 cfn-init and cfn-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 的退出代码错误,我希望触发某种警报,以便可以终止实例并通知我。

这可能吗?

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

I would like some sort of alarm triggered if UserData has a bad exit code so that the instance can be terminated and I can be notified.

这是您必须在 UserData 中自行编写的程序。 AWS 没有开箱即用的方法来检查您的 UserData.

中的错误

这是应该在 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
...