WEB/Backend

AWS EC2 서버 세팅 및 배포 / 몽고DB 도메인 연결하기 (A~Z까지) feat. Flask서버, Filezilla,Studio 3T,Gabia

Jerry_K 2024. 7. 27. 20:49

이번 포스팅에서 AWS 인스턴스를 만들고, Flask 서버 배포

그리고 도메인을 사용한 배포 까지 정리 해볼 예정이다. 

 

📌몽고 DB와 Studio 3T가 설치 되어 있다는 전제로 포스팅

 

AWS를 처음 사용하면 1년동안 프리티어를 무료 사용 가능하다.

 

내용이 엄청 기니까 ....잘 봐보자 

 

📚 목차

1. 인스턴스 만들기
2. EC2 포트 열기
3. git bash 설치
4. 로컬 환경에서 AWS EC2 연결
5. Filzilla로 AWS 관리하기
6. 서버에 DB 세팅
7. 서버 도메인에 연결하기 

 


📘인스턴스 만들기

 

AWS에 회원가입을 했으면, EC2에 들어간다

(EC2는 자주 쓰이니까 즐겨찾기하면 편하다.)

 

 

 

일단 먼저 국가를 서울로 바꾸고 ,

아래 인스턴스 시작을 누르면 된다.

 

 

 

인스턴스의 이름을 입력해준다.

 

 

 

Ubuntu에서 Ubuntu Server 22.04 LTS를 선택한다.

24버전을 사용해도 되는데, 이따 몽고 DB 연결할 때 24버전에 맞는 코드를 찾아야함

 

 

 

인스턴스 유형은 t2.micro 쓰면 된다.

 

첫 해에는 월별 프리 티어 AMI에 대한 t2.micro인스턴스 사용량 750시간, 월별 퍼블릭 IPv4 주소 사용량 750시간, EBS 스토리지 30GiB, IO 2백만 개, 스냅샷 1GB, 인터넷 대역폭 100GB가 포함된다고 한다.

 

 

 

키 페어 파일 이름을 정해주고,

RSA 형태.pem 확장자 형식으로 키페어를 생성한다.

 

키페어는 꼭 필요하니까 따로 저장해두자  )

 

 

 

인터넷에서 HTTPS 트래픽 허용 / HTTP 트래픽 허용을 해준다

 

https 는 http에 secure 더한 것으로 http 보다 더 안전하다.  

보통 카메라 권한 같은것을 유저에게 받아야하는데,

이런 상황에서  왠만한 브라우저에서는  https로 요청해야만 한다.

 

 

이러고 인스턴스를 시작하면 된다.

 

 

참고로 해당 인스턴스는 삭제 됨

 

13.124.172.57의 퍼블릭 IPv4 주소를 할당 받은 인스턴스가 만들어졌다.

한 두번 정도만 해보면 인스턴스 만드는 것은 정말 간단하다.

( 13.124.172.57 의 퍼블릭 주소는 삭제 됨)

 

하지만 인스턴스를 만들었다고 끝난게 아니다. 

로컬 컴퓨터와 연결해주기 위해  EC2에서 특정 포트들을 열어줘야 한다.

 


📘EC2 포트 열기

 

 

 

 

보안 > 보안 그룹을 눌러 들어간다.

 

 

그리고 인바운드 규칙 편집에 들어간다. 

 

 

 

그리고 위와 같이 인바운드 규칙을 추가해준다.

내가 추가 한 것은 5000 / 27017 포트이다. 

5000 포트는 Flask 서버 연결, 27017 포트는 몽고 DB를 연결해주기 위함이다.

 

SSH는 다른 컴퓨터에 접속할 때 쓰는 프로그램으로, 서로 22번 포트가 열려야 접속 가능하다.

HTTP의 80번 포트도 추후에 쓰일 예정이다. 

 

이렇게 하면 내 로컬 컴퓨터와 연결하기 위한 사전 작업은 완료된 것이다.


📘Git bash 설치

대부분  git hub를 사용하기 때문에 git bash도 설치 되어있을거라 생각한다. 

 

 

Git

 

git-scm.com

 

 

[Git] Git Bash 2.19 설치하기

이번 포스팅은 Windows에서 Git을 사용하기 위한 Git Bash 2.19 버전을 설치해보겠습니다. 우선 Git Bash 설치파일을 받기 위해 공식 홈페이지인 https://git-scm.com/ 으로 이동해주세요. 우측 하단의 Download 2.

gabii.tistory.com

 

해당 사이트에서 버전을 본인 OS에 맞게 잘 설치하면 된다..

위의 블로그 설치 방법을 그대로 따라하면 금방 설치 할 수 있다.

 

 

🔎 윈도우 터미널을 놔두고 Git bash를 쓰는 이유가 뭘까 ? 

