Site icon Mr. 沙先生

AWS ECS Exec to access your containers

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 從頭到尾的詳細說明,所以我這邊就直接紀錄重點項目:

Additional settings for ECS Exec

開啟 ECS Exec 功能有幾項與以往不同之處:

{
    "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 的用法一樣。

$ 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 才會生效

有開啟 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 立馬就知道問題出在哪了

Exit mobile version