본문 바로가기
Project/MUNGCHI

#5 서버 백엔드 올리기 + AWS EC2, MongoDB, Redis

by developerBeluga 2023. 11. 25.
728x90
반응형

 

 

 

 

야 너두 서버 올릴 수 있어!

(반말 죄송)

 

지난 편에 클라우드 업체를 AWS로 선정했다.

그렇다면 AWS에 서버를 올려봐야 한다.

로컬에서 잘 돌아간다고 하더라도 클라우드에선 안되는 경우가 종종 있다.

그러니 꼭 미리 올려 테스트 해보자.

 

우선 개발자가 아니라도 서버를 올릴 수 있게 최대한 쉽게 작성해보려고 했다.

근데 클라우드는 개발자들도 어렵다고 생각하는 분야(따로 클라우드 개발자가 있을 정도)이기 때문에 어려워도 참고 하자.

 

 

 

 

0) 당연히 AWS 계정은 만들었겠죠?

 

없으면 AWS 계정을 만들도록 하자.

한국어로도 잘 되어져 있어 어려움은 없을거다.

 

 

 

 

1) EC2 생성

단일 서버로 갈 경우 EC2를 생성해주면 된다.

명칭만 EC2일 뿐 걍 하나의 서버라고 생각하면 된다.

 

검색창에 EC2를 치면 대시보드로 갈 수 있다.

근데 오른쪽 하단 리전이 유럽으로 되어져 있어서 오른쪽 상단에서 아시아 서울 리전으로 변경해줬다.

(리전 별로 인스턴스를 필터링하기 때문에 자신이 인스턴스를 만든 리전을 꼭 알고 있어야 한다)

 

유독 오렌지 색으로 눌러야 할 것 같은게 있다.

인스턴슨 시작을 눌러 EC2를 만들어주자.

 

 

막 뭐라뭐라 써져 있는걸로 겁 먹으면 안된다.

간단하게 너님 서버 사양 어떻게 해줄까를 물어보는거다.

 

예전엔 ubuntu로 했었는데 macOS를 처음봐서 애플 농장을 열심히 차리는 내 입장에선 너무나도 끌리는 선택지다.

근데 프리티어가 없다 ㅋ

결국 보통의 보통인 Amazon Linux를 선택했다.

 

고로 이쪽은 굳이 뭘 모르겠다 싶으면 기본 설정 그대로 가주면 된다.

 

조그만 내려주니 키 페어가 나왔다.

이건 해줘야 한다.

새 키 페어 생성을 누르자.

 

이름을 작성하고 기본 설정 그대로 생성을 해주면 파일이 생길 것이다. 

이걸 로컬에 들고 있어도 되는데 어떻게 될지 모르는게 사람 일이니 레포에 저장한 뒤 gitignore에 표시해주자.

gitignore에 표시해주지 않으면 깃허브에 올라가게 되고 그럴 경우 끔찍한 일이 생긴다^^

 

 

인제 네트워크 설정을 해주면 되는데 여기에서 맨 아래에

1. 인터넷에서 HTTPS 트래픽 허용

2. 인터넷에서 HTTP 트래픽 허용

이 두가지를 체크해줘야 한다.

 

여기까지 했다면 끝!

인스턴스 시작을 누르자.

 

인스턴스가 생성되었다.

인스턴스 상태를 보면 대기 중인데 조금만 지나도 바로 실행 중으로 바뀌니 걱정하지 말자.

 

 

 

 

2) 서버에 Git Clone

인제 우리는 EC2 꼴랑 하나 생성한 거지만 서버를 만든거다!

시작이 반이라고 했으니 어서 우리의 소중한 서비스를 서버에서 돌아가도록 해보자.

 

대시보드에서 오른쪽 상단을 보면 연결이 있다.

비활성화 되었다면 인스턴스를 누르면 된다.

 

SSH 클라이언트 탭에 들어가서 맨 하단에 있는 예를 복사해준다.

인제 인스턴스 생성시 만들어줬던 key 파일이 있는 곳에서 터미널을 켜준다.

나의 경우 vscode 레포에 넣어줬기 때문에 해당 레포의 터미널에 복사한 해당 글자를 넣어줬다.

 

