在自动扩展组中的 EC2 启动和关闭时运行命令

Posted

技术标签:

【中文标题】在自动扩展组中的 EC2 启动和关闭时运行命令【英文标题】:Running command on EC2 launch and shutdown in auto-scaling group 【发布时间】:2018-06-24 20:02:09 【问题描述】:

我正在运行一个部署在 AWS 上的 Docker 群。该设置是一组自动扩展的 EC2 实例,每个实例都充当 Docker swarm 节点。

当自动缩放组向外扩展(生成新实例)时,我想在实例上运行一个命令以加入 Docker 群(即docker swarm join ...),并在它缩小(关闭实例)时离开蜂群 (docker swarm leave)。

我知道我可以在启动配置中使用用户数据执行第一个,但我不确定如何在关机时采取行动。我想使用lifecycle hooks,文档提到我可以在启动/终止时运行自定义操作,但从未解释过如何执行此操作。应该可以不发送 SQS/SNS/Cloudwatch 事件,对吧?

我的 AMI 是基于 Ubuntu 16.04 的自定义。

谢谢。

【问题讨论】:

你真的必须离开群体吗? swarm 不会只是注意到一个实例消失了,然后将在另一个实例上运行的容器放在另一个实例上,而自动伸缩组会替换该实例吗? 另外,你为什么不使用init脚本来关闭,考虑到机器是Ubuntu,它更优雅。 脚本的最大问题是工作人员没有完全的权限将自己从 swarm 中移除。请参阅下面的答案。 【参考方案1】:

其中一个核心问题是,从 Swarm 中移除节点目前是一个 2 或 3 步操作,如果优雅地完成,其中一些操作无法在要离开的节点上完成:

    docker node demote,如果离开节点是经理 docker swarm leave 离开节点 docker swarm rm 经理

第 3 步比较棘手,因为它要求您执行以下三件事之一来完成删除过程:

    在 worker 上放置一些东西,让它在 manager 上远程执行操作(ssh 到具有 sudo perms 或 docker manager API 访问权限的 manager)。不是一个好主意。这打破了“工人不能做经理的事情”的安全模式,大大增加了风险,所以不推荐。我们希望我们的管理人员保持安全,我们的员工无法控制或查看群体。

    (如果可能的话最好)设置一个外部解决方案,以便在删除 EC2 节点时,运行一个作业以通过 SSH 或 API 进入管理器并从 swarm 中删除该节点。我见过人们这样做,但不记得链接/repo 以获取有关使用 lambda 等处理生命周期钩子的完整详细信息。

    在单个管理器(或最好作为运行 cron 容器的仅管理器服务)上设置一个简单的 cron,以删除标记为 downworker。这是一种直截了当的方法,并且存在边缘情况,您可能会删除现有但被 Swarm 认为已关闭/不健康的节点,但我还没有听说过这种情况。如果它很花哨,它可能会使用 AWS 验证该节点在移除之前确实已经消失。

最坏的情况,如果一个节点严重宕机并且没有执行上述任何操作,这并不可怕,只是不适合优雅地管理用户/数据库连接。 30 秒后,一个节点被认为关闭,服务任务将在健康节点上重新创建。 swarm 节点列表中标记为down 的一长串工人列表实际上对您的服务没有影响,只是不美观(只要有足够的健康工人)。

GitHub 中有一个功能请求,可以更轻松地进行此删除。我已经评论了我在野外看到的东西。欢迎随时post your story and use case in the SwarmKit repo。

【讨论】:

以上是关于在自动扩展组中的 EC2 启动和关闭时运行命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?

我想在运行代码部署时在被新自动缩放组替换的 EC2 实例上运行脚本

在关闭之前检查 Auto Scaling 组中的 EC2 实例是不是有任何用户在使用它

自动关闭和启动 Amazon EC2 实例

cfn-init 用于 cloudformation 启动模板

启动 Amazon EC2 实例时如何自动启动 Web 服务?