☁️ 뭉게뭉게 클라우드

[AWS | Cloud] ECS Fargate기반 실행 | ECR

우주수첩 2025. 7. 3. 15:55
728x90

 

정리를 잘 하고 살자고 다짐을 하긴 했는데,

우선 ECS 를 돌리는 게 목표였던 지라, 이미지로 남겨둔 게 없네요... 아쉬워라...

 

그래도 어찌 저찌 텍스트로는 정리를 해 둔 저에게 셀프 복복복복복복을 시전하겠습니다. 

 


 

필자의 팀은 2차 프로젝트에 들어오면서 가장 먼저 한 일이 기존 단일 서비스를 MSA 구조로 분리하는 작업이었습니다.

 

사실 클라우드 과정을 듣고 있는데 컨테이너 하나에 띨롱 올려서 서비스를 운영한다?

이건 있을 수 없는 일이올시다. 자존심이 없어진다!!! 

물론 이런 생각도 있었지만

현실적인 이슈가 꽤나 있었습니다. 

 

 

 

저희 팀은 2인팀인뎁쇼,  다른 팀에 비해 명수가 2명이 모자랐습니다.

그래서 운영 부담을 최소화할 수 있는 구조를 생각할 수 밖에 없었어요.

 

결론적으로 Fargate 기반의 ECS를 통해 운영적인 측면에서 이점을 챙겨가고 싶었어요. 

서버리스 형태로 컨테이너를 관리할 수 있고, 직접 EC2를 띄우고 관리하는 필요가 없어졌고... 얼마나 편리합니까.

 

또, 애초에 대규모 사용자가 이용하는 서비스임을 가정하고 진행하기 때문에 앞서 말한 운영측면과 동시에 고가용성을 확보해야 한다고 생각했습니다. 

 

그래서 결과적으로, MSA가 분리가 잘 되었는지 & 서비스 동작이 잘 되는지를 우선 확인하고자 ECS를 선택하게 되었습니다. 

 

 


 

목표

Docker 이미지로 만든 Spring 서비스를 ECS + Fargate에서 실행

(이미지: ECR에 업로드되어 있다고 가정)

 

ECS Fargate 콘솔 배포 전체 순서

 

1. ECS 클러스터 생성

  1. AWS 콘솔 접속 → ECS 서비스로 이동
  2. 왼쪽 메뉴에서 [클러스터] → [클러스터 생성]
  3. 템플릿 선택: "Networking only (Fargate)"
  4. 클러스터 이름 입력 (예: my-fargate-cluster)
  5. 나머지는 기본값 → [클러스터 생성]

 

ECR에 이미지 배포

  1. AWS CLI : https://velog.io/@tanggu01/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
  1. ${위에서 생성한 도커 이미지 이름}
    • 이전에 빌드한 Docker 이미지의 이름으로 변경필요
    • ex) route33-auth-image :  사용자가 지정한 이미지 이름을 입력
  2. ${ecr url}
    • 사용자의 ECR URL로 변경 필요
    • 앞서 로그인할 때 사용했던 ECR URL과 동일
    • ex) @@@@@@@.dkr.ecr.ap-northeast-2.amazonaws.com
  3. ${ecr repository 이름}
    • 이 부분은 사용자가 생성한 ECR 리포지토리 이름으로 변경해야 합니다.
    • ex) route33
  4. ${버전 정보}
    • 이 부분은 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 생성

  1. 왼쪽 메뉴에서 [Task Definitions] → [Create new Task Definition]
  2. Launch type: FARGATE 선택
  3. Task 이름 입력 (예: spring-app-task)
  4. Task size 선택
    • CPU: 0.5 vCPU (512)
    • Memory: 1GB (Spring 서비스 기준 넉넉하게)
  5. Container 정의 추가
    • Add container 클릭
      • Container name: spring-app
      • Image URI: @@@@@@@@@@@@..dkr.ecr.ap-northeast-2.amazonaws.com/spring-app
      • Port mapping: 8080 (Spring 앱 포트)
  6. (선택) 로그 설정: CloudWatch 로그 그룹 이름 입력
    • Enable Auto-configure CloudWatch logs
  7. [Create] 클릭

 

3.  서비스 생성 (Task 실행)

  1. 왼쪽 메뉴 → [Clusters] → 만든 클러스터 클릭
  2. 상단 메뉴에서 [Services] → [Create]
  3. 다음 값 입력:
    • Launch type: FARGATE
    • Task Definition: 아까 만든 것 선택
    • Cluster: my-fargate-cluster
    • Service name: spring-app-service
    • Number of tasks: 1
  4. 네트워크 설정
    • VPC: 기본 VPC 선택
    • 서브넷: 퍼블릭 서브넷 2개 선택
    • Auto-assign public IP: ENABLED
    • 보안 그룹: 새로 생성하거나 기존 보안 그룹에서 8080 포트 열기
  5. 로드 밸런서 설정은 건너뛰기 (나중에 ALB로 설정 가능)
  6. [Next → Create Service]

4. 서비스 실행 확인

  1. 클러스터 → 서비스 → Task 확인
  2. 상태가 RUNNING이면 성공!
  3. Task 클릭 → Public IP 확인
  4. 브라우저에서: 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 함수는

팀 디스코드에 메세지 전송을 통해 운영자가 빠르게 파악할 수 있도록 구현했답니당

 

 

끗!

728x90