Post

ECS Exec으로 Private Subnet의 Fargate 컨테이너에 접속 방법

ECS Exec으로 Private Subnet의 Fargate 컨테이너에 접속 방법

참고 문서: Monitor Amazon ECS containers with ECS Exec

개요

Private Subnet에 위치한 ECS Fargate 태스크의 컨테이너에 직접 접근하여 디버깅하거나 문제를 해결해야 할 때 ECS Exec을 통해 접근해야 한다.

본 글에서는 ECS Exec를 사용하여 컨테이너에 접근하는 방법을 알아본다.

1. Session Manager Plugin 설치

Install the Session Manager plugin on macOS

macOS(Apple 실리콘) 설치 명령어:

1
2
3
4
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac_arm64/session-manager-plugin.pkg" -o "session-manager-plugin.pkg"

$ sudo installer -pkg session-manager-plugin.pkg -target /
sudo ln -s /usr/local/sessionmanagerplugin/bin/session-manager-plugin /usr/local/bin/session-manager-plugin

Session Manager 플러그인이 설치되었는지 확인한다.

1
$ session-manager-plugin

명령어 실행 결과로 다음 메시지가 반환되면 설치에 성공한 것이다.

1
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

2. 보안 그룹 생성

Private Subnet에 위치한 ECS Fargate 태스크의 컨테이너에 ECS Exec으로 접근하기 위해서는 SSM 관련 VPCE(VPC Endpoint)를 생성해야 한다. 이때, VPCE에 연결되는 보안 그룹의 인바운드 규칙에는 HTTPS(443)를 허용하고 Private Subnet의 CIDR 범위를 소스로 지정해야 한다.

이 보안 그룹은 VPCE에 연결되는 네트워크 인터페이스에 대한 트래픽을 제어한다. ECS Fargate 태스크가 SSM 서비스를 통해 컨테이너와 통신하기 위해서는 Fargate 태스크가 위치한 Private Subnet에서 VPCE로의 인바운드 통신이 허용되어야 한다.

2-1. 인바운드 규칙

ECS Fargate 태스크가 VPCE로 HTTPS(443) 트래픽을 보낼 수 있도록 허용한다. 덕분에 Private Subnet에 위치한 Fargate 태스크가 VPCE를 통해 SSM 서비스와 통신할 수 있게 된다.

  • 유형: HTTPS
  • 프로토콜: TCP
  • 포트 범위: 443
  • 소스: Private Subnet의 CIDR 블록 또는 ECS Fargate 태스크에 할당된 보안 그룹 ID
    • 전자는 Private Subnet 내의 모든 리소스가 VPCE와 HTTPS로 통신할 수 있도록 한다.
    • 후자는 해당 보안 그룹에 할당된 Fargate 태스크만 VPCE와 통신할 수 있도록 범위를 제한하는 것이다. -> Fargate 태스크의 보안 그룹이 변경될 경우 VPCE 보안 그룹도 같이 변경해야 한다.

2-2. 아웃바운드 규칙

인바운드 트래픽은 ECS Fargate 태스크에서 VPCE로 들어오는 통신을 제어하고 아웃바운드 트래픽은 VPCE에서 ECS Fargate 태스크로 나가는 응답 통신을 제어한다. ECS Fargate 태스크가 SSM 서비스로 요청을 보내면 SSM 서비스는 Fargate 태스크로 응답을 보내야 하므로 아웃바운드 트래픽을 허용해야 한다.

  • 유형: HTTPS
  • 프로토콜: TCP
  • 포트 범우ㅏ: 443
  • 대상: Private Subnet의 CIDR 블록 또는 ECS Fargate 태스크에 할당돤 보안 그룹 ID

3. Private Subnet에 접근하기 위해 Session Manager에 대한 VPCE 생성

참고 문서: Use AWS PrivateLink to set up a VPC endpoint for Session Manager

Private Subnet에서 실행 중인 ECS Fargate 태스크에서 실행 중인 컨테이너에 접근하려면 VPCE를 생성해야 한다. ECS Exec는 AWS SSM(Systems Manager) Session Manager를 기반을 동작하며, 관련 API와 통신하기 위해 다음 세 가지 인터페이스 vpce가 필요하다.

  • ec2messages.<region>.amazonaws.com
  • ssm.<region>.amazonaws.com
  • ssmmessages.<region>.amazonaws.com

Interface 엔드포인트는 AWS PrivateLink 기술로 동작하며, 이 기술은 사설 IP 주소를 사용하여 EC2 및 Systems Manager API에 액세스할 수 있게 한다. AWS PrivateLink는 Systems Manager 및 EC2 간의 모든 트래픽을 Amazon 네트워크로 제한하기 때문에 IGW(인터넷 게이트웨이)와 NAT 게이트웨이가 필요없다.

아래 사진은 위에서 설명한 세 가지 인터페이스 vpce를 설치한 것이다.

4. ECS Exec에 대한 권한 부여

ECS Exec permissions

ECS Exec을 사용하려면 SSM Agent가 SSM 서비스와 통신할 수 있도록 필요한 권한을 부여해야 한다. 따라서 아래의 권한을 포함한 IAM Role을 생성하고, 이를 태스크 정의에 연결해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

5. ECS Service 배포 옵션 추가

ECS Exec 명령어를 사용하기 위해서는 ECS Serviceenable-execute-command가 활성화(true)되어 있어야 한다.

ECS Service를 배포하기 전이라면 ECS Service를 생성하는 명령어에서 --enable-execute-command를 추가해야 한다. 아래는 예제 명령어이며 본인의 상황에 맞춰서 ECS Service 구성 정보를 변경한다.

1
2
3
4
5
6
7
$ aws ecs create-service \
	--cluster <cluster-name> \
	--task-definition <task-definition-name> \
	--enable-execute-command \ 
	--service-name <service-name> \ 
	--launch-type FARGATE \ 
	--desired-count 1

이미 ECS Service가 배포되어 있는 상태라면 아래 명령어를 통해 enable-execute-command를 활성화할 수 있다.

1
2
3
4
5
6
$ aws ecs update-service \
	--cluster <cluster-name> \
	--service <service-name> \
	--enable-execute-command \
	--profile <profile-name> \
	--region <region-name>

다음 명령어를 통해 배포된 ECS Service에 enableExecuteCommand가 활성화(true)되어 있는지 확인한다.

1
2
3
$ aws ecs describe-tasks \ 
	--cluster <cluster-name> \ 
	--tasks <task-id>

6. ECS Exec를 통해 ECS 컨테이너에 접속하기

6-1. ECS Service에 enableExecuteCommand 활성화되어 있는지 확인

ECS Service의 상세 정보를 확인하는 명령어:

1
2
3
$ aws ecs describe-task \
	--cluster <cluster-name> \
	--tasks <task-id>

enableExecuteCommand=true일 경우 ECS Exec를 통해 ECS 컨테이너에 직접 접근할 수 있다.

6-2. ECS Exec를 사용하여 ECS 컨테이너에 접근

enableExecuteCommand=true인 것을 확인한 후 다음 명령어를 통해 컨테이너에서 대화형 셀을 열 수 있다. ECS의 경우 대화형 세션만 지원하므로 --interactive 옵션을 사용해야 한다.

1
2
3
4
5
6
7
8
$ aws ecs execute-command \
  --profile <AWS_PROFILE> \
  --region <REGION_NAME> \
  --cluster <CLUSTER_NAME> \
  --task <TASK_ID> \
  --container <CONTAINER_NAME> \
  --command "/bin/sh" \ 
  --interactive

아래는 위 명령어를 실행한 결과이다.

This post is licensed under CC BY 4.0 by the author.