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
1. 설정 방법
1. AWS SSM Plugin이 Local PC에 설치되어 있어야 한다.
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
그럼 아래와 같이 접속에 성공된 것을 확인할 수 있다.
추후 디버깅 시에 유용하게 사용할 수 있을 것 같음.
'AWS' 카테고리의 다른 글
[EKS] EKS Cluster 구축 시 고려 사항 정리 (Terraform, Terragrunt, IRSA, Atlantis, Addon, ..) (1) | 2022.08.12 |
---|---|
[ECS] FireLens로 ECS Fargate 컨테이너 로그 ElasticSearch로 보내기 (0) | 2022.05.02 |
[AWS] Multi Account에서 IAM 내역 감사하기 #4 - Lambda를 활용한 Slack Notification (2) | 2022.04.17 |
[AWS] Multi Account에서 IAM 내역 감사하기 #3 - 테라폼으로 인프라 프로비저닝 2 (0) | 2022.04.17 |
[AWS] Multi Account에서 IAM 내역 감사하기 #2 - 테라폼으로 인프라 프로비저닝 (0) | 2022.04.15 |