근데 갑분 WARNING: UNPROTECTED PRIVATE KEY FILE!이라는 오류가 나왔다.

찾아보니 권한이 너무 오픈되어져 있어서 그렇다고 한다.

 

chmod 600 [파일 이름].pem

터미널에 위 명령어를 치면 된다.

다시 복사한 걸 넣어주면 짜란~

 

새 뭔데... 졸귀잖아?

 

현재 AWS 서버 내부 안에 들어온거다.

만들어놓은 코드를 불러오기 위해 Github 레포 Clone을 해주면 된다.

 

매우 클린한 상태이기 때문에 git도 없다.

// 설치 명령어
sudo yum install git

// 설치 확인
git --version

// git clone
git clone [레포 HTTPS 주소]

 

git 버전이 잘 나왔다면 인제 Clone이 가능하다.

근데 git clone을 할 경우 안 될 것이다.

(당당)

 

그 이유는 gitHub에서는 HTTPS으로 Clone을 할 경우 password가 gitHub 계정 비밀번호가 아니라 개인 엑세스 토큰을 사용해야 한다.

선택지는 두개다.

1. HTTPS 사용하기 위해 개인 엑세스 토큰 생성

2. SSH 키 생성 후 SSH로 Clone 하기

 

SSH가 보안적으로 좋으며 한 번 설정 해주면 그 다음부터 쉽기 때문에 좋다.

 

// .ssh 파일로 이동
cd ~/.ssh

// ssh 생성
// 계속 엔터 치기
ssh-keygen -t rsa -C [깃허브 계정 이메일]

// ssh 키 조회
cat id_rsa.pub

SSH 등록 방법은 빠르게 하고 가자.

순서대로 해서 ssh 키 조회가 되었다면 그걸 복사해서 gitHub에 가자.

 

Settings > SSH and GPG keys 클릭하면 New SSH key가 보일 것이다.

클릭 후 title은 아무거나 적어둔 뒤 key에 복사한 ssh를 넣어주면 된다.

 

 

SSH를 눌러서 클론 코드를 복사하자.

cd ..(폴더 위치를 바꿔줌) 해준 다음 git clone [복사한거] 해주면 된다.

 

잘 나왔다면 굳 👍

인제 레포에 가서 로컬에서처럼 npm start를 하면 어떻게 될까?

 

당연히 안된다.

그 이유는 처음 개발 했던 사람들이라면 알 것이다.

 

NodeJS 설치하세요~ 

MongoDB 설치하기, Redis 설치법 등

처음 개발할 때 로컬 컴퓨터에 명령어를 이용해서 깔았을 것이다.

 

맞다.

클라우드 서버에도 똑같은 짓을 해줘야 한다.

 

클라우드 서버는 우리의 로컬 컴퓨터 서버와는 좀 다르기 때문에 이 과정이 좀 빡치고 힘들 순 있지만...

안 하면 클라우드 서버를 못 돌리니 참고 해보자고.

 

 

 

 

 

3) 설치하기 - NodeJS

// node 설치 후 버전 확인
sudo yum install nodejs 
node -v

NodeJS는 기본 중의 기본이다.

다행히 이 아이는 딱 한 줄로 끝나서 좋았다.

 

 

 

 

 

3) 설치하기 - MongoDB

// mongodb 저장소 추가
sudo vi /etc/yum.repos.d/mongodb-org-7.0.repo

그 다음 mongodb 설치를 해준다.

미리 말하지만 DB쪽은 부가적으로 해줘야 하는게 있다.

그러니 잘 따라오길!

 

