들어가며
이 게시물에서는 Verdaccio
라는 오픈 소스 NPM 저장소를 AWS 에서 사설 서버로 호스팅하는 방법을 다룹니다.
EC2의 Free Tier 는 12개월 간 월 750시간의 인스턴스 시간과, 월 30GB의 EBS 용량이 있습니다.
필자는 여기에서 EC2로 Verdaccio 컨테이너를 호스팅하고, S3를 이용해 데이터를 저장하기로 했습니다. (S3의 데이터 저장 비용이 더 저렴하기 때문입니다!)
EC2 인스턴스 구성 방법
인스턴스 시작
EC2 홈페이지에 접속합니다.
주황색으로 강조되어있는 인스턴스 시작
버튼을 클릭합니다.
이후 이동한 페이지에서 다음과 같이 설정합니다.
이름 및 태그
- 이름 : 인스턴스의 이름
애플리케이션 및 OS 이미지
Amazon Linux 선택
- Amazon Machine Image(AMI) : Amazon Linux 2023 AMI
- 아키텍처 : 64비트(x86)
인스턴스 유형
- 인스턴스 유형 : t2.micro
* 키 페어
SSH 등을 통해 인스턴스에 로그인하기 위한 키 페어.
없는 경우 새 키 페어 생성
버튼을 눌러 키 페어 인증서를 생성합니다.
생성한 인증서는 PC에 다운로드 됩니다.
네트워크 설정
편집을 통해 SSH 이외에 Verdaccio 접속을 위한 설정 필요.
- 우측 상단의
편집
클릭 보안 그룹 규칙 추가
클릭- 보안 그룹 규칙 설정
- 유형 : 사용자 지정 TCP
- 포트 범위 : 4873
- 소스 유형 : 내 IP (현재 내가 속한 외부 아이피)
스토리지 구성
8
Gibgp3
루트 볼륨
고급 세부 정보 > IAM 인스턴스 프로파일 지정
새 IAM 프로파일 생성
클릭
역할 생성
클릭
신뢰할 수 있는 엔터티 유형 : AWS 서비스
서비스 또는 사용 사례 : EC2 > EC2 > 다음
클릭
AmazonS3FullAccess
선택 > 다음
클릭
역할 이름 지정(역할 이름에는 영숫자 또는 _+=,.@-만 포함할 수 있습니다.) > 역할 생성
클릭
EC2 인스턴스 설정으로 돌아와서 > IAM 인스턴스 프로파일 새로고침
> 생성한 IAM 프로파일 선택
인스턴스 생성 및 시작
다음과 같이 설정되었을 때, 인스턴스 시작
버튼을 클릭해 인스턴스를 생성하고 시작합니다.
S3 버킷 생성
AWS S3 홈페이지에 접속합니다.
버킷 만들기 클릭
S3 버킷 구성
일반 구성
AWS 리전 : 아시아 태평양(서울) ap-northeast-2
버킷 이름 : verdaccio-bucket-yw-1 (임의로 지정, 전 세계적으로 고유한 이름이어야 함)
객체 소유권
ACL 비활성화됨(권장)
이 버킷의 퍼블릭 액세스 차단 설정
모든 퍼블릭 액세스 차단
버킷 버전 관리
비활성화 (활성화 시 버전 각각에 대한 스토리지 비용 추가 청구됨)
기본 암호화
암호화 유형 : Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화
버킷 키 : 활성화
버킷 만들기
버킷 만들기 클릭
Access Key 발급
EC2 인스턴스에서 S3 버킷을 마운트하기 위한 Access Key를 발급합니다.
우측 상단 사용자 이름 클릭 > 보안 자격 증명
클릭
Access Key 만들기
액세스 키 > 액세스 키 만들기
클릭
루트 액세스 키를 생성하는 것이 모범 사례는 아니지만 여전히 생성하려고 합니다.
체크액세스 키 만들기
클릭
액세스 키, 비밀 액세스 키를 보관하고 완료 클릭
EC2 - S3 마운트 (s3fs)
인스턴스 접속
퍼블릭 IPv4 DNS로 SSH 접속 시도(기본 사용자 ec2-user)
sudo ssh -i {키 페어 파일} ec2-user@{퍼블릭 IPv4 DNS}
S3FS-FUSE 설치
무료 오픈소스 FUSE 플러그인이며 주요 Linux 배포판 및 MacOS를 지원하는 유틸리티입니다.
이 플러그인은 Amazon S3 버킷을 시스템 드라이브로 표시합니다.
다음 블로그 게시물을 참조했습니다.
https://junghyeonsu.tistory.com/69
Yum 업데이트
sudo yum -y update --all
필요 패키지 설치
sudo yum install -y automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
S3FS-FUSE Install
권한이 있는 디렉터리에서 다음 코드 블럭을 실행시켜 s3fs를 설치합니다.
git clone https://github.com/s3fs-fuse/s3fs-fuse.git
cd s3fs-fuse
./autogen.sh
./configure
make
sudo make install
설치 여부 확인
which s3fs
S3FS 계정 설정 파일 생성 및 권한 부여
sudo vi /etc/passwd-s3fs
sudo chmod 600 /etc/passwd-s3fs
파일 내용은 {액세스 키}
:{비밀 액세스 키}
형태로 작성
예시 : awdfawfgwafawfwaf:awdwaawfawfwaf1223wad23
마운트 할 폴더 생성
필자는 루트 아래에 verdaccio-data 라는 이름으로 폴더를 생성하겠습니다.
sudo mkdir /verdaccio-data
S3FS 마운트
sudo s3fs {생성한 s3 버킷 이름} {마운트할 경로} -o use_cache=/tmp -o allow_other
예시)
sudo s3fs verdaccio-bucket-yw-1 /verdaccio-data -o use_cache=/tmp -o allow_other
테스트
아래 명령으로 파일을 생성하고, 버킷에 제대로 업로드 되었는지 확인
파일 생성 :
sudo touch /verdaccio-data/a
업로드 결과 확인 :
마운트가 되지 않는 경우
연결이 정상적으로 되지 않은 경우
- 마운트 대상 디렉터리가 비어있는지 확인
파일이 정상적으로 업로드 되지 않은 경우
- /etc/passwd-s3fs 파일 내용이 올바른지 확인
- EC2 인스턴스에 IAM 프로파일이 제대로 부여되어 있는지 확인
Verdaccio 컨테이너 구성
이제 본격적으로 EC2 인스턴스에서 Verdaccio 컨테이너를 구성해보도록 합니다.
docker, docker-compose 설치
docker-compose 설치를 위해 다음 블로그 게시물을 참고하였습니다.
Docker 설치
sudo yum install -y docker
// 도커 시작
sudo service docker start
// 권한 부여
sudo usermod -a -G docker ec2-user
// 부팅 시 자동 시작 서비스로 docker 등록
sudo chkconfig docker on
// 인스턴스 재시작
sudo reboot
Docker-compose 설치
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
docker-compose 구성
디렉터리/파일 구성
- docker-compose.yaml
version: '3.1'
services:
verdaccio:
image: verdaccio/verdaccio
container_name: 'verdaccio'
user: 'root'
networks:
- node-network
environment:
- VERDACCIO_PORT=4873
ports:
- '4873:4873'
volumes:
- './storage:/verdaccio/storage'
- './config:/verdaccio/conf'
- './plugins:/verdaccio/plugins'
networks:
node-network:
driver: bridge
- config.yaml
storage: /verdaccio/storage/data
plugins: /verdaccio/plugins
web:
title: Verdaccio
auth:
htpasswd:
file: ./htpasswd
uplinks:
npmjs:
url: https://registry.npmjs.org/
packages:
'@*/*':
# scoped packages
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
'**':
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
server:
keepAliveTimeout: 60
listen:
# - localhost:4873 # default value
# - http://localhost:4873 # same thing
- 0.0.0.0:4873 # listen on all addresses (INADDR_ANY)
# - https://example.org:4873 # if you want to use https
# - "[::1]:4873" # ipv6
# - unix:/tmp/verdaccio.sock # unix socket
middlewares:
audit:
enabled: true
log: { type: stdout, format: pretty, level: http }
docker-compose 실행
sudo docker-compose -f /verdaccio-data/docker-compose.yaml start
Verdaccio 접속 테스트
퍼블릭 IPv4 DNS을 이용해서 Verdaccio 서버 접속
http://{퍼블릭 IPv4 DNS}:4873
+ 만약 퍼블릭 IPv4 주소 또는 DNS를 고정하고 싶은 경우 EC2에서 탄력적 IP 라는 것을 이용하면 된다.
'DevOps' 카테고리의 다른 글
MinVer(Semantic Versioning) 사용법 (0) | 2023.09.25 |
---|---|
GitLab for Slack App 연동하기(Self-Managed GitLab 16.2 이상) (0) | 2023.09.09 |
Visual Studio 원격 서버 프로세스 디버깅 (0) | 2022.03.29 |
Jenkins - Publish Over FTP 모든 파일 및 하위 폴더 전송 방법 (0) | 2022.03.03 |