본문 바로가기

DevOps

EC2와 docker-compose를 활용한 MSA 서버 배포

AWS와 Docker의 도움 없이, MSA 구조의 서버를 배포하려면, 시간이 얼마나 오래 걸릴지 상상할 수 도 없다.

AWS 서비스를 이용하여, 클릭 몇 번만으로, Linux 서버와 IP를 빌릴 수 있고, Docker Engine을 이용해 하나의 yaml파일로 5개의 서버를 정의하고 작동시킬 수 있다.

그래서 HTTP-MSA 구조를 가지고 있는 “영어 암기 서비스”를 AWS와 Docker의 도움을 받아, 손쉽게 배포하는 방법에 대해서 알아본다

인프라-구성 방법 설명

※ 서버는 크게 프론트 페이지를 제공하는 UI 서버

  백엔드 처리를 하는 API 서버, MySQL

  응답 시간이 오래걸리는 로직을 대신 처리해주는 PlusAPI서버와 두 API 서버 연결해주는 Kafka로 구성된다.

1. EC2에 Elastic IP 할당

EC2에 이벤트가 발생되어도, 변하지 않는 IP를 할당하기 위해서, Elastic IP를 설정했다.

하나의 EC2안에서 모든 서버가 동작하기 때문에, 해당 IP주소로 네트워크 설정을 하면 된다는 편리성이 있다.

 

2. 인터넷과 통신하는 UI, API 서버 배포

Local 환경에서, 개발한 UI, API 서버를 손쉽게 AWS 배포하기 위해, docker hub에 이미지를 등록하여, docker-compose파일에서 참고하도록 설정했다.

외부 인터넷을 통해 유저들이 사용할 수 있도록, ports 설정 후 AWS 보안 그룹을 통해 해당 포트 인바운드를 전부 허용했다.

version: "3"

services:
  ui:
    image: hwangdy/ui:latest
    container_name: uic
    ports:
      - "80:80"
    restart: always
  api:
    image: hwangdy/api:latest
    container_name: apic
    ports:
      - "5511:5511"

 

3. 보안 그룹을 이용한, 외부 연결이 차단된 MySQL, Kafka, PlusAPI 배포

MySQL, Kafka, PlusAPI 서버는 외부 유저가 접근하지 않도록 설정하는 것이 좋다. docker-compose 파일에서 port를 여는 것을 허용하되, AWS 보안 그룹을 통해, 해당 EC2 IP만 인바운드를 허용하는 규칙을 설정했다.

MySQL 컨테이너를 생성할 때, enviroments를 통해, root 비밀번호와, user를 설정할 수 있다. 그리고 volume을 통해 sql파일을 컨테이너가 생성될 때 전달하여, 데이터베이스와 테이블이 자동으로 생성할 수 있도록 설정했다.

version: "3"

services:
  db:
    image: mysql:8.0.31
    container_name: dbc
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=~~~
      - MYSQL_USER=~~~
      - MYSQL_PASSWORD=~~~
      - MYSQL_DATABASE=~~~
    volumes:
      - "./schema.sql:/docker-entrypoint-initdb.d/schema.sql"