[AWS] aws ec2로 배포해보기
AWS 아마존 웹 서비스는 전 세계적으로 가장 많이 쓰이는 클라우드 컴퓨팅을 제공해준다.
그 중 Amazon EC2로 나만의 작은 컴퓨터를 대여 받아서 사이트를 구동 시켜보자.
신규 가입을 하면 프리티어(Free tier)를 부여받고, 1년 간 aws 다양한 서비스를 무료로 이용 가능하다.
이 중에서 EC2를 이용한다.
인스턴스 생성
1) EC2 검색 후 클릭
2)
3) 이름 정하기
4) OS 를 선택 (프리 티어 가능으로 선택해야 무료 버전이다.)
(하지만, 램 1기가 성능의 안타까운 성능의 컴퓨터를 대여 받게된다..)
5) 해당 컴퓨터를 접속하려면 키 페어를 발급받고,
그 키를 통해 접속해야 한다.
(안전한 위치에 생성하고, 선택 해준다.)
6) http, https 포트 접속 허용을 미리 해줄 수 있다. (차후, 보안 그룹 설정에서도 더 세부적 설정 가능)
7) 나만의 인스턴스(가상 컴퓨터)가 생성된다.
가상 컴퓨터 접속하기
1) 인스턴스 시작 -> 연결 -> ssh 클라이언트로 가준다.
2) 키 읽기 권한 허용 해주기(윈도우) or (mac : chmod 400 "키 (pem)" )
- 윈도우에서는 chmod가 없기에 해당 명령어로 허용시켜준다.
icacls.exe [해당 키(pem)] /reset
icacls.exe [해당 키(pem)] /grant:r %username%:(R)
icacls.exe [해당 키(pem)] /inheritance:r
3) 권한 변경 후, cmd창에서
해당 키가 위치하는 경로로 가서 접속 명령어 입력
4) 접속 완료하면 ubuntu 로 변경된다.
(나머지, npm, node 설치, nginx설정, git clone 관련은
인터넷에 자료가 충분하기에 생략..)
ts 파일을 PM2 이용해 백그라운드 환경에서 실행 중 오류
PM2: 백그라운드 관리 툴 라이브러리
( 열어둔 서버를 우분투 접속을 끊으면 사이트 구동이 멈춰진다.
계속 실행하려면, pm2를 사용해야한다.)
문제점)
클론해서 받아온 내 ts형식 server파일을
pm2를 js 환경에서만 기본적으로 구동되기에,
.ts로 모두 만들어놔서 애를 먹었다.
해결)
찾아서 시도 해봐도 되질 않기에, 서버 파일들만 (ts-> js)로 다시 바꿔줬다.
도메인 설정 및 탄력적 IP 설정
우선 탄력적 IP 주소를 지정하는 이유는, 해당 인스턴스를 중지하면
연결할 주소가 바뀌기 때문에, 탄력적 IP 주소를 생성 후 적용시킨다.
이런식의 퍼블릭 IP 주소를 매번 치고 들어갈 순 없다.
사이트만의 특색있는 도메인이 필요하다.
AWS Route 53 호스팅 영역 생성 -> 해당
가비아로 도메인 구입 후 현 사이트의 라우팅 영역들을
가비아 사이트에서 도메인 구입 후 해당 도메인에 적용 시켜준다.
sudo로 슈퍼 관리자 권한 부여 후 명령어 실행
가끔 권한 설정 안하고 명령어를 치면 오류가 뜬다.
sudo를 붙이도록 하자.
낮은 성능의 인스턴스로 구동시 발생되는 문제
문제점)
성능 이슈로 npm build 빌드 과정에서 멈춤 오류가 떴다...
해결)
컴퓨터에서 build를 하고, build 폴더 포함 push하고
우분투 환경에서 git clone 또는 git pull 해줘서 해결해줬다.
nginx의 역할
nginx?
웹 서버 소프트웨어로, 가벼움과 높은 성능을 목표로 한다. 웹 서버, 리버스 프록시 및 메일 프록시 기능을 가진다.
경로) /etc/nginx/nginx.conf =>
server {
listen 80;
server_name lets-chat.store;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 연결을 위한 설정
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
- 80포트인 http로 해당 도메인을 접속하면 들어오는 모든 요청을 5000번 포트로 프록시 하는 설정이다.
- app.use~ : 인스턴스에서 server.js를 실행하면, Express 미들웨어를 사용하여 build폴더 안의 정적파일을 제공한다.
app.use(express.static(path.join(__dirname, "../client/build")));
app.get("*", (req, res) => {
res.sendFile(path.join(__dirname, "../client/build/index.html"));
});
- app.get~: 클라이언트에서 요청한 모든 경로에 대해 클라이언트의 HTML파일을 반환한다.
출처)