BE 공부/Node.js

NPM 미러링 서버란?(2): ALB, Verdaccio, S3를 사용하는 이유

꼬질꼬질두부 2025. 1. 23. 10:11

도커에서 npm 미러링: ALB, Verdaccio, S3를 사용하는 이유

npm 패키지를 사용하는 개발 환경에서, 외부 npm 레지스트리(npmjs.com) 의존도를 줄이고 성능을 최적화하기 위해 미러링 서버를 설정하는 것은 매우 중요합니다. ALB(Application Load Balancer), Verdaccio, 그리고 S3를 조합하여 운영하면, 안정성과 확장성을 동시에 확보할 수 있습니다. 이번 글에서는 이 세 가지를 왜 함께 사용하는지, 그리고 npm 미러링 과정을 간단하게 설명합니다.


왜 ALB, Verdaccio, S3를 함께 사용하는가?

1. 데이터의 영속성 (S3)

Verdaccio를 로컬 디스크에 설정하면 컨테이너 재시작이나 환경 변경 시 데이터 유실 위험이 있습니다. S3를 사용하면 AWS의 관리형 스토리지 서비스로 데이터의 영속성을 보장할 수 있습니다.

2. 확장성과 안정성 (ALB)

  • 로컬 Verdaccio는 단일 컨테이너로 동작하므로 트래픽이 많아지면 병목 현상이 발생할 수 있습니다.
  • ALB를 사용하면 여러 Fargate 컨테이너로 부하를 분산시켜 확장성을 확보할 수 있습니다.

3. npm 레지스트리 기능 (Verdaccio)

  • Verdaccio는 npm 클라이언트와 외부 레지스트리 사이에서 프록시 역할을 수행하며, 사용자 인증과 권한 관리, 패키지 캐싱 등의 기능을 제공합니다.
  • S3와 연동하여 패키지를 캐싱하고, 외부 네트워크 의존도를 최소화합니다.

4. HTTPS 보안 통신 (ALB)

ALB는 HTTPS 연결을 지원하여 보안 강화를 제공합니다. 클라이언트와 Verdaccio 서버 간의 통신이 암호화되므로 안전한 환경에서 npm 패키지를 다운로드할 수 있습니다.


npm 미러링 과정

npm 미러링 과정은 클라이언트 요청 → ALB → Verdaccio → S3 및 외부 레지스트리의 순서로 동작하며, 데이터를 효율적으로 관리하기 위해 S3를 활용합니다.

1. 요청 흐름

  1. npm 클라이언트 요청 클라이언트가 특정 npm 패키지(예: express)를 설치하려고 하면 요청은 설정된 레지스트리 URL로 전달됩니다.
  2. npm set registry https://<your-verdaccio-url> npm install express
  3. ALB에서 요청 처리
    • ALB는 클라이언트 요청을 수신하고, Verdaccio 컨테이너로 라우팅합니다.
  4. Verdaccio에서 요청 처리
    • 로컬 캐시 확인: Verdaccio는 S3에 해당 패키지가 캐시되어 있는지 확인합니다.
    • 캐시 여부:
      • 있음: S3에서 데이터를 반환.
      • 없음: 외부 레지스트리(npmjs.com)로 요청을 전달.
  5. 외부 레지스트리로 요청 전달
    • 패키지가 S3에 없을 경우 외부 레지스트리에서 패키지를 다운로드합니다.
  6. 패키지 반환 및 저장
    • 다운로드한 패키지를 클라이언트로 반환하고, S3에 캐싱하여 다음 요청 시 로컬에서 처리할 수 있도록 준비합니다.

2. S3, Verdaccio, ALB의 역할

  • S3:
    • 패키지 데이터를 저장하는 영구적인 스토리지 역할.
    • 캐시된 데이터를 제공하여 외부 요청을 최소화.
  • Verdaccio:
    • 클라이언트 요청을 수신하고 S3와 통신하며, 필요 시 외부 레지스트리에 프록시 요청.
    • 사용자 인증 및 권한 관리를 지원하여 보안성을 강화.
  • ALB:
    • HTTPS를 통해 보안을 강화하고, 트래픽을 Verdaccio 컨테이너로 분산시킴.

미러링 설정 체크리스트

1) Docker 컨테이너 구성

  • Verdaccio 컨테이너를 생성하고, config.yaml 파일을 /verdaccio/conf/config.yaml 경로에 배치.

2) S3 연동 설정

  • AWS S3 버킷을 생성하고, config.yaml 파일에 아래와 같이 설정:
    store:
      s3:
        bucket: verdaccio-packages
        keyPrefix: verdaccio/
        region: ap-northeast-2
    

3) HTTPS와 ALB 설정

  • ALB를 통해 HTTPS 연결을 구성하고, 외부 트래픽을 처리할 수 있도록 설정.

4) npm 클라이언트 설정

  • 클라이언트에서 Verdaccio 레지스트리를 등록하고 로그인:
    npm set registry https://<your-domain-name>
    npm login --registry=https://<your-domain-name>
    

미러링 과정 그림으로 보기

클라이언트 요청  --->   ALB   --->  Verdaccio 컨테이너
   npm install     (HTTPS)        (Fargate에서 실행)
        \                                   /
         \                                 /
          \---> S3 (스토리지) <---/
  • 클라이언트는 ALB를 통해 요청을 전달하며, HTTPS를 사용하여 보안을 강화.
  • Verdaccio 컨테이너는 요청된 패키지가 S3에 있는지 확인하고, 없으면 외부 레지스트리로 요청.
  • 패키지가 S3에 저장된 이후, 동일한 요청은 빠르게 처리 가능.

결론

ALB + Verdaccio + S3 구조는 npm 패키지 관리의 효율성을 높이고, 성능과 안정성을 제공하는 아키텍처입니다.

  • S3는 데이터를 안전하게 저장.
  • Verdaccio는 프록시와 레지스트리 기능을 제공.
  • ALB는 HTTPS로 보안을 강화하며 트래픽을 분산.

이런 구성을 통해 외부 네트워크 의존도를 줄이고, 조직의 개발 생산성을 극대화할 수 있습니다.