Window 환경에서  git bash로 Unix 명령어를 사용 할 수 있기 때문이다. 
(일반적으로 윈도우의 CMD / PowerShellUnix/Linus 명령어를 지원안한다.)

그리고 일반적으로 Git bash가 윈도우 기본 터미널보다 더 많은 기능을 제공한다. 
결론적으로 git bash는 크로스 플랫폼 개발자들에게 유용한 도구이다. 

 

근데 git bash 사용안하고,

aws에서 바로 인스턴스 연결만 해도 되긴한다.

 


📘로컬 환경에서 AWS EC2 연결

해당 IP는 예시입니다.

ssh -i "받은키페어를끌어다놓기" ubuntu@AWS에적힌내아이피

 

위에서 .pem  키페어를 다운받고,  퍼블릭 IP를 할당 받았다.

 

해당 명령어를 통해서 AWS 서버와 로컬 컴퓨터와의 연결시켜준다.

(Tip. 키페어 파일을 bash에 끌어다 놓으면 알아서 위치 적어줌)

 

 

 

이렇게 뜨면 서버가 잘 연결 된 것이다.

 

 

EC2 ubuntu에는 기본적으로 파이썬 3.10 버전이 설치 되어 있으니, 

버전에 문제가 없다면 그대로 써도 된다.

 

python --version

 

그리고 파이썬 버전을 확인해주면 잘 설치 되어있는 것을 알 수 있다.

(참고로 파이썬 설치 명령어 python3 10에서 10은 파이썬 버전이 아니라 파이썬의 우선 순위라고 보면 된다.)

 

sudo apt install python3.12-venv
python -m venv myenv
source 가상환경 경로/bin/activate

 

간단하게 가상 환경 패키지를 설치하고 실행 하면된다.

(Tip. Bash에서 복사한 것을 붙여 넣는 키는 shift + INS)

 

 

pip3 install 패키지 이름

 

그리고 필요한 라이브러리들을 설치해주면 된다.

 

 

여기까지 했으면, 이제 Filzilla로 해당 서버를 관리해보자 !


📘Filzilla로 AWS 관리하기

🔗 다운로드 링크

https://filezilla-project.org/download.php

 

해당 링크로 들어가서 기존 무료 버전을 다운로드 한다.

 

 

 

설치가 되면 이런식으로 파일이 실행된다.

 

 

 

파일  → 사이트 관리자 에 들어가서 형관펜 친 input 박스들을 채워주면 된다.

 

키 파일을 찾을때 다운 받은 .pem 을 업로드 해야하는데,

찾아보기에 바로 안나오는 경우가 있다.  이때 확장자가 "PEM 파일"인지 확인하자.

 

 

이렇게 되면 연결이 잘 된 것이다. 

 

리모트 사이트가 우리가 만든 서버이고,

FileZilla를 통해 쉽게 시각적으로 파일을 관리 할 수 있다.

 

이제 여기에  만든 파일들을 업로드하고 실행하면 된다 ! 

(이 포스터에서는 미리 만들어둔 flask 폴더를 업로드 하였다 )

 

 

dir
cd 이동하려는 파일경로

 

우선 가상환경을 실행 해둔 상태에서

명령어 dir로 현재 위치를 확인하고,

명령어 cd로 좀 전에 업로드한 파일 경로로 들어간다.

 

 

 python app.py

 

그리고 해당 파이썬 파일 실행 명령어를 입력해보니

잘 연결되어 있음을 확인 할 수 있다.

 

 

http://퍼블릭주소:5000

 

해당 웹사이트에 들어가려면, 위의 주소대로 해야한다.

 

만일 해당 주소로 잘 접속이 안된다면,

보안에서 인바운드 규칙 5000번 포트가 잘 열렸나 확인해보자.

 

 

이렇게 AWS로 부터 할당 받은 퍼블릭 IP 주소로 웹 서버를 열었다.

 

이제 절반정도 왔다 ... 

 

 


📘 서버에 DB 세팅

이제는 서버와 DB를 연결하는 작업을 해보자 

# UTC to KST
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# python3 -> python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

# pip3 -> pip
sudo apt-get update
sudo apt-get install -y python3-pip
pip3 --version
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1

# port forwarding
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000

 

해당 명령어들을 git bash에 그대로 써준다. 

 

 port forwarding 부분은 80번 포트 접속을 5000번 포트로 리다이렉트 해주는데,

추후 DNS 받을 때 사용된다.

 

 

sudo apt-get install gnupg
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

 

해당 명령어도 복붙해서 넣는다. 

만일 ubuntu 22 버전이 아닌 경우, 저 코드를 수정해야한다.

 

 

sudo apt-get update
sudo apt-get install -y mongodb-org

 

업데이트를 진행하고, Mongo DB 패키지를 설치한다.

 

 