[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc

https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-red-hat/

 

Install MongoDB Community Edition on Red Hat or CentOS — MongoDB Manual

Docs Home → MongoDB Manual MongoDB AtlasMongoDB Atlas is a hosted MongoDB service option in the cloud which requires no installation overhead and offers a free tier to get started.Use this tutorial to install MongoDB 7.0 Community Edition on Red Hat Ente

www.mongodb.com

위 사이트로 가서 버전에 맞는 내용을 복사한 뒤 넣어준 뒤 ESC를 누른 뒤에 :wq를 해주면 나갈 수 있다.

(!!!미리 말하는데 이거 아니다!!!)

 

yum repolist

위 명령어를 이용해서 저장소가 잘 저장 되었는지 확인하면 된다.

 

굳 👍

 

sudo yum install -y mongodb-org

패키지를 설치 해주기 위해 위 명령어를 썼더니 Error: Unable to find a match: mongodb-org 라는 오류가 나왔다.

여러 일이 있었는데 결론부터 말하면 AWS 리눅스 환경이기 때문에 /etc/yum.repos.d/mongodb-org-7.0.repo 안에 넣어준 $releasever가 제대로 나오지 않았던 것이다.

그래서 직접 7을 넣었다. 

(sudo vi /etc/yum.repos.d/mongodb-org-7.0.repo로 파일 열어서 i를 눌러 수정 해준 다음 바꿨으면 ESC를 누른 다음 :wq를 눌러 닫혀준다.)

( sudo yum clean all을 해준 sudo yum makecache 까지 해주면 된다.)

 

다시 패키지 설치 명령어를 썼더니 Error: Problem: conflicting requests 라는 오류가 나왔다.

...

 

뭔가 잘못되었다는 걸 알게 된 나는 서둘러 좀 알아보다가 AWS 리눅스엔 다른 내용을 넣어야 한다는걸 알았다.

 

[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc

이걸 다시 파일 안에 넣으면 된다 😭😭😭

설치 명령어 다시 해주니 잘나온다 

 

https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-amazon/

 

Install MongoDB Community Edition on Amazon Linux — MongoDB Manual

Docs Home → MongoDB Manual MongoDB AtlasMongoDB Atlas is a hosted MongoDB service option in the cloud which requires no installation overhead and offers a free tier to get started.Use this tutorial to install MongoDB 7.0 Community Edition on Amazon Linux

www.mongodb.com

 

// mongodb etc 수정하기
sudo vi /etc/mongod.conf

mongodb가 통신하기 위해서는 bind를 고쳐줘야 한다.

 

net:
  port: 27017
  bindIp: 0.0.0.0

bindIp를 고쳐주자.

 

// 시작 명령어
sudo systemctl start mongod

// 상태 확인
// running으로 나오면 굳
sudo systemctl status mongod

 

마지막으로 mongodb 실행시켜 주면 된다.

굳 👍

 

 

 

 

3) 설치하기 - Redis

Redis 때문에 난리가 나서 인스턴스까지 난려본 사람으로써 최고의 방법을 알아냈다.

믿고 레츠고

 

// sudo yum search redis 한 결과 redis6가 나옴
// 설치해주기
sudo yum install redis6

// 시작
sudo systemctl start redis6

// 상태 조회
sudo systemctl status redis6

우선 AWS 리눅스 Redis 설치하면 이상한게 무수히 나오는데 다 치워라...

그거 따라했다가 내 하루라는 시간을 버렸다 🙃

 

AWS 리눅스에도 Redis를 지원해주는데 버전을 써놓는 바람에 인제 redis 뒤에 무조건 6을 붙인다.

잊지말자 66666

(뭐 안된다 하면 그건 redis 뒤에 6을 붙이지 않아서 그런 경우가 많음 ㅋ)

 

sudo vi /etc/redis6/redis6.conf

인제 env를 고쳐주도록 하자.

vi를 통해 문서를 아래와 같이 수정해주자.

1. bind 0.0.0.0

2. protected-mod no로 변경

3. requirepass [yourstrongpassword]

(비밀번호 설정할 경우)

 

sudo systemctl restart redis6

 

다시 시작 해주면 끝이다.

 

 

 

 

4) AWS EC2 보안그룹 추가하기

자 인제 마지막만 남았다.

(거짓말임)

이걸 해줘야지 DB들이랑 통신 가능하다.

 

AWS EC2 대시보드에 가서 잘 있는 인스턴스를 눌러보자.

그러면 하단에 세부 정보, 보안, 네트워킹 등 다양한 정보가 나온다.

 

거기에서 보안을 클릭하면 위와 같이 보안 그룹이 보일 것이다.

