Amazon ECS Exec를 통한 AWS Fargate 및 Amazon EC2 컨테이너 접근하기 | Amazon Web Services
AWS는 개발자 및 운영자를 포함한 모든 Amazon ECS 사용자가 Amazon EC2 또는 AWS Fargate에 배포된 태스크 내에서 실행되는 컨테이너에서 exec 명령을 시작할 수 있습니다. ECS Exec라는 기능을 통해 사용자
aws.amazon.com
Fargate는 서버리스다 보니 shell 접근이 어려운 부분이 있었다.
AWS 공식 Doc을 보았지만, 사실 저걸 보고 명확하게 하기엔 어려운 점이 있었다.
이번에 java 돌아가는 container의 memory leak 현상이 있어 해당 현상을 잡기 위해서 개발자가 shell 접근을 요청했다.
하지만, 연결을 처음해보는 것이었기 때문에 복잡하긴 했다.
현재 이상한 점이 있어서 몇가지 미결점이 남은 것이 있지만 일단 되는 방향대로 넣어본다.
1. ecs service의 enable_exec_command 옵션이 true 여야 한다.
2. ecs 실행 역할에서 ssmmessages:* 이 전부 활성화 되어 있어야 한다.
3. ecs 실행자의 권한에 ecs:ExecuteCommand 권한이 활성화 되어 있어야 한다.
4. agent 활성화를 위해 세팅을 지금 한 상태라면 task를 재생성하여 agent를 활성화 해야 한다.
위 작업은 cloudshell에서 접근한 방법이다.
먼저 terraform에서 아래의 옵션을 추가하여 새롭게 배포를 했다.
resource "aws_ecs_service" "test1" {
name = "test1"
cluster = aws_ecs_cluster.test_cluster.id
task_definition = aws_ecs_task_definition.test1.arn
desired_count = 0
launch_type = "FARGATE"
propagate_tags = "SERVICE" # 또는 "TASK_DEFINITION"
enable_execute_command = true
tags = {
Environment = "Test"
}
network_configuration {
security_groups = [
var.sg_ecs_security_group_id,
var.sg_stg_sg_id
]
subnets = [
var.subnet-private[0].id,
var.subnet-private[1].id,
var.subnet-private[2].id,
]
}
load_balancer {
target_group_arn = var.target_group["test1-tg"].arn
container_name = "test1"
container_port = 80
}
lifecycle {
create_before_destroy = true
ignore_changes = [task_definition,desired_count]
}
}
기존에는 아래의 값이 없어서 해당 값을 업데이트했다.
enable_execute_command = true
하지만 console에서도 수정이 되는지 보기 위해 보았으나 확인이 되지 않았다. (왜지?)
terraform apply 후 서비스 task를 전부 restart 시켰다.
리스타트 후 해야 할일은 ecs 실행 역할에 아래와 같은 정책을 추가 시킨다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ssmmessages:*",
"Resource": "*"
}
]
}
추가가 완료되면, 이제 CloudShell에서 사용할 준비를 한다.
Console 사용자의 권한에 대해서 아래와 같은 정책을 추가한다.
나의 경우엔 AWS Console 로그인이 되는 유저는 OfficeUser라는 Group으로 묶어두었고, 여기에 아래와 같은 정책을 추가했다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
...
"ecs:ExecuteCommand"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
이제 CloudShell을 연결할 차례다.
AWS Console 화면의 좌하단에 보면 이런 아이콘이 있다.
아래 CloudShell을 클릭하면 준비 후 다음과 같은 화면이 나온다.
CloudShell에서 다음과 같은 command를 돌려본다.
aws ecs execute-command --cluster {cluster_name} --task {task_name} --container {container_name} --interactive --command "/bin/sh"
각 변수는 ECS에서 확인을 해야 한다.
스티커 순서별로 입력해야할 변수 값이다.
이제 진짜 되는지 한번 해보자.
이게 성공 화면이다.
OS에 따라 /bin/bash를 해야 할수도 /bin/sh를 해야할 수도 있다.
ls도 되는 것을 확인했다.
단 이상한 것은 site to site vpn으로 연결된 내 사무실 컴퓨터에선 이러한 에러가 나오고 있었다.
An error occurred (ClusterNotFoundException) when calling the ExecuteCommand operation: Cluster not found.
왜 클러스터를 못 찾는지 모르겠지만, CloudShell에선 정상적으로 작동하는 듯 하다. 현재 site to site vpn에 연결된 vpc에 있는 cluster이므로 그럴수 있다고 생각하여 진짜 연결된 쪽으로 다시 테스트 해야 할듯 하다.
장점
- Fargate Shell 연결이 가능해졌다.
- CloudShell에서만 되니 AWS Console 제어권만 정리하면 보안상으로도 이롭다.
단점
- 설치가 빡세다.
'AWS' 카테고리의 다른 글
개발팀의 일당백! Devops Engineer가 뭔가요? (0) | 2024.01.17 |
---|---|
ALB -> NGINX -> root domain to www domain proxy (0) | 2024.01.09 |
테라폼 맨땅에서 부터 적용하기 3 (4) | 2023.12.05 |
슬랙에서 Notion API를 통해 문서 검색 (feat. EC2) (0) | 2023.10.17 |
SSM 로그인 세션 관리 (0) | 2023.09.18 |