정리를 잘 하고 살자고 다짐을 하긴 했는데,
우선 ECS 를 돌리는 게 목표였던 지라, 이미지로 남겨둔 게 없네요... 아쉬워라...
그래도 어찌 저찌 텍스트로는 정리를 해 둔 저에게 셀프 복복복복복복을 시전하겠습니다.
필자의 팀은 2차 프로젝트에 들어오면서 가장 먼저 한 일이 기존 단일 서비스를 MSA 구조로 분리하는 작업이었습니다.
사실 클라우드 과정을 듣고 있는데 컨테이너 하나에 띨롱 올려서 서비스를 운영한다?
이건 있을 수 없는 일이올시다. 자존심이 없어진다!!!
물론 이런 생각도 있었지만
현실적인 이슈가 꽤나 있었습니다.
저희 팀은 2인팀인뎁쇼, 다른 팀에 비해 명수가 2명이 모자랐습니다.
그래서 운영 부담을 최소화할 수 있는 구조를 생각할 수 밖에 없었어요.
결론적으로 Fargate 기반의 ECS를 통해 운영적인 측면에서 이점을 챙겨가고 싶었어요.
서버리스 형태로 컨테이너를 관리할 수 있고, 직접 EC2를 띄우고 관리하는 필요가 없어졌고... 얼마나 편리합니까.
또, 애초에 대규모 사용자가 이용하는 서비스임을 가정하고 진행하기 때문에 앞서 말한 운영측면과 동시에 고가용성을 확보해야 한다고 생각했습니다.
그래서 결과적으로, MSA가 분리가 잘 되었는지 & 서비스 동작이 잘 되는지를 우선 확인하고자 ECS를 선택하게 되었습니다.
목표
Docker 이미지로 만든 Spring 서비스를 ECS + Fargate에서 실행
(이미지: ECR에 업로드되어 있다고 가정)
ECS Fargate 콘솔 배포 전체 순서
1. ECS 클러스터 생성
- AWS 콘솔 접속 → ECS 서비스로 이동
- 왼쪽 메뉴에서 [클러스터] → [클러스터 생성]
- 템플릿 선택: "Networking only (Fargate)"
- 클러스터 이름 입력 (예: my-fargate-cluster)
- 나머지는 기본값 → [클러스터 생성]
ECR에 이미지 배포
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 982081072642.dkr.ecr.ap-northeast-2.amazonaws.com/route33
- ${위에서 생성한 도커 이미지 이름}
- 이전에 빌드한 Docker 이미지의 이름으로 변경필요
- ex) route33-auth-image : 사용자가 지정한 이미지 이름을 입력
- ${ecr url}
- 사용자의 ECR URL로 변경 필요
- 앞서 로그인할 때 사용했던 ECR URL과 동일
- ex) @@@@@@@.dkr.ecr.ap-northeast-2.amazonaws.com
- ${ecr repository 이름}
- 이 부분은 사용자가 생성한 ECR 리포지토리 이름으로 변경해야 합니다.
- ex) route33
- ${버전 정보}
- 이 부분은 Docker 이미지의 버전 정보로 변경해야 합니다.
- ex) v1.0.0
docker tag route33-auth-image @@@@@@@@@@@@.dkr.ecr.ap-northeast-2.amazonaws.com/route33:auth
docker push @@@@@@@@@@@@..dkr.ecr.ap-northeast-2.amazonaws.com/route33:auth
docker tag route33-service-img @@@@@@@@@@@@..dkr.ecr.ap-northeast-2.amazonaws.com/route33:service
docker push @@@@@@@@@@@@..dkr.ecr.ap-northeast-2.amazonaws.com/route33:service
2. Task Definition 생성
- 왼쪽 메뉴에서 [Task Definitions] → [Create new Task Definition]
- Launch type: FARGATE 선택
- Task 이름 입력 (예: spring-app-task)
- Task size 선택
- CPU: 0.5 vCPU (512)
- Memory: 1GB (Spring 서비스 기준 넉넉하게)
- Container 정의 추가
- Add container 클릭
- Container name: spring-app
- Image URI: @@@@@@@@@@@@..dkr.ecr.ap-northeast-2.amazonaws.com/spring-app
- Port mapping: 8080 (Spring 앱 포트)
- Add container 클릭
- (선택) 로그 설정: CloudWatch 로그 그룹 이름 입력
- Enable Auto-configure CloudWatch logs
- [Create] 클릭
3. 서비스 생성 (Task 실행)
- 왼쪽 메뉴 → [Clusters] → 만든 클러스터 클릭
- 상단 메뉴에서 [Services] → [Create]
- 다음 값 입력:
- Launch type: FARGATE
- Task Definition: 아까 만든 것 선택
- Cluster: my-fargate-cluster
- Service name: spring-app-service
- Number of tasks: 1
- 네트워크 설정
- VPC: 기본 VPC 선택
- 서브넷: 퍼블릭 서브넷 2개 선택
- Auto-assign public IP: ENABLED
- 보안 그룹: 새로 생성하거나 기존 보안 그룹에서 8080 포트 열기
- 로드 밸런서 설정은 건너뛰기 (나중에 ALB로 설정 가능)
- [Next → Create Service]
4. 서비스 실행 확인
- 클러스터 → 서비스 → Task 확인
- 상태가 RUNNING이면 성공!
- Task 클릭 → Public IP 확인
- 브라우저에서: http://<퍼블릭 IP>:8080 → 접속 확인
+) 보안 그룹 확인 팁
- EC2 → 네트워크 인터페이스 → ECS Task의 ENI 찾아서 연결된 보안 그룹 확인
- 인바운드 규칙: 포트 8080에 0.0.0.0/0 허용되어 있어야 외부 접속 가능
+) 모니터링 & 재해 즉각 대응 방안
ECS 서비스와 Lambda 함수 등에 대해 CloudWatch 기반 경보를 설정하고, SNS를 통해 알림이 자동 전송되도록 구성했어용
ECS TASK의 CPU를 기준으로 경보를 설정했답니다.
기준은 CPU 사용량이 1분동안 70%가 넘을 경우로 설정을했어요.
테스트를 위해서는 CPU사용량이 1분동안 0.001 유지 시 경보가 울리도록 했어요!
Cloudwatch 경보에 설정한 임계값을 넘어가면
Lamda함수를 트리거하고 Lambda 함수는
팀 디스코드에 메세지 전송을 통해 운영자가 빠르게 파악할 수 있도록 구현했답니당
끗!
'☁️ 뭉게뭉게 클라우드' 카테고리의 다른 글
[AWS | EKS ] EKS vs EC2-K8s (2) | 2025.07.04 |
---|---|
[Cloud | DeepDive] 최종 프로젝트 회고 | 클라우드 네이티브 엔지니어링 2회차 (3) | 2025.07.04 |
[AWS | Cloud] API Gateway , Lambda-JWT 인증 적용 (3) | 2025.07.03 |
[Cloud | DeepDive] 2차 프로젝트 회고 | 클라우드 네이티브 엔지니어링 2회차 (0) | 2025.06.28 |
[Cloud | DeepDive] ZAP 을 사용한 취약점 분석 및 설명 (0) | 2025.06.28 |