這陣子的消息 Amazon ECS Anywhere – Now Generally Available 等到天花地老的 ECS Anywhere 終於 GA 了,Architecture Anywhere 的時代也準備要來臨了,即便很多人仍然在 Single Data Center 也可以看看在雲端的世界是如何 Scale 架構。今天這篇算是手把手教學,也是作者自己嘗試做一次的紀錄。
從架構圖來看可以得知 ECS Anywhere 是依靠 SSM Agent 和 ECS Agent 分別跟 System Manager 以及 Amazon ECS 溝通,在開始之前務必要先讀一下 Considerations 關於 ECS Anywhere 的限制,簡單概要說一下:
- 1 個 On-Prem instance 只能註冊在 1 個 ECS Cluster
- On-Prem instances 不支援 SELinux 和 ECS Exec
- On-Prem instances 必須能訪問 Amazon ECS Services,參考 Networking
- ecs-a-*.${region}.amazonaws.com
- ecs-t-*.${region}.amazonaws.com
- ecs.${region}.amazonaws.com
- 基於安全考量的人也可以考慮用 HTTP Proxy 在 ECS, SSM Agent 過一次白名單。
- 不支援 AWS ELB, Service discovery 和 App Mesh
- 支援
bridge
,host
和none
,不支援awsvpc
模式 (因為不在 AWS 合情合理) - ECS Anywhere 目前仍不能在 ECS task 定義 GPU
- 支援的 OS architectures
- RHEL7, CentOS7 以上
- Fedora 32 以上
- SUSE Enterprise 15, openSUSE Tumbleweed
- Ubuntu 18 以上
- 以上版本 x86_64 或 ARM64 都支援
- 其他細節請看 Considerations
On Prem instance Install by Vagrant
由於我是在 Macbook Pro 模擬環境,所以直接用 brew 安裝 Vagrant 搭配 Virtualbox 來跑一台 VM 模擬 On Prem instance:
$ brew install vagrant
$ vagrant init hashicorp/bionic64
$ vagrant up
三行指令 Vagrant 就幫你跑一台 Ubuntu 18.04 … 非常方便啊
ECS External instance Register
ECS Anywhere 在 Console 多出一個 Register External Instance 的功能,其實就是向 System Manager 發出一個 On Prem instance 的 Activation 註冊請求。
然後可以拿到一個 Command Script 拿去 On Prem instance 執行
這邊要注意 “每按一次 Register external instance” 都會向 System Manager 要一次 Activation,而 activation code 只有在 request 的 “當下” 可以拿到。
內容大概是這樣:
$ curl --proto "https" -o "/tmp/ecs-anywhere-install.sh" "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" \
&& bash /tmp/ecs-anywhere-install.sh \
--region "us-east-1" --cluster "${ecs-cluster}" --activation-id ${activation-id} --activation-code ${yactivation-code}
ecs-anywhere-install.sh 這隻 script 幫你做完以下事情:
- 安裝必要的系統套件 e.g. docker-ce, containerd.io, ca-certificates .. 等等
- 安裝 SSM Agent 和 ECS Agent
- SSM Agent 拿 activation-id 和 activation-code 註冊到 System Manager
安裝完成後 ECS Container instance 會多出一個 mi-*
的 instance 或是在 AWS CLI 查詢:
$ aws ecs list-container-instances --cluster ${your-ecs-cluster-name}
{ “containerInstanceArns”: [ “arn:aws:ecs:us-east-1:${accountId}:container-instance/${ecs-cluster}/02f6198817884d2f86e2bd2dd63c4a50” ] }
把 containerInstance Id 拿去查可以拿到 mi-* 的 instance-Id 代表是由 On Prem 註冊上來的
$ aws ecs describe-container-instances --cluster ${ecs-cluster} --container-instances 02f6198817884d2f86e2bd2dd63c4a50 | grep ec2InstanceId
Instance ID 當 i-* 是由 AWS Managed EC2,而 mi-* 則是代表 External instance 註冊到 AWS 託管
在 On Prem 可以檢查幾項 Script 有沒有跑成功
- 檢查 ecs service 是否正常運行
$ systemctl status ecs.service
2. 檢查 ssm agent 是否正常運行
$ systemctl status amazon-ssm-agent.service
3. 檢查 Docker 安裝以及 ecs agent 是否正常運行
$ docker ps -f "name=ecs-agent" -f "status=running"
到這邊 ECS Anywhere 就大功告成成為 ECS Cluster 的一部分,怎麼跑 Task 就不在這篇細講,但 Task Definition 要注意必須重新定義 launch type 為 External ,包含 ECS Service 也是需要另外定義。