0

我想連續部署我的nodejs webapp,只需使用一個EC2實例與ECS。我無法爲此應用創建多個實例。如何僅使用一個EC2實例連續部署ECS

我目前的持續集成流程: Travis從github構建代碼,構建標籤並推送Docker鏡像,並通過ECS Deploy shell script部署到ECS。

每次部署發生時,都會發生以下錯誤。因爲端口80總是被我的webapp使用。

The closest matching container-instance ffa4ec4ccae9 
is already using a port required by your task 
  1. 它實際上是可以使用ECS一個實例? (文檔不清)
  2. 如何擺脫ECS上的端口問題? (停止正在運行的容器)
  3. 如何在不使用Load Balancer的情況下完成此操作?
  4. 我錯過了什麼,或者從最佳實踐中脫穎而出?
+0

如果您的應用程序在部署期間無法容忍脫機,則應考慮您的選擇只有1個EC2實例。 – doorstuck

回答

2

主要問題是端口衝突,這是在集羣中的同一節點上部署任務的第二個實例時發生的。除此之外,沒有任何東西可以阻止您擁有多個容器實例(例如,當不使用負載均衡器;根本無法綁定到任何端口)。

爲了解決這一問題,亞馬遜introduced一個動態端口功能在最近更新:

動態端口,使得它更容易啓動集羣中的任務,而無需擔心端口衝突。以前,要使用Elastic Load Balancing將流量路由到您的應用程序,您必須在ECS任務中定義一個固定的主機端口。這增加了操作複雜性,因爲您必須跟蹤每個應用程序使用的端口,並且降低了集羣效率,因爲每個實例只能放置一個任務。現在,您可以在ECS任務定義中指定一個動態端口,該端口在EC2實例上調度時爲容器提供未使用的端口。 ECS調度程序使用此端口自動將任務添加到應用程序負載平衡器的目標組。要開始,您可以從EC2控制檯或使用AWS命令行界面(CLI)創建應用程序負載平衡器。使用將主機端口設置爲0的容器在ECS控制檯中創建任務定義。該容器在計劃時自動接收臨時端口範圍內的端口。

2

這裏有一個辦法做到這一點使用綠色/藍色的部署模式:

  1. 主機的端口8080上的集裝箱& 8081(或任何與你想要的)。我們稱8080綠色和8081藍色。 (您可能必須將網絡模式從網橋切換到主機才能使其在單個實例上運行)。
  2. 使用Elastic Load Balancing將來自80/443的流量重定向到綠色或藍色。
  3. 部署時,使用腳本將ELB上的活動偵聽器交換到其他顏色/容器。

這也允許你回滾到'最後已知的好'狀態。

請參閱http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html瞭解更多信息。

+0

如果沒有負載平衡器,我不能完成這項工作嗎? – sith

+0

如果您將網絡切換到主機並公開兩個端口,並且可能使用nginx或ECS主機上的某些設備重定向流量,那麼您可能無需ELB即可執行此操作。但是,使用負載均衡器可以爲您提供很多其他的好處,我強烈建議您使用它。 – mcheshier

相關問題