ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Express.js 백엔드, Docker, AWS ECS, MongoDB로 클라우드에 배포하기 (on ECS)
    CICD 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 연동 등 다양한 고도화를 고려해볼 수 있습니다.

     

    반응형
Designed by Tistory.