본문 바로가기

STUDY/Docker & Kubernetes: 실전 가이드 -2022년판

15. 도커 배포 프로세스: AWS ECS 활용2

다중 컨테이너 서비스

 

여기 2개의 컨테이너로 goals 서비스의 docker-compose 파일이 있다. 이 서비스는 backend와 mongodb 컨테이너가 각각 동작하면서 사용자로부터 정보를 입력받아서 저장하고 보여준다. 이렇게 다중 컨테이너로 동작하는 서비스를 ECS로 올려보고자 한다.

 

// backend의 app.js 파일
...
mongoose.connect(
  `mongodb://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@mongodb:27017/course-goals?authSource=admin`,
  {
...

ECS로 컨테이너들을 올리기 전에 수정해야하는 부분이 있다. 위의 코드는 backend에서 mongodb에 접속하는 코드이다. 보면 mongodb를 도메인 이름으로 사용해서 접속을 시도하고있다. 이처럼 도커 컴포즈로 컨테이너간의 통신을 할 때는 컨테이너의 이름만으로 서로 통신이 가능했다. 하지만 이는 도커 컴포즈의 기능이기 때문에 ECS에서는 db접속에 실패하고 에러가 발생한다.

 

// app.js 수정
...
mongoose.connect(
  `mongodb://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@${process.env.MONGODB_DOMAIN}:27017/course-goals?authSource=admin`,
  {
...

// backend.env 수정
MONGODB_USERNAME=max
MONGODB_PASSWORD=secret
MONGODB_DOMAIN=mongodb

도커 컴포즈로 실행할 때와 ECS로 실행할 때 환경에 따라 대응하기 위해서 도메인을 MONGODB_DOMAIN 환경변수로 입력받도록 수정하였다. 그리고 로컬에서 사용하는 backend.env에 MONGODB_DOMAIN의 값을 mongodb로 추가해 주었다.

 

> docker build -t backend .
> docker tag backend nankisu/backend
> docker push nankisu/backend

이제 도커허브에 backend 레포지토리를 생성하고 backend 이미지를 빌드하고 푸시하면 준비가 끝난다.

 

 


ECS 다중컨테이너 배포

 

이제 ECS에 다중 컨테이너 서비스를 배포하기 위해서 먼저 클러스터를 생성해주었다.

 

그리고 클러스터에 들어갈 태스크를 생성해준다.

 

그리고 태스크에 들어갈 backend 컨테이너도 푸시한 이미지를 통해서 생성하면 된다. 이때 환경변수에 MONGODB_DOMAIN을 localhost으로 추가하면 된다. ECS에서 동일 태스크에 추가된 컨테이너 간에는 서로 localhost로 접근할 수 있다. 그리고 mongodb 컨테이너는 mongo 공식 이미지를 사용하여 생성하면 된다.

 

이후 goals-task를 포함하고 goals-cluster 안에서 동작하는 서비스를 생성해주면 된다.

 

이후 태스크와 컨테이너 실행후 정상동작하는 것을 확인할 수 있다.

 

 


EFS를 볼륨으로 사용하기

 

ECS에 올라간 서비스는 /goals에 POST, GET 요청을 보내 데이터를 입력하고 조회한다. 하지만 지금은 mongodb 컨테이너가 종료되었다가 재시작하면 기존에 입력한 데이터는 모두 사라진다. 데이터를 유지하기 위해서는 외부 저장소를 연결해주어야 한다. EFS는 AWS에서 제공하는 스토리지 서비스중 하나로 쉽게 ECS에 연결할 수 있다.

 

ECS의 태스크 수정화면 하단에서 EFS를 볼륨으로 추가할 수 있다. 그리고 mongodb 수정화면 중간에 마운트 옵션을 설정하고 수정된 태스크로 서비스를 재시작 하면 된다.

728x90