我在AWS上有多个实例运行在负载均衡和自动扩展之后。
现在,如果我想要将一些代码变更推送到这些实例中,以及由于自动扩展策略可能启动的任何新实例,最好的方法是什么?
我唯一知道的方法是创建一个包含最新的代码的新AMI,修改自动扩展策略以使用该新AMI,然后终止现有实例。但这可能会导致较长的停机时间,而且我不确定整个过程是否可以自动化。
非常感谢任何指向此方向的提示。
我在AWS上有多个实例运行在负载均衡和自动扩展之后。
现在,如果我想要将一些代码变更推送到这些实例中,以及由于自动扩展策略可能启动的任何新实例,最好的方法是什么?
我唯一知道的方法是创建一个包含最新的代码的新AMI,修改自动扩展策略以使用该新AMI,然后终止现有实例。但这可能会导致较长的停机时间,而且我不确定整个过程是否可以自动化。
非常感谢任何指向此方向的提示。
我们配置启动配置来使用“干净”的现成AMI - 我们使用这些:http://aws.amazon.com/amazon-linux-ami/
这些AMI的一个特点是CloudInit - https://help.ubuntu.com/community/CloudInit
此功能使我们能够向新生成的普通EC2实例提供一些数据。具体而言,我们给实例提供一个要运行的脚本。
该脚本(简而言之)执行以下操作:
与从预配置的AMI引导相比,它确实需要更长的时间,但我们跳过了每次更新软件时实际制作这些AMI的过程(每周几次),并且服务器始终是“干净”的 - 没有手动打补丁,所有软件模块都是最新的等等。
现在,为了升级软件,我们使用本地的boto脚本。 该脚本逐个关闭运行旧代码的服务器。自动扩展机制会启动新的(并且已升级)服务器。as-terminate-instance-in-auto-scaling-group
,因为使用ec2-terminate-instance
将导致ELB继续向正在关闭的实例发送流量,直到它未通过健康检查。看起来您可以手动将自动缩放组大小加倍,它将使用当前启动配置中的 AMI 创建 EC2 实例。现在,如果您将自动缩放组减小到先前的大小,旧实例将被终止,只有从新的 AMI 创建的实例将幸存。