AWS 프리티어로 웹서비스 배포 - EC2 인스턴스 설정하기
개요
Doo Wiki를 개발하면서, 작업한 내용을 aws에 배포하고싶어졌다.
집에 RHEL 서버가 있지만 트래픽이 몰리면 네트워크가 아예 끊어지기도하는 등 안정적이지도 않고
회사에서 사용하던 AWS를 이참에 공부해보고싶기도 해서
AWS 프리티어로 배포해보았다.
이 과정에서 여러가지 일들이 있었기 때문에 트러블 슈팅을 정리해보고자한다.
1. EC2 인스턴스 구성 전
AWS 프리티어로 웹서비스 배포 - ECS 구성
이쪽 내용 참고.
2. 필수 소프트웨어 설치
2.0 os 확인
cat /etc/os-release 로 ec2 인스턴스가 어떤 os인지 알아야 한다.
일반적인 가이드에서는 Amazon Linux 2를 기준으로 하고
sudo amazon-linux-extras install nginx1를 사용하지만
Amazon Linux 2023를 사용하는 경우
sudo dnf install nginx -y를 사용한다.
2.1 Node.js 설치: NVM의 구원
처음에는 그냥 apt-get으로 Node.js를 설치하려 했는데, 내 Doo Wiki가 node LTS를 지원하지 않더라
이후에 node LTS 버전에 호환되도록
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
source ~/.bashrc
nvm install 20 # 최신 안정 버전을 선택했습니다이 과정에서 source ~/.bashrc를 잊어 NVM 명령어가 인식되지 않아 한동안 헤맸다
3. 내 소중한 애플리케이션 배포하기
3.1 Git 사용의 즐거움
로컬에서 개발한 코드를 EC2로 가져오는 과정에서 Git의 편리함을 다시 한 번 실감했다.
git clone https://github.com/myusername/DooSyncObsidian.git
cd DooSyncObsidian/doo_sync_obsidian/3.2 의존성 지옥과의 조우
npm install 명령을 실행했을 때, 메모리 부족 오류가 발생했다.
npm install
# 에러: FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory이를 해결하기 위해 스왑 파일을 생성하고 메모리를 늘려주었다.
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab이후에야 겨우 npm install이 성공했다.
4. PM2 설치 및 실행
pm2를 통해 노드 애플리케이션을 백그라운드에서 실행하고 관리하는 데 큰 도움이 되었다.
npm install -g pm2
pm2 start npm -- start처음에는 pm2 start app.js처럼 직접 파일을 지정했다가, npm start 스크립트를 사용하는 방법을 알게 되어 수정했다.
5. Nginx 설정
Nginx 설치는 쉬웠지만, 설정에서 한참을 헤맸다.
sudo dnf install nginx -y
sudo systemctl start nginx특히 리버스 프록시 설정에서 많이 고생했는데, 결국 이렇게 해결했다:
server {
listen 80;
server_name _; # 처음에는 도메인이 없어서 이렇게 설정함
location / {
proxy_pass http://localhost:33000; # 내 앱이 33000 포트를 사용
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}6. 방화벽 설정
처음에는 왜 외부에서 접속이 안 되는지 몰라 한참을 고민했다.
알고 보니 방화벽 설정을 깜빡했었다.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 33000 -j ACCEPT # 처음에는 이것도 열어줬습니다7. 성공
모든 설정을 마치고 브라우저에서 EC2 인스턴스의 퍼블릭 IP를 입력했을 때의 그 짜릿함이란...
정말 잊을 수 없다.
curl http://13.61.11.47 # 실제 IP는 다르겠지만, 이렇게 테스트 했음결과
이렇게 첫 AWS 배포가 완료되었다.
처음에는 작은 Node.js 애플리케이션을 배포하는 것이 이렇게 복잡할 줄 몰랐다.
하지만 이 과정에서 EC2, Nginx, PM2, 리눅스 기본 명령어 등 정말 많은 것을 배웠다.
댓글
첫 번째 댓글을 남겨보세요.