CICD

Express.js 백엔드, Docker, AWS ECS, MongoDB로 클라우드에 배포하기 (on ECS)

소금찍은사과 2025. 9. 4. 15:17
반응형

필요한 준비물

Express.js 백엔드를 배포하려면 Node.js와 npm이 설치돼 있어야 합니다. AWS CLI 설정과 Docker 설치도 필요하며, AWS 계정, 그리고 MongoDB Atlas 계정(혹은 직접 호스팅할 MongoDB)이 있어야 합니다.

Express.js 앱 기본 구조

프로젝트 폴더를 만들고 express, mongoose 패키지를 설치한 후, 아래와 같이 기본 서버 코드를 작성하면 됩니다.

// index.js
const express = require(express);
const mongoose = require(mongoose);
const app = express();
const PORT = process.env.PORT || 3000;

app.use(express.json());
mongoose
  .connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log(MongoDB connected))
  .catch((err) => console.log(err));

app.get(/, (req, res) => res.send(Welcome to the Express ECS App!));

app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

Docker 이미지 만들기

프로젝트 루트 폴더에 Dockerfile을 추가해서 Express.js 앱을 컨테이너로 만들 수 있습니다.

# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [node, index.js]

로컬 개발환경: Docker Compose로 Express와 MongoDB 동시 실행

개발 시에는 docker-compose.yml을 이용해 Express.js와 MongoDB 컨테이너를 한 번에 띄울 수 있습니다.

# docker-compose.yml
version: 3.8
services:
  backend:
    build: .
    ports:
      - 3000:3000
    environment:
      - MONGO_URI=mongodb://mongo:27017/expressdb
    depends_on:
      - mongo
  mongo:
    image: mongo:5
    volumes:
      - mongo_data:/data/db
volumes:
  mongo_data:

커맨드 한 번으로 실행:

docker-compose up --build

Docker 이미지를 AWS ECR로 업로드하기

AWS ECR에 Express.js 이미지를 올리려면 리포지터리를 만들고(aws ecr create-repository), 로그인한 뒤 이미지를 태깅 및 푸시합니다.

aws ecr get-login-password | docker login --username AWS --password-stdin <your-aws-account-id>.dkr.ecr.<region>.amazonaws.com
docker tag express-ecs-app:latest <your-aws-id>.dkr.ecr.<region>.amazonaws.com/express-ecs-app
docker push <your-aws-id>.dkr.ecr.<region>.amazonaws.com/express-ecs-app

AWS ECS와 Fargate로 배포하기

클러스터와 Task Definition을 만든 뒤 서비스로 등록합니다. 아래 JSON 샘플처럼 환경변수를 지정하고, Fargate 서버리스로 배포할 수 있습니다.

{
  family: express-task,
  networkMode: awsvpc,
  requiresCompatibilities: [FARGATE],
  cpu: 256,
  memory: 512,
  containerDefinitions: [
    {
      name: express-container,
      image: <your-aws-id>.dkr.ecr.<region>.amazonaws.com/express-ecs-app:latest,
      portMappings: [
        { containerPort: 3000, protocol: tcp }
      ],
      environment: [
        { name: MONGO_URI, value: <your-mongo-uri> }
      ]
    }
  ]
}

MongoDB 운영 환경에서 사용하기

로컬 개발 때는 Docker Compose로 MongoDB를 띄웠지만, 실제 운영 환경에서는 직접 호스팅하거나 MongoDB Atlas(클라우드 DB)를 사용하는 것이 더 안전합니다. MONGO_URI도 환경에 맞게 변경하고, 중요한 정보는 AWS Secrets Manager 또는 SSM Parameter Store로 관리하세요.

배포 시 주의할 점 및 베스트 프랙티스

  • .env 파일을 사용해 비밀 정보는 절대 코드에 직접 입력하지 마세요.
  • Docker 이미지는 버전이나 커밋 별로 태그 관리하세요.
  • AWS CloudWatch Logs로 모니터링 기능을 추가하는 것이 좋습니다.
  • ALB(로드 밸런서)를 활용해 유연한 라우팅과 자동 확장 지원을 받을 수 있습니다.
  • 데이터베이스는 ECS와 분리하여 별도의 매니지드 서비스(MongoDB Atlas 등)에 두는 게 좋습니다.

배포 완료와 다음 단계

Express.js 앱을 ECS에 성공적으로 배포하면 ALB DNS 또는 퍼블릭 IP로 서비스를 확인할 수 있습니다. 이후에는 HTTPS 적용(ACM 사용), 자동 확장, CI/CD(GitHub Actions+ECR), Redis나 S3 연동 등 다양한 고도화를 고려해볼 수 있습니다.

 

반응형