그 긴 아이디를 누르면 현재 내 인스턴스와 연결 되어져 있는 보안그룹으로 이동된다.

 

아마도 나와 여러분들의 인바운드 규칙의 갯수가 다를것이다.

생성할 때부터 HTTP, HTTPS를 생성해줬기 때문에 3개이면 정상이다.

(혹시 아니라면 다른 보안 그룹이 있는지 탭에 들어가서 확인해보기)

 

인제 여기에 DB들과 통신할 수 있게 인바운드 규칙 편집을 눌러줘야 한다.

 

 

왼쪽 하단에 있는 규칙 추가를 눌러 두 개를 생성 해준다.

그 다음 6379는 Redis, 27017는 MongoDB를 위해 뚫어준다.

다 되었으면 오른쪽 하단에 있는 규칙 저장을 누르면 끝났다.

 

 

 

 

5) app.ts에서 엔드포인트 바꿔주기

mongoose
  .connect('mongodb://localhost:27017/chi')
  .then(() => console.log('mongodb connect success'))
  .catch((err) => console.log(err));

로컬에서만 개발했기 때문에 DB 연결해주는 엔드포인트가 localhost 일것이다.

이렇게 하면 우리가 애써 보안그룹에 들어가서 뚫어져도 못 받아 먹는다...

 

그럼 해당 엔드포인트를 인스턴스이 퍼블릭 IPv4 주소로 해주면 되는걸까?

그래도 되는데 로컬에서 개발도 계속 해야하기 때문에 환경변수 사용하는걸 추천한다.

 

MONGO_URL = 'mongodb://localhost:27017/chi'
REDIS_URL = 'redis://localhost:6379'
PORT=3001

로컬 .env 파일에 이렇게 정의해준 다음

 

mongoose
  .connect(process.env.MONGO_URL)
  .then(() => console.log('mongodb connect success'))
  .catch((err) => console.log(err));

export const redisClient = createClient({
  url: process.env.REDIS_URL
})

app.listen(process.env.PORT, () => {
  console.log('server 연결 완료 🎱');
});

MongoDB, Redis, server port를 변경해준다.

이 내용을 git에 올리고 AWS 리 눅스에서 

 

인제 AWS EC2에 환경변수를 먹어줘야 한다.

기본적으로 직접 vi을 이용해서 환경변수를 주기도 하지만 env가 많으면 참 귀찬은 짓이다.

(부팅하면 다시 반복해야함...)

 

알아본 결과 2가지 방법이 있었다.

1. User Data 스크립트 사용하기

2. AWS Systems Manager Parameter Store 사용하기

 

둘의 차이는 인스턴스 중지 하냐 안하냐의 차이다.

무중단 배포일 경우 후자가 낫지만 우리의 경우 초기 단계이기 때문에 인스턴스 중지한 후 User Data 스크립트를 사용하자.

 

우선 말하지만 둘 다 추가 비용이 나올 수 있다.

User Data 스크립트를 사용할 경우 탄력적 IP(=인스턴스 재시작해도 안바뀌는 IP)를 사용해야 하고 AWS Systems Manager Parameter Store는 API 요청 수에 의해 비용이 나온다.

 

...

귀찮아도 vi을 이용해서 env 파일 설정을 해주도록 하자.

 

sudo vi /etc/environment

를 해준 다음 그 안에 env를 수정해서 올리면 된다.

 

REDIS_URL = 'redis://[인스턴스 퍼블릭 IP]:6379'
PORT=80

예를들어 위와 같이 해주면된다.

인스턴스 퍼블릭 IP는 AWS EC2 인스턴스를 클릭하면 볼 수 있다.

 

 

 

드디어 확인

sudo npm start

인제 잘 되는지 확인해보자

 

잘 연결됐다.

(가운데 redis error는 타임아웃을 빡빡하게 잡아서 그런거)

 

 

포스트맨으로 통신을 해보니 잘 나온다 👍

 

sudo npm install pm2 -g
sudo pm2 start npm -- start

번외로 이렇게 해줘야지 터미널을 꺼도 계속해서 서비스가 돌아갈 수 있당

 

 

 

 

 

 

 

 

 

fin.

 

 

 

728x90
반응형

댓글