在amazon ECS实例上安装安全更新的最佳方法

我们正在使用Ansible在所有运行有状态服务(如数据库,search引擎等)的EC2实例上推出安全更新。

我想知道什么是在ECS实例(在Docker容器中运行无状态Web应用程序)上进行安全更新的最佳方法。 由于自动缩放,实例数量和IP地址数量会有很大的变化。 Ansible使用IP地址(主机文件)的硬编码列表,所以它似乎不符合目的。

更新这些实例甚至是一个好主意,还是应该把它们拆下来,每隔一段时间产生一个新的实例?

DevOps的任何最佳实践都是那里的人?

更新:

我发现Ansible支持dynamic库存。 有一个脚本可以从AWS获取有关主机的信息,并为Ansible生成一个dynamic库存,这工作正常。

但是,仍然存在一个问题。 每当有一个我以前没有连接过的新主机时,会显示以下消息,并且必须手动确认。

The authenticity of host '10.0.1.247 (10.0.1.247)' can't be established. ECDSA key fingerprint is SHA256:GSogs6P6CzbOzLm9ByWsXkfz7/2A4qwj4PDvczApS/I. Are you sure you want to continue connecting (yes/no)? yes 

这是非常烦人的,因为我想实现一个完全自动化的更新机制。 有这个问题的解决scheme吗?

每当有一个我以前没有连接过的新主机时,会显示以下消息,并且必须手动确认。 []有没有解决这个问题的方法?

修改ssh_connectionansible.cfg ,使其包含-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null参数。

例如:

 [ssh_connection] ssh_args = -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s 

升级容器是一个完整的反模式。 这很麻烦,因为你需要升级它们中的每一个,并可能提交它们中的每一个。

而是更新用于产生容器的图像。 这通常是通过Dockerfile上的Dockerfile来确保图像是最新的,所以修补的过程基本上是重build图像。 举个例子:

 FROM centos:7.2.1511 MAINTAINER Jane Doe <[email protected]> RUN yum update -y && \ yum install -y \ bar \ foo && \ yum clean all # The rest of your Dockerfile 

不过,推出新的形象,是我发现ECS缺乏的地方。 你需要自己制定一个策略,以确保没有宕机。

让服务扫描registry中的图像以查找漏洞也是最佳做法。

在没有停机的情况下修补主机操作系统(可能需要重新启动)是另一个我发现ECS缺乏编排function的领域,因为除了节点之间的ELB平衡之外,没有什么东西是内置的。

其他容器平台(如OpenShift) 能够从节点撤出容器(豆荚,因为这是kubernetes) ,并在别处安排它们。 负载均衡器知道这些变化, 确保零宕机 。 此外, 通常与OpenShift一起使用的OS具有基于RPM OSTree的改进的修补机制,这大大降低了修补主机操作系统的复杂性。