ECS Exec으로 Private Subnet의 Fargate 컨테이너에 접속 방법
개요
Private Subnet
에 위치한 ECS Fargate 태스크의 컨테이너에 직접 접근하여 디버깅하거나 문제를 해결해야 할 때 ECS Exec
을 통해 접근해야 한다.
본 글에서는 ECS Exec
를 사용하여 컨테이너에 접근하는 방법을 알아본다.
1. Session Manager Plugin 설치
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을 사용하려면 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 Service
에 enable-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