TIL

23/11/02 TIL __ AWS 배포하기 총정리

GABOJOK 2023. 11. 2. 12:24

 

 

 

 

강의에서 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/

 

PM2 - Process Management

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

https://angehende-ingenieur.tistory.com/211

 

golang .env 파일 환경변수 셋팅

.env 파일로 환경변수를 지정해주는 방법 일단 main이 있는 package에 직접 .env 파일을 만들어준다. 나의 경우에는 terminal에서 만들어줬다. touch .env vi .env touch로 .env 파일을 생성하고 vi로 편집해서 환

angehende-ingenieur.tistory.com

https://seongbindb.tistory.com/128

 

[Web] 포트포워딩 적용이 안될 때 (80 -> 8080)

포트포워딩 관련 명령어 sudo iptables -t nat -L (현재 포워딩한 포트를 확인한다) sudo iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000 80포트에서 5000으로 리다이렉트 것을 제거하는 명

seongbindb.tistory.com