Amazon Elastic Container Service란?

박수민·2024년 4월 17일
0

Amazon ECS란?

ECS는 "Elastic Container Service"의 약자로, Amazon Web Services (AWS)에서 제공하는 관리형 컨테이너 오케스트레이션 서비스입니다. 또한 클러스터에서 컨테이너를 쉽게 실행, 중지 및 관리할 수 있게 해주는 컨테이너 관리 서비스 입니다. 간단한 API 호출을 사용하여 컨테이너 기반 애플리케이션을 시작하고 중지할 수 있습니다.

저희 팀 프로젝트는 Monolithic Architecture에서 MicroSerivces Architecture(일부)로 바꾸기 위하여

  • 각 서버를 나누어 준비
  • 서버 간의 통신은 feign통신을 사용
  • 공통적으로 들어가는 내용은 공통 라이브러리를 만들어 사용

하는 등의 방법을 선택하여 MSA환경을 만들어보고자 하였다.

처음에는 서버를 각각 Dockerfile을 만들어 build하고 Docker image를 만들어 Docker Hub에 push 하고 push한 Docker image(Repositories)를 AWS EC2 인스턴스(초기 t2.micro -> t4g.medium)에 pull을 받아 EC2에 docker-compose.yml파일을 작성하여 docker compose를 통하여 묶어서 서버에 띄워 배포하였다.
BUT.
위와 같은 방식으로 진행하게된다면 MSA환경으로 서버를 나누는 이유가 사라진다.(의미가 없어진다)
ex)인스턴스가 다운되면 모든 서비스가 중지되어 서버의 독립성이 없어진다.
그래서 ECS로 서버를 각각 띄워보기로 하였다.
그렇게되면 서버에 문제가 생기더라도 다른 서버에 미치는 영향을 최소화할 수 있을거라 생각하였다.

ECS를 이용하여 MSA 환경 구축하기

1. 시작전 프로젝트에서 준비

시작하기 전 프로젝트들에 HealthCheck를 하기위해 아주 간단한 API를 하나 만들어줍니다.

@RestController
public class HealthCheckController {

    @GetMapping
    public String checkHealth() {
        return "OK";
    }
}

Dockerfile은 아래와 같이 작성해주었습니다.
인스턴스 타입이 t4g.medium-64-bit(ARM)는 t2.micro-64bit(x86, ARM)와 Architecture가 다르기때문에 작성을 다르게 작성해주어야 합니다. (Architecture에 맞게 작성해주세요!)

# Dockerfile

# jdk17 Image Start-64-bit(ARM)
FROM --platform=linux/arm64 openjdk:17

# jdk17 Image Start-64bit(x86)
FROM openjdk:17

# 인자 설정 - JAR_File
ARG JAR_FILE=build/libs/*.jar

# jar 파일 복제
COPY ${JAR_FILE} app.jar

# 인자 설정 부분과 jar 파일 복제 부분 합쳐서 진행해도 무방
#COPY build/libs/*.jar app.jar

# 실행 명령어
ENTRYPOINT ["java", "-jar", "app.jar"]

bootJar를 실행하여 jar파일을 build 합니다.
로컬에서 서버가 잘 뜨는지는 먼저 확인합니다.

2. Docker Image Build 및 ECR에 Image push하기.

ECR이란? 이미지들을 관리, 저장해주는 AWS의 Repository ( Docker Hub ?)

가장 먼저 프로젝트를 docker image로 빌드를 하고
ECS에서 리포지토리 생성을 해줍니다.

리포지토리가 잘 생성이 되었다면 이미지를 푸시합니다.
생성된 리포지토리를 들어가여 푸시 명령 보기를 클릭해 image를 push 합니다.

명령 프롬프트에서 아래의 명령어를 순서대로 실행합니다. 원하는 태그를 달아 push 할 수 있습니다.

이미지 푸시가 성공적으로 이루어진 모습입니다.

3. Task 정의 생성

다음으로 Task 정의를 생성해야 합니다.

먼저 태스크 정의 패밀리의 이름을 지정해줍니다.

AWS Fargate로 인프라 설정을 해줍니다. 그 밖의 다른 설정은 default로 진행합니다.

컨테이너 이름과 이미지 URI를 넣어주어야 하는데 이미지 URI는 ECR에 Push한 이미지 URI를 넣어주면 됩니다.
ECR 리포지토리에서 URI 복사한 후 붙여 넣어주면 됩니다.

이후 포트설정을 해주고 환경 변수가 필요하다면 넣어줘야 합니다.
이 프로젝트의 경우엔 application.yml에 DB정보나 JWT-secret-key같은 정보들을 환경변수로 설정해 놓았기 때문에 환경 변수를 추가해 주었습니다.

여기까지 설정을 마쳤다면 태스크 정의 생성을 해주면 됩니다.

4. Cluster 생성

클러스터의 이름을 설정하고 Fargate로 생성해줍니다.

5. Service 생성

생성된 클러스터에 들어와 서비스를 생성해줘야 합니다.
서비스 란의 생성 버튼을 눌러 생성합니다.
환경란은 모두 default로 설정하고 넘어갑니다.

위에서 생성한 테스크 정보를 넣어줍니다.
서비스 이름도 원하는 이름을 지정해주면 됩니다.

추가적으로 네트워킹과 로드밸런싱을 설정해주었습니다.

네트워킹 설정에서는 VPC, 서브넷, 보안그룹을 설정해주겠습니다.

저는 여러개의 서비스를 만들고 로드밸런서를 통해 요청을 나누어 보내기 위해 한개의 로드밸런서를 계속 사용합니다.

다음으로 리스너와 대상 그룹을 설정해줍니다.
리스터 포트에 8081로 열어주면 로드밸런서에 8081번 포트로 요청이 오면 이 요청을 대상 그룹으로 전달합니다.

설정을 마쳤으면 서비스를 생성합니다.

6. 대상 그룹의 대상 등록하기

서비스를 생성하면 잠시 뒤에 클러스터안에 서비스가 생성되기 시작합니다. 서비스에 들어가 정의된 태스크에 들어갑니다.

프라이빗 IP를 복사합니다.

이후 대상 그룹에서 대상 등록하기 버튼을 누릅니다.

태스크에서 복사한 프라이빗 IP주소를 Ipv4에 넣어줍니다. 포트는 8081로 설정하고 아래에 보류 중인 것으로 포함을 누른뒤 대상을 등록합니다.

여기까지 성공적으로 마치면 서비스가 성공적으로 생성됩니다.

7. 확인

생성된 서비스에 들어와 로드 밸런서 보기 버튼을 클릭합니다.

DNS이름을 복사하여 새로운 페이지에서 접속해보겠습니다.

성공적으로 배포가 완료되었습니다.

0개의 댓글