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

필요한 준비물
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 연동 등 다양한 고도화를 고려해볼 수 있습니다.