Dynamic port mapping on ECS
WHY?
對於要 export port 給外部的 app 來說(ex. web app),如果固定 host port 的話,因為 port 不能衝突的關係,所以一個 instance 只能有一個 app container,如果想要同時有兩個 web app container 就需要兩個 instance,如果 instance 還有資源的話就會造成浪費
HOW?
- target group
在 create 一個 service 的時候,需要指定這個 service 對應的 target group
而這個 target group 的 health check port 需要設定成 traffic port,如果沒設定的話會一直判定 service 為 unhealthy 一直把 service kill 掉
- security group
因為 host port 設定成 dynamic port,因此 container 對應的 port 變成一個 range
在這個 instance 身上的 security group(sg),需要設定 inbound rule 為 ephemeral port range(32768–65535)
這裡需要特別說明一下,有些 aws 文件會寫 49153–65535 這個範圍,但這是 for Docker 1.6 以下的版本,目前的 range 已經是 32768–65535,本人已經先幫忙踩雷 QQ
-
ACL
如果有用 ACL 的話,port range 跟 sg 一樣要設定成 32768–65535 -
task definition
這個 service 所使用的 task definitionhost port
需要設定成0
這個 magic number
這樣就會自動使用 Docker 的 port
Future work
如果要加上 auto scaling 的機制還要研究一下 ScalableTarget 跟 cloudwatch event 的搭配