강의에서 aws를 이용해서 배포하는 과정을 배워서 잊어버리지 않도록 기록으로 남겨둔다.
🚗 AWS 에서 EC2 Instance 생성하기
여기서 Instance 란 서버 컴퓨터 하나의 단위를 의미한다.
AWS 홈페이지로 가서 로그인 후, EC2 탭을 클릭한 다음
새로운 인스턴스를 생성한다.
새로운 키페어 까지 생성하고 만든 키페어는 잘 보관해 둔다.
이번에는 방금 만든 EC2 Instance에 접속해서 뭔가를 해보자.
일단 그 전에 알아야 할 개념이 SSH 라는 개념이다.
SSH
Secure Shell. 다른 컴퓨터에 연결할 때에 사용되는 프로그램이다.
다른 접속 방법보다 보안이 좋아서 서버 연결시 많이 사용한다.
만든 인스턴스의 보안 탭에서 포트가 22번이 열려 있는지(기본으로 열려있도록 되어있다) 한번 더 확인 후 진행한다.
그럼 이제 터미널에서 실행해보자.
나는 Mac 환경이라서 그 기준으로 정리를 한다.
🚗 터미널에 인스턴스 가져오기
✅ 1. 일단 터미널을 열고,
✅ 2. 방금 받은 키페어를 보관하고 있는 폴더로 이동한다. (cd 명령어 이용한다)
✅ 3. 다음 ls-la를 이용해서 접근 권한이 어떻게 설정되어 있는지 확인후, 허용된 애들만 읽을 수 있도록 권한을 바꿔준다.
sudo chmod 400 키페어이름
예를 들면 sudo chmod 400 oha_123.pem
✅ 4. 이후 다시 ls-la를 이용해 접근권한에 대한 정보를 확인해 보면 올바르게 변경된 것을 확인할 수 있다.
✅ 5. 이번에는 SSH로 접속을 해보자.
ssh -i 키페어이름 ubuntu@aws에적힌공용아이피
❗️ 여기서 주의할 점은 엔터로 안된다면, yes를 입력해 보자...!!!!!! 바로 된다...
❗️ 그리고 만약 키페어이름을 넣었는데 진행이 안된다면, 파일을 끌어다놓는 방법으로도 해보길 권장한다.
그럼 아래 사진과 같이 ubuntu 글자가 앞에 와있을 것이다.
🚗 터미널에 Node.js 설치하기
✅ 6. 다음은 터미널에서 Node.js 파일을 설치해보자.
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
설치가 잘 되었는지 확인하고 싶다면, 아래 두가지 명령어중 하나로 확인이 가능하다.
node -v
npm -v
🚗 터미널에 MongoDB 설치하기
✅ 7. 이제 아래 명령어를 하나씩 입력하면서 EC2 Instance 에 MongoDB도 설치 해보자.
curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo mkdir -p /data/db
sudo chown -R 'ubuntu' /data/db
sudo apt-get update
sudo apt-get install -y mongodb-org
✅ 8. MongoDB를 실행해 보자.
sudo service mongod start
sudo service mongod status
아래와 같은 화면이 나오면, 정상 실행 된 것이다.
🚗 터미널에 깃에 올린 파일 가져오기
✅ 9. EC2 Instance 에 깃에 올려둔 코드를 가져온다.
git clone 클론할주소
✅ 10. ls -la 로 가져온 폴더가 어디에 있는지 파악후 이동한 다음 가져온 프로젝트를 실행해 준다.
//package.json 파일에 있던 내용들이 설치됩니다.
npm install
//실행하려고 하는 메인js 파일을 입력합니다. ex)node app.js
node 메인js파일입력
//메인.js 파일을 실행할 때에 아래와 같은 방식으로도 실행이 가능합니다.(노드몬 설치를 npm i nodemon -D 로 설치한 경우.)
npm run dev
nodemon app.js
🐣🧐❗️ 잠깐❗️🧐🐣
env 파일을 이용해 환경변수를 관리했다면, 우분투 환경에서 클론받을 때 환경변수가 받아지지 않는다.
따라서 새로 생성해 줘야 한다.
touch .env //.env 파일 생성
vi .env // 환경변수 설정
cat .env // 환경변수 설정 확인하기
이후 설정했던 환경변수들을 작성후 :wq 를 이용해 저장해준다.
🚗 aws 인스턴스 쪽에서 포트 열어주기
✅ 11. 코드에 적은 포트 번호를 AWS EC2 Instance 쪽에도 적는다.
이렇게 하지 않는다면, 현재 사용하고 있는 EC2 Instance 가 가지고 있는 방화벽이 자체적으로 허용되지 않은 포트들의 접근을 막기 때문에, 접속이 불가하다.
인스턴스에 접근해서 보안 탭에 보면, 보안그룹이 있는데 클릭한다.
이후 사용자 규칙 편집을 눌러서 입력하면 되는데,
👉 코드에 적은 허용할 포트 번호를 입력해 준다. (유형은 "사용자 지정 TCP" 로 하면 된다.)
👉 http 에서 잘 들어올 수 있도록 80번도 허용해 준다.
추가로 https는 443의 포트번호를 가지고 있다.
🚗 포트번호 적지 않아도 자동 이동 설정 해주기.
✅ 12. iptables를 설정해서 포트번호를 하나하나 입력하지 않아도 자동으로 이동할 수 있도록 해준다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 설정한포트번호
이렇게 하면,
http://퍼블릭IPv4주소:3000/api/carts
http://퍼블릭IPv4주소:80/api/carts
http://퍼블릭IPv4주소/api/carts
의 결과물이 같다.
🧐❗️🧐❗️ 혹시 iptables 설정에서 값을 잘못 입력한 경우 🧐❗️🧐❗️
아래의 명령어를 통해 현재 포워딩 한 포트를 확인할 수 있다.
sudo iptables -t nat -L
그리고 필요 없는 포워딩은 아래 명령어로 삭제하면 된다.
sudo iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 연결하려 하는 포트번호
출처: https://seongbindb.tistory.com/128 [SeongbinDB:티스토리]
🚗 서버 계속 가동하도록 PM2 이용하기
✅ 13. 그러나 서버를 종료하면 그 순간부터 페이지를 사용할 수 없다. PM2를 이용해 서버를 계속 가동해보자.
😲 PM2
👉 터미널을 종료해도 웹서버가 실행되도록 하고,
👉 Log 정보들을 실시간으로 확인해 현재 서버의 상황을 관리할 수 있는 라이브러리.
👉 프로세스 매니징 도구
sudo -s
npm install -g pm2
이런식으로 설치가 되면, 실행을 하면 끝!!
pm2 start 메인js파일이름
혹은
sudo pm2 start 메인js파일이름
이외 pm2에 대한 명령어는 이런게 있다. 참고하면 좋을 것 같다.
//현재 실행중인 pm2 서비스를 재시작 한다.
pm2 restart [idNumber]
//관리중인 서비스의 목록을 출력한다.
pm2 list
//현재 실행중인 pm2 서비스를 종료한다. (표에 id탭의 숫자 입력)
pm2 delete [pid number]
//실행한 서비스들의 로그 출력__ 에러메세지나 디버깅 시 유용하다.
pm2 log
좀더 자세한 내용은 아래를 참고하면 좋을 것 같다
참고한 사이트
https://pm2.keymetrics.io/docs/usage/process-management/
https://angehende-ingenieur.tistory.com/211
https://seongbindb.tistory.com/128
'TIL' 카테고리의 다른 글
23/11/04 TIL __ AWS 배포하기 총정리2 (0) | 2023.11.04 |
---|---|
23/11/03 TIL __ mongodb 아틀라스 db.collection 안되는 이유 ... (1) | 2023.11.03 |
23/11/01 TIL __ Thunder Client 무한로딩 현상 (1) | 2023.11.01 |
23/10/31 TIL __ 모듈 타입에서 변수의 특징 (0) | 2023.10.31 |
23/10/30 TIL _ 스코프 체이닝과 클로저 그리고 이벤트 루프 (1) | 2023.10.30 |