AWS ECS Exec 是前陣子發佈的新功能,在這之前每次 Deploy 到 ECS 遇到問題時都不容易到 Container 內進行 debug 這次 ECS Exec 出來後讓 ECS 的彈性又加高了許多,剛好最近需要用到 ECS Exec 的功能順手筆記一下注意事項。
「NEW – Using Amazon ECS Exec to access your containers on AWS Fargate and Amazon EC2」這篇 blog 詳細記載了使用 ECS Exec 從頭到尾的詳細說明,所以我這邊就直接紀錄重點項目:
- ECS Exec 可以跑在 Fargate 或 EC2 上的 Containers
- 支援 Linux container,不支援 Windows container
- 可以用 AWS SDKs, AWS CLI 和 AWS Copilot
- ECS Exec 透過 System Manager 中 Session Manager 的功能實現,所以必須選擇具有 SSM Agent 1.50.2 以上版本的 AMI (after January 20th, 2021),而 Fargate 需要 platform version 1.4.0 以上內建支援。
- ECS Exec 目前在 Management Console 還不能用,要啟用 ECS Exec 必須在 AWS CLI 指定
--enable-execute-command
參數 Run-Task,既有的 Container 無法修改使其支援 ECS Exec
Additional settings for ECS Exec
開啟 ECS Exec 功能有幾項與以往不同之處:
- ECS Task Role 權限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:DescribeLogStreams",
"logs:PutLogEvents",
"logs:DescribeLogGroups"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetEncryptionConfiguration"
],
"Resource": "*"
}
]
}
因為要授與 System Manager Agent 權限,所以在 Task Role 必須額外增加 ssmmessages 和寫入到 CloudWatch Logs 跟 S3 Bucket 的權限,如果 System Manager 有額外用 KMS 加密 Channel 的話要另外給 KMS Key 權限,這點和 System Manager on EC2 的用法一樣。
- Run Task / Create Service 時增加
--enable-execute-command
參數
$ aws ecs run-task \
--cluster <your-ecs-cluster> \
--task-definition <your-task-definition> \
--network-configuration awsvpcConfiguration="{subnets=[$SUBNET1, $SUBNET2],securityGroups=[$SG_ID]}" \
--launch-type FARGATE \
--platform-version '1.4.0' \
--enable-execute-command \
--region $AWS_REGION
加上 --enable-execute-command
參數後的 Task container 才支援 ECS Exec,而既有的 Task 沒辦法透過修改啟動 ECS Exec command,需要啟動新的 Task 才會生效
- Task New status
有開啟 execute command 的 Task 會在 managedAgents 內多出 ExecuteCommandAgent 的執行狀態,必須是 “RUNNING” 才算是正常運作
"managedAgents": [
{
"lastStartedAt": "2021-05-14T11:51:29.955000+08:00",
"name": "ExecuteCommandAgent",
"lastStatus": "RUNNING"
}
]
Task status 可以從 AWS CLI 調閱:
$ aws ecs describe-tasks \
--cluster <your-ecs-cluster> \
--region <your-region> \
--tasks <your-task-id>
ECS Exec command
$ aws ecs execute-command \
--region <your-region> \
--cluster <your-ecs-cluster> \
--task <your-task-id> \
--container nginx \
--command "/bin/bash" \
--interactive
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
root@ip-172-31-32-237:/#
aws ecs execute-command
這個指令集目前只支援在 AWS CLI v2 版本才有,如果遇到沒有指令集的問題記得先升級 AWS CLI 版本。
Debugger
相信在執行過程中仍然會遇到一些權限或設定上的問題無法執行,AWS 提供 aws-containers/amazon-ecs-exec-checker 這個超方便的工具檢查 ECS Exec 的設定是否正常:
遇到 ECS Exec 無法執行的問題跑這個 checker 立馬就知道問題出在哪了