본문 바로가기

AWS

[ECS] ECS Exec를 사용하여 ECS Fargate 컨테이너에 접속하기

반응형

Fargate는 기본적으로 AWS에서 서버를 관리하기 때문에 운영 관리에 대한 부분을 최소화할 수 있다.

 

하지만 컨테이너에 Issue가 발생했다거나, 디버깅을 위해 컨테이너에 접속하고 싶을 경우에 상당히 까다로울 수 있다.

 

EC2 기반의 ECS를 운영할 경우 그냥 EC2에 접속하여 docker exec -it {container_id} /bin/sh 등의 명령어를 수행하면 되지만 Fargate일 경우 EC2에 접속할 수 없기 때문이다.

 

Fargate에 작업을 배포하는 ECS 사용자들은 주로 Fargate를 사용하면 SSH로 연결할 수 있는 EC2 인스턴스가 없기 때문에 EC2 인스턴스에 SSH로 연결하는 옵션도 없었다. Fargate의 ECS에서는 컨테이너로 실행하는 것이 불가능하다.

 

그럼 어떻게 해야할까?

 

AWS ECS Exec를 사용하면 Container에 접속할 수 있도록 해준다.

 

 

공식 문서

 

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/ecs-exec.html

 

디버깅에 Amazon ECS Exec 사용 - Amazon Elastic Container Service

디버깅에 Amazon ECS Exec 사용 Amazon ECS Exec을 사용하면 먼저 호스트 컨테이너 운영 체제와 상호 작용하거나 인바운드 포트를 열거나 SSH 키를 관리할 필요 없이 컨테이너와 직접 상호 작용할 수 있습

docs.aws.amazon.com

 

 

1.  설정 방법

 

1. AWS SSM Plugin이 Local PC에 설치되어 있어야 한다.

https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

 

(Optional) Install the Session Manager plugin for the AWS CLI - AWS Systems Manager

The plugin requires either Python 2.6.5 or later, or Python 3.3 or later. By default, the install script runs under the system default version of Python. If you have installed an alternative version of Python and want to use that to install the Session Man

docs.aws.amazon.com

 

 

2. Service를 배포할 때 enable-execute-command를 설정해야 한다.

aws ecs create-service \
    --cluster cluster-name \
    --task-definition task-definition-name \
    --enable-execute-command \
    --service-name service-name \
    --desired-count 1

 

 

3. ECS Task Role에 다음의 ssmmessage 권한이 추가되어야 한다.

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

 

 

4. (Option) initProcessEnabled to true

initProcessEnabled를 True로 설정할 경우 컨테이너 내부에서 init process가 실행되면서 실행중인 SSM Agent 중 Zombie를 없애게 된다. 옵션이기 때문에 필수는 아니지만 혹시 모르기 때문에 설정해주는게 좋지 않을까라는 생각을 함

{
    "taskRoleArn": "ecsTaskRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
    ],
    "executionRoleArn": "ecsTaskExecutionRole",
    "memory": ".5 gb",
    "cpu": ".25 vcpu",
    "containerDefinitions": [
        {
            "name": "amazon-linux",
            "image": "amazonlinux:latest",
            "essential": true,
            "command": ["sleep","3600"],
            "linuxParameters": {
                "initProcessEnabled": true
            }
        }
    ],
    "family": "ecs-exec-task"
}

 

필자는 Terraform으로 배포했기 때문에 Terraform에 위의 설정들을 모두 해주었다.

 

2. 접속 방법

접속은 aws ecs execute-command 명령어를 통해 수행할 수 있다.

 

명령어는 아래의 형식대로 넣어주면 된다.

~ ❯ aws ecs execute-command --profile PROFLE_NAME --region REGION_NAME\
  --cluster CLUSTER_NAME \
  --task TASK_ID \
  --container CONTAINER_NAME \
  --command "/bin/sh" \
  --interactive

 

그럼 아래와 같이 접속에 성공된 것을 확인할 수 있다.

 

추후 디버깅 시에 유용하게 사용할 수 있을 것 같음.

 

 

 

반응형