sudo service mongod start
sudo service mongod status

 

"sudo service mongod start"  부분에서는 아무런 반응이 없다.

"sudo service mongod status" 부분에서 위와 같은 상태가 되어야 한다.

(Active : active (running) 초록색이 되어야 함)

 

 

 

이제 MongoDB에 접속하고 유저를 생성한다.

mongosh

 

이런 화면이 떠야한다. 

 

 

# 어드민 계정 접속
use admin
# 외부 접속용 계정 생성
db.createUser({user: "test", pwd: "test", roles:["root"]});

 

해당 계정 ID/PW는 본인 마음대로 바꿀 수 있다. 

 

위에 캡쳐한 것 처럼 화면이 뜨면 권한이 잘 부여 된 것이다.

 

#mongoDB 나오기
exit

#mongoDB 재시작
service mongod restart

 

해당 명령어를 순차적으로 입력하자. 

 

 

 

Mongo DB같은 경우 기본적으로 같은 IP 안에서만 접속을 허용한다.

따라서 외부에 접근이 가능하도록 제한을 풀어줘야 한다.

sudo vi /etc/mongod.conf

 

관리자 권한으로 mongod.conf 파일을 Vim 에디터로 실행했다. 

i 를 누르면 입력 모드로 전환된다.

 

 

 

 

bindIp가 127.0.0.1 를 0.0.0.0으로 변경 시켜주고,

security를 위와 같이 변경시켜준다.

 

 

:wq

 

에디터 종료는 esc 누르고 :wq 를 누르면 된다.

 

 

sudo service mongod restart

 

그리고 몽고 db를 재시작 해준다.

 

 

이제 Studio 3T에 들어가서 설정을 해준다.

(설치 되어있다는 전제로 포스팅)

Connect →  New connection에 들어가면 위와 같은 화면이 뜬다.
그리고 "Manually configure my connection settings" 를 눌러준다.

 

 

Connection name : "원하는 이름"
Connection Type :  Standalone 
Server : AWS 퍼블릭 IP

 

 

Autentication 설정
Autentication Mode : Legacy (SCRAM-SHA-1) 
User name : test
Password : test 
Authentication DB : admin 

🚨 User name / Password /Authentication DB 같은 경우 위에서 설정한 대로 쓰면 된다.

 

 

 

Connection에 보면 잘 연결 된것을 확인 할 수 있다 .

 

 

client = MongoClient('mongodb://설정한아이디:비밀번호@내AWS아이피',27017)

 

이후 업로드한 flask 파일에서 MongoClient 부분을 수정 해주어야 한다.

일반적으로 위와 같이 수정하면 된다. 

 

 

 

이후 Flask를 실행한 후, DB에 저장 기능을 수행하면 

잘 저장 되는 것을 확인 할 수 있다 .

 

nohup python app.py &

 

해당 명령어는 AWS 서버에 원격 접속을 종료하더라고, 서버가 돌아가게 해준다.

(내 컴퓨터가 꺼져도 서버는 계속 작동해야되기 때문이다 ) 

 


📘 서버 도메인에 연결

"sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000"

앞서 이 명령어로 5000 포트로 오는 요청을 80포트로 자동으로 연결된다.
80번 포트를 했을 경우 매번 뒤에 :5000 이런식으로 포트 쓰는 것을 없앨 수 있다.
이런식으로 변경을 해줘야 DNS에 바로 연결 가능하다.

 

 

 

웹을 넘어 클라우드로. 가비아

그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브

www.gabia.com

 

서버 도메인을 연결하려면 도메인을 구매해야 한다.

도메인 구매는 gabia에서 할 예정이다. (위의 가비아 링크 참고)

 

연결의 목적에 있으니, 아무도 안쓸거 같은 도메인을 찾는다.

(500원 짜리 추천 !!)

 

 

도메인을 구매 후 마이페이지에 들어가면 위와 같은 화면이 뜬다. 

 

 

 

그리고 DNS 정보에서 도메인 연결 "설정" →  "DNS 설정" 에 들어간다.

 

 

타입 : A 
호스트 : @
값/위치 : AWS 퍼블릭 IP 

 

이렇게 세팅을 해준다. 

 

 

 

그리고 약 1시간 정도의 시간이 지나면 위와 같이 해당 도메인으로 접속이 가능한다.

(AWS 퍼블릭 IP 주소로도 접속 가능)

 


🌟마지막 comment

다소 복잡해 보이는 과정들이다.

그렇다고 어려운 것들은 없고, 버전만 잘 맞춰주면 된다.

 

모든 내용들을 담을 수 없어서 생략된 부분도 많으니, 

그 부분은 따로 구글링해보면 금방 찾을 수 있을 것이다. 

 

이걸로  이제 기본적인 서비스 배포는 할 수 있게 되었다 !!