更新自动缩放组 AMI 和 运行 个实例

Update autoscaling group AMIs and running instances

我正在尝试为项目设置以下内容

我对 EC2 实例所基于的 AMI 有疑问。如果我想对系统配置进行一些更改(比如更新 libssl 包),我会看到两个选项:

执行此操作(避免停机)的最佳方法是什么?我应该坚持一些最佳实践吗?

谢谢

[编辑] 我从 aws-missing-tools 中遇到了 aws-ha-release,它可以重新启动所有实例一个没有任何停机时间的自动缩放组。我想这可以与加壳器结合使用以强制 运行ning 实例使用新的 AMI。对此有任何反馈吗?我觉得它有点hacky。

你为什么不评估使用启动配置的用户数据字段?

总而言之,它是 16 KB 的纯爱,内置于您生成新机器的秘诀中。

如果使用 Linux,则使用 Bash 脚本,如果 WIndows,则可以使用 Powershell.

没有额外的工具,全部集成且免费。

P.S。如果您需要超过 16 KB,只需将您的附加脚本的 wget 链接到您的核心脚本中,然后 shell 通过创建链来链接它。

这里有一些选项:

1 使用两个自动缩放组

如果您在部署新代码时试图防止停机,请利用以下事实:一个 ELB 可以关联多个自动缩放 groups/launch 配置

您可以拥有:

  • autoscale-A,launchconfig-A分别是autoscale组和launch 服务器版本“A”的配置。
  • autoscale-B,launchconfig-B分别是autoscale组和launch configs 您服务器的版本“B”。

A代表代码的版本XB代表版本 X+1(包括对 O/S 配置的任何更改,例如 libssl

现在,当您想要推出代码的版本 X + 1 时,只需“烘焙”一个新的 AMI,按照您喜欢的方式进行配置,然后将自动缩放组 B 添加到 elb。自动缩放组及其实例投入使用后,将自动缩放组 A 的 max/capacity 设置为 0,将版本 X 服务器从 ELB 中取出。只有您的版本 X + 1 会 运行ning。当将来出现新实例时,例如如果服务器出现故障,他们将使用您的 X + 1 AMI 并更改其所有配置。

请注意,如果您的应用程序与数据库通信,您将需要确保代码的版本 X 和版本 X + 1 可以在相同版本的数据库上运行,例如如果版本 X + 1 删除了版本 X 使用的 table,那么您将收到来自用户点击您应用程序的版本 X 的错误。当您的代码发布中没有数据库更改,或者如果您在推出新版本的代码时内置了向后兼容性,#1 效果很好。

2 将配置管理工具与健康检查相结合

如果您只想更新 O/S,例如patch一个版本,然后你就可以结合你的想法使用像Ansible这样的工具和ELB健康检查。

  • 当你想给服务器打补丁时,扩大你的实例数量 暂时,例如如果你是 运行宁 3 实例,扩大到 6。
  • 作为他们用户数据的一部分,运行 Ansible 并且只有一次 成功完成,例如更新 libssl,你允许健康吗 检查通过,EC2 实例为来自 ELB 的流量提供服务。
  • ELB 成功看到新的 EC2 实例后,缩小规模 将自动缩放组中的实例数增加到其原始容量(在本例中为 3)。
  • 注:最老的 实例将是 AWS 终止的实例,这意味着唯一 运行 剩余的实例是您的 3 个新实例。
  • 如果一个实例失败并启动一个新实例,它将从您的基本 AMI 开始,应用任何 Ansible 更改(并且只有在更改出现后,健康检查才会通过并投入使用)。
  • (这是您的 (2),但修复了不包含 libssl 版本更改的新实例的问题)

速度注意事项

  • 选项 1 将允许失败的实例比选项 2 更快地投入使用(因为您没有等待 Ansible 到 运行)必须“预烘焙”您的 AMI 的费用。

  • 选项 2 将使您更灵活、更快速地修补生产服务器,例如如果您需要“现在 打补丁”,这可能是最快的方法。拥有 Ansible 运行ning 之类的东西和修补 O/S 的能力(将该任务与部署代码任务分开)可以带来额外的优势,具体取决于您的用例。为您的服务器配置(库、用户管理等)提供无代理挂钩非常强大,尤其是在云中。