| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 일급 컬렉션
- java
- OAuth 2.0
- spring security
- Google OAuth
- Spring
- Dependency Injection
- factory
- lombok
- Volatile
- builder
- 일급 객체
- synchronized
- Today
- Total
HJW's IT Blog
조각집 프로젝트 - Node.js AWS 호스팅 (FEAT. EC2) 본문
프로젝트의 마무리로 이제 AWS 에 호스팅을 해야 한다.
AWS 에 대한 이해도를 올리고자 AWS 를 호스팅 서비스로 선택했다.
RDS 를 사용할까 고민했지만, 시간 여건상 촉박할 것 같아 ec2 인스턴스에 직접 mysql 서버도 같이 띄우기로 했다.
VPC 생성
회고 : VPC 란 >> Virtual Private Cloud 로, 가상 네트워크이다. 다른 사용자와 격리된 사용자 전용 가상 네트워크 환경을 제공하며, IP 주소 범위 , 서브넷, 라우팅 등을 사용자가 직접 구성할 수 있다.
VPC 생성 절차는 다음과 같다.
- 콘솔 접속 후 VPC 검색
- VPC 생성
- Name Tag 설정, IPv4 CIDR 블록 설정 (필자는 10.0.0.0/16) 사용
서브넷 생성
회고: 서브넷이란 >> 큰 네트워크를 작은 네트워크로 분할하는 것. IP 주소 범위로 정의되며, 서브넷 마스크를 사용하여 네트워크 부분, 호스트 부분을 구분한다. VPC 내에서 리소스를 논리적으로 그룹화 하며, 가용영역별로 서브넷을 생성하여 고가용성 구현에 사용된다.
Subnet 생성 절차는 다음과 같다
- 서브넷 섹션에서 서브넷 생성 클릭
- Name tag 설정, 이전에 만든 VPC 선택
- 가용 영역 선택 (ex. ap-northeast-2a)
- IPv4 CIDR 블록 설정 (10.0.3.0/24)
인터넷 게이트웨이 생성
회고: IG란 >> VPC 자체만으로는 외부와 통신이 불가능 하다. IG 를 사용하여, 통신을 가능하게 한다. VPC 의 라우팅 테이블에 연결되어 인터넷 바운드 트레픽을 처리한다.
IG 생성 절차
- IG 섹션에서 IG 생성 선택
- Name tag 설정, 생성
- 이전에 생성한 VPC와 해당 게이트웨이를 연결해야 한다
라우팅 테이블 설정
회고: 라우팅 테이블 >> 네트워크 트레픽을 어디로 전달할 지를 결정하는 규칙의 집합이다. 즉, 데이터 패킷의 경로를 결정하게 된다. Destination 과 Target 이 존재하는데, Destination 은 트래픽이 향하는 ip 주소 범위, target 은 트래픽을 전송할 게이트웨이, 네트워크 인터페이스를 뜻한다.
설정 절차
- 생성, Name tag 설정
- 이전에 생성한 VPC 선택후 생성
- 퍼블릭 라우팅 테이블에 Destination (0.0.0.0/0) 과 Target 에 이전에 생성한 IG를 선택한다
- 서브넷 연결 탭에서 이전에 생성한 서브넷과 연결해 준다
보안그룹 생성
회고 : 보안그룹 이란 >> 보안그룹은 추후 생성할 EC2 인스턴스에 대한 가상 방화벽 역할을 하는 보안 규칙의 집합이다. 인바운드 및 아웃바운드 트레픽을 제어하는데, 어떤 주소를 허용할지, 어떤 프로토콜을 허용할지, 포트 범위 등을 설정할 수 있다. 인바운드 규칙에는 EC2 인스턴스에 들어오는 트레픽을 제어하며, 아웃바운드는 EC2 인스턴스에서 나가는 트레픽을 제어한다.
생성 절차
- 보안그룹 색션에서 보안그룹 생성
- 어떤 프로토콜을 어떤 포트로 열지를 결정해야 한다.
- 주요 인바운드 규칙으로는 SSH (PORT 22) , HTTP (PORT 80), 만약 호스팅 하려는 서비스가 HTTPS 를 지원한다면 HTTPS (PORT 443) 등을 열면 된다.
- 아웃바운드 규칙은 기본적으로 모두 열어두었다. (0.0.0.0/0). 하지만 보안을 강화하기 위해 필요한 트래픽만 허용할 수도 있다. ex) RDS 가 있고, 해당 RDS 의 ip 주소 및 port 번호
EC2
회고: EC2 란 >> AWS 에서 제공하는 클라우드 컴퓨팅 서비스로, 사용자가 원하는 만큼의 가상 서버를 생성하고 사용할 수 있도록 하는 서비스 이다.
생성 절차
- Name tag 입력
- OS 이미지 선택 (필자는 Ubuntu 24.04LTS)
- 인스턴스 유형 선택 (t2.micro)
- SSH 연결에 사용할 키페어 선택 혹은 생성 (위치 잘 기억해 두기)
- 네트워크 설정 편집
- 이전에 생성한 VPC, subnet, public ip 자동 할당 활성화, 기존 보안그룹 선택
EC2 접속하기
이전에 우리는 SSH 22번 포트를 인바운드 규칙으로 설정해 두었다. VS Code 의 Remote - SSH extention 을 통해 접속이 가능하다!
F1 >> ssh file 입력시 Remote-SSh: Open SSH Configuration File 을 클릭 >> 이전에 생성한 키페어 위치 선택
Host codeit-zogakzip
HostName 15.165.136.170
User ubuntu
IdentityFile C:/Users/User/.ssh/zogakzip.pem
개인 설정에 맞게 config 파일을 생성하면된다.
이후, F1 >> Remote-SSH: Connect to Host 선택.
여기까지 잘 했으며, EC2 인스턴스가 실행중이라면 연결이 될 것이다.
EC2 기본 세팅 및 NGINX 설치
회고 : NGINX 는 웹 서버, 리버스 프록시서버, 로드 벨런서, HTTP 캐시 기능등을 제곻나는 오픈 소스 웹 서버 소프트웨어이다. 정적 콘텐츠를 매우 빠르게 서빙할 수 있다.
sudo apt update && sudo apt upgrade
sudo apt install -y nodejs
sudo apt install git -y
git clone https://github.com/your-repo.git
sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80 default_server
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain_or_IP;
location /api/ {
proxy_pass http://localhost:3000/; //node 서버가 싱행중인 포트
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;
}
location / {
root /path/to/your_project_directory/frontend/build;
try_files $uri /index.html;
}
}
MySQL
sudo apt install -y mysql-server
sudo mysql -u root -p
위 명령어로 mysql-server 를 설치하고 이제 유저 및 권한 설정을 해야 한다
CREATE DATABASE zogakzip;
CREATE USER 'admin'@'localhost' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON zogakzip.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
EXIT;
이후 필자는 prisma 를 사용했기 때문에 npx prisma generate 명령어로 DB를 생성한다.
추가로 node application 관리를 위해 pm2 를 설치하여 프로세스 및 로그를 볼 수 있게 설정하였다.
Troubleshooting
npm install 로 필요한 node module 을 설치하던 중 자꾸 ec2 인스턴스가 다운되는 상황이 발생하였다.
구글링 결과 t2.micro 인스턴스의 CPU 및 용량의 문제였다.
해결책
npm install 을 할때 dev dependency 를 모두 제외 npm install --omit=dev
npm install 시 --maxsocket 옵션으로 동시 작업 수를 제한
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
스왑 메모리를 설정해 메모리 부족문제를 완화
인스턴스 업그레이드
결국 인스턴스를 업그래이드 했다..