[CLOUD] 3-Tier Architecture Server 배포 - ECS + Fargate
지난 포스팅은, EC2에 Springboot jar 파일을 복사해서 배포하는 방식으로 구성해봤다. 이번 포스팅은 ECS + Fargate 방식으로 배포하는 과정을 알아보려고 한다.
시작하기 전에 앞서, 간단한 개념은 여기에 정리했으니 참고하면 좋을 것 같다. 🍀
1. ECS + Fargate 배포
1. Dockerfile 생성
# OpenJDK 17 사용
FROM openjdk:17-jdk
# JAR 파일을 컨테이너에 복사
COPY build/libs/blog-0.0.1-SNAPSHOT.jar app.jar
# 실행 명령
ENTRYPOINT ["java","-jar","/app.jar"]
2. 빌드
docker build -t blog .
3. AWS ECR에 이미지 업로드
- 원하는 이름으로 리포지토리 생성
- 이때 리포지토리 이름 잘 기억하기!
4. AWS CLI로 ECR 로그인
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
5. 태그 붙이기
- 이때, Dockerfile에서 생성한 이미지 이름을 갖고와야 함 (나는 blog:latest 로 이미지 생성했었음)
docker tag blog:latest <account-id>.dkr.ecr.<region>.amazonaws.com/blog:latest
6. 이미지 푸시
- AWS ECR 레포지토리에 이미지 푸시해주기
docker push <account-id>.dkr.ecr.<region>.amazonaws.com/blog:latest
7. ECS 클러스터 생성
- 클러스터 이름 생성
- 인프라 : AWS Fargate 선택
⚠️ 이때, 나는 에러가 발생했다 .⸝⸝ʚ̴̶̷̆ ̯ʚ̴̶̷̆⸝⸝
- 핵심 문구만 살펴보자면, Please verify that the ECS service linked role exists.
➡️ 즉, IAM role 문제이다.
IAM 콘솔 창에 들어가보니, AWSServiceRoleForECS 역할 (AWS ECS 서비스가 필요로 하는 권한을 제공하는 역할) 에 권한 정책이 없으면 문제가 생긴다고 한다. ECS 권한 정책을 추가해주니까 성공적으로 클러스터 생성이 완료됐다.
2. ECS 설정
1. Tesk Definition
1. 태스크 정의 클릭 : ECS 콘솔 창 접속 후 왼쪽에 위치
2. Task 이름 정의 : blog-task
3. AWS Fargate 클릭
4. 운영 체제 / 아키텍처 : Linux/ARM64 (*운영체제 주의!!)
- MAC에서 Docker 이미지를 빌드했기 때문에, 빌드한 이미지는 ARM 아키텍처용으로 생성된다.
- 따라서 Fargate도 ARM 아키텍처에서 실행 가능하도록 Linux/ARM64를 선택해야 한다.
- 만약, x86으로 설정하면 Fagate 실행 시 exec format error 를 만나게 된다.
- 혹은, Mac에서 멀티 아키텍처 이미지로 빌드하는 방법도 있다.
5. CPU / 메모리 설정 : 1 vCPU / 3 GB( 테스트 용이라 아주 작게 설정했다.)
6. 컨테이너 이름 및 이미지 URL 설정 : 앞서 ECR에 올린 이미지 URL 복붙
7. (선택사항) 환경 변수 설정 : Springboot 서버에 DB 연결을 했어야 했기 때문에 환경 변수를 추가적으로 설정했다.
- 다음 세 가지를 추가해주고 값도 넣어준다.
SPRING_DATASOURCE_URL
SPRING_DATASOURCE_USERNAME
SPRING_DATASOURCE_PASSWORD
8. 클러스터 서비스 생성
- 만들어준 클러스터에 들어가면 서비스 생성란 클릭
- 앞서 생성한 태스크 클릭
- VPC/서브넷/보안그룹 설정 : 나는 앞서 생성한 VPC/ 서브넷 / 보안 그룹 선택해주었다.
9. 서비스 생성 완료
10. 생성된 태스크 확인 및 퍼블릭 IP 확인 : x.xx.xxx.96
11. 퍼블릭 IP 접속 테스트
자잘한 에러가 많아서 생각보다 시간이 좀 걸렸지만, 또 그 과정속에서 배웠으니 만족한다. ^^
다음엔 Github 액션으로 자동 배포까지 해보자!