Amazon-Web-Services

在亞馬遜 ECS 實例上安裝安全更新的最佳方式

  • December 20, 2016

我們正在使用Ansible在我們所有執行有狀態服務(如數據庫、搜尋引擎等)的 EC2 實例上推出安全更新。這很好用。

我想知道在 ECS 實例(在 Docker 容器中執行無狀態 Web 應用程序)上進行安全更新的最佳方法是什麼。由於自動擴展,實例數量及其 IP 地址有很多動態變化。Ansible使用硬編碼的 IP 地址列表(hosts 文件),所以它似乎並不真正符合目的。

更新這些實例是一個好主意,還是我們應該將它們拆除並每隔一段時間產生新的實例?

DevOps 人員有什麼最佳實踐嗎?

更新:

我發現 Ansible 支持動態庫存。有一個腳本可以從 AWS 獲取有關主機的資訊並為 Ansible 生成動態清單,這很好用。

然而,一個問題仍然存在。每當有一個我以前沒有連接過的新主機時,都會顯示以下消息,必須手動確認。

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

這很煩人,因為我想實現一個全自動更新機制。這個問題有解決方案嗎?

每當有一個我以前沒有連接過的新主機時,都會顯示以下消息,必須手動確認。

$$ $$這個問題有解決方案嗎?

修改 的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確保圖像是最新的來完成的,因此修補過程基本上是重建圖像。舉個例子:

FROM centos:7.2.1511
MAINTAINER Jane Doe <j.doe@foo.com>

RUN yum update -y && \
   yum install -y \
     bar \
     foo && \
   yum clean all
# The rest of your Dockerfile

不過,推出新映像是我發現 ECS 缺乏的地方。您需要自己制定策略以確保沒有停機時間。

讓服務掃描系統資料庫中的圖像以查找漏洞也是一種最佳實踐。

在不停機的情況下修補主機作業系統(可能需要重新啟動)是我發現 ECS 缺乏編排功能的另一個領域,因為除了節點之間的 ELB 平衡之外,產品中沒有內置任何開箱即用的東西。

其他容器平台(例如 OpenShift)具有從節點撤出容器(pod,因為這是 kubernetes)並將它們調度到其他地方的能力。負載均衡器知道這種變化,確保零停機時間。此外,通常與 OpenShift 一起使用的作業系統具有改進的基於RPM OSTree的修補機制,大大降低了修補主機作業系統的複雜性。

引用自:https://serverfault.com/questions/820882