[AWS] EC2에 flask 서버 배포하기 : FileZilla, mongoDB, Port Forwarding, nohub, Gabia Domain

이주희·2023년 1월 23일
1

Deployment

목록 보기
10/10
post-thumbnail

0. 배포를 위한 기초 지식

1) 클라우드 서비스

  • 웹 서비스를 런칭하기 위해서는 클라이언트의 요청에 항상 응답해줄 수 있는 서버에 프로젝트를 실행시켜야 한다.

  • AWS 클라우드 서비스에서 항상 켜놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용할 수 있다.

클라우드 환경을 사용하는 이유

  • 컴퓨터가 항상 켜져있고 프로그램이 실행되어 있어야 한다.

  • 모두가 접근할 수 있는 공개 주소인 공개 IP 주소 (Public IP Adress)로 내 프로젝트에 접근할 수 있어야 한다.


2) IP 주소와 포트

IP 주소

  • 접속하는 컴퓨터는 숫자로 되어있는 IP 주소가 붙어있다.

  • 인터넷 위에서 컴퓨터가 통신할 수 있도록 컴퓨터마다 가지는 고유한 주소로, 각 서버는 하나의 주소를 가지고 있다.

  • 접속을 용이하게 하기 위해 IP 주소를 읽기 편한 도메인으로 매칭할 수 있다.

포트

  • 하나의 IP에는 여러 포트가 있다.

  • 한 포트에 하나의 프로그램을 실행시킬 수 있다.


1. EC2 서버 구매하기

1. AWS 접속

2. 인스턴스 생성

  • 인스턴스 이름 입력

  • 키 페어 생성 클릭

  • 키페어 생성을 완료하면 자동으로 키페어 파일이 다운로드 된다.

  • 👇🏻 인스턴스 생성 완!


2. EC2 접속하기

1) EC2 접속 - Keypair의 접근 권한 변경

  • 터미널에서 진행한다.

  • 2에서 받은 내 Keypair의 접근 권한을 바꿔준다.

sudo chmod 400 키페어

2에서 다운로드된 파일을 터미널창에 끌어다 놓으면 자동으로 키페어 경로가 입력된다.

2) EC2 접속 - SSH로 접속

ssh -i 키페어 ubuntu@내아이피
  • 인스턴스 목록에서 IPv4 주소를 확인할 수 있다..

  • Key fingerprint 관련 메시지가 나오면 yes를 입력한다.

  • EC2 원격 접속 성공!


3. 서버 설정하기

1) FileZilla 다운로드

[FileZilla] 👈🏻 접속

가장 왼쪽에 있는 에디션 다운로드!

2) 파일질라 설정

  • Site Manager 클릭

  • New site > 내용 입력 > Connect > OK

  • 업로드할 파일을 드래그로 이동시킨다.
    왼쪽이 내 컴퓨터, 오른쪽이 원격 접속한 EC2 인스턴스이다.

3) 업로드한 파일 실행

  • python이라는 명령어로 3 버전 이상을 실행한다.
sudo apt install python-is-python3

  • home 디렉토리로 이동해서 업로드한 파일을 실행하면 해당 파일의 코드가 실행되는 것을 콘솔창에서 확인할 수 있다.
cd ~
python hello.py


4. 서버 실행하기

1) pip를 설치한다.

# pip3 설치
sudo apt update
sudo apt install -y python3-pip

# 버전 확인
pip --version

2) flask를 설치한다.

pip install flask

3) flask 실행 파일을 생성한다.

app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
   return 'This is Home!'

if __name__ == '__main__':  
   app.run('0.0.0.0', port=5000, debug=True)

4) 3의 파일을 파일질라에서 EC2로 업로드한다.

5) 3의 파일을 실행한다.

app.py를 실행시키면 flask가 실행된다.

python app.py


5. 포트 열어주기

  • 서버가 실행되었지만, AWS에서 포트 번호를 막고 있기 때문에 아직 해당 IP로 접속해도 오류가 발생한다.
  • EC2에서 5000 포트로 들어오는 요청을 받을 수 있게 설정해야 한다.
  • AWS EC2 Security Group에서 요청 포트를 열어준다.

1) 보안 그룹으로 접속한다.

  • EC2 상세 > 보안 탭 > > 보안그룹(Security Group) 클릭

  • 인바운드 규칙 편집

  • 포트를 추가한다.
    5000 포트: flask 기본 포트
    80 포트: HTTP 접속을 위한 기본 포트
    27017 포트: 외부에서 mongoDB에 접속하기 위한 포트

ip 주소로 접속 성공..!


6. DB 설정하기

1) mongoDB를 설치한다.

  • EC2 터미널에서 아래 명령어를 차례대로 입력한다.
    위치는 상관 없음!
curl -sS https://pgp.mongodb.com/server-6.0.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-6.0.gpg

echo "deb [ arch=amd64,arm64 ] 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 apt update

sudo apt install -y mongodb-org

2) mongoDB를 실행한다.

  • 아래 명령어를 입력했을 때 아무 반응이 없으면 잘 실행된 것이다.
    (리눅스는 보통 잘 실행이 되면 응답이 없다.)
sudo service mongod start

3) mongoDB 접속 계정 생성하기

  • 아이디/비밀번호를 설정하지 않으면 누구나 DB의 정보를 볼 수 있게 된다.
    접속에 필요한 아이디와 비밀번호를 생성한다.

  • mongoDB 쉘에 들어간다.

mongosh
  • admin으로 계정을 변경한다.
use admin;
  • 계정을 생성한다.
db.createUser({user: "test", pwd: "test", roles:["root"]});

  • mongoDB 쉘에서 나오고 mongoDB를 재시작한다.
exit
sudo service mongod restart

  • pymongo에서 DB에 접근할 때에도 계정 정보를 추가해야 한다.

app.py

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

4) mongoDB 외부에 열어주기

  • mongoDB는 기본적으로 같은 IP 안에서만 접속을 허용하고 있어, 외부에서 접근이 가능하도록 잠금을 풀어줘야 한다.

  • 리눅스 자체 에디터인 vim을 이용한다.

sudo vi /etc/mongod.conf

# vi: 리눅스에서 VS Code 대신 사용하는 텍스트에디터인 Vim을 실행
# => "관리자 권한으로 /etc 폴더 아래 mongod.conf 파일을 Vim으로 켜줘!"라는 뜻입니다

  • 입력 모드로 전환하고, bindIp와 security를 수정한다.
# 입력 모드 전환
i

  • 에디터를 종료하고 mongoDB를 재시작한다.
# 내용 저장 및 에디터 종료. esc를 누르고 입력한다.
:wq

# 재시작
sudo service mongod restart

5) Studio 3T로 내 컴퓨터에서 EC2 서버에 있는 mongoDB에 원격으로 접속하기

  • Studio 3T 접속 > Connection > New Connection > Next

  • Server에 ec2 ip주소 입력

  • Authentication 탭에서 생성한 계정 정보 입력

  • 연결 완!


7. 패키지 설치 및 실행

  • 파일질라에서 프로젝트의 app.py. templates 폴더, static 폴더를 모두 EC2에 업로드한다.

  • 사용하는 패키지를 설치한다.

pip install requests beautifulsoup4 pymongo
  • 실행한다.
python app.py
  • 접속이 잘 되는지 확인 ㄱㄱ
http://ip주소:5000/

8. 포트 포워딩

  • http에서는 80번 포트가 기본이기 때문에 :80을 붙이지 않아도 된다.

  • 포트 번호를 입력하지 않고 접속할 수 있도록 80 포트로 오는 요청을 5000 포트로 전달시켜야 한다.

  • 리눅스에서 기본으로 제공해주는 포트포워딩을 사용한다.

  • 포트포워딩 룰을 입력한다.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
  • 프로젝트를 다시 실행하고 :5000을 뺀 주소 http://IP주소 로 접속해본다.
python app.py

9. nohub 설정

1) nohub 설정하기

  • 지금은 SSH 접속을 끊으면(터미널을 종료하면) 프로세스가 종료되면서 서버도 끊긴다.

  • 원격 접속을 종료해도 서버가 계속 돌아가게 설정한다.

nohup python app.py &

2) 서버 종료시키는 방법

  • 서버를 강제로 종료하려면 pid로 프로세스를 죽여야 한다.

  • pid(프로세스 번호) 확인

ps -ef | grep 'app.py'

  • 프로세스 강제 종료
kill -9 [pid값]

10. 도메인 연결

1) 도메인 구매

  • [가비아]에서 원하는 도메인을 구매한다.

2) 도메인 연결

  • [My가비아] 👈🏻 접속해서 이용 중인 서비스가 +1 되었는지 확인한다.
    (반영되는 데 시간이 10분 정도 걸릴 수 있다.)

  • DNS 관리툴로 접속한다.

  • 구매한 도메인 [설정] 클릭

  • DNS 설정 [레코드 수정]

  • 호스트: @, 값/위치: IP주소 입력

  • IP주소와 도메인으로 모두 다 접속이 잘 되는지 확인한다.
    (네임서버에 도메인과 IP주소가 매칭되는 데 시간이 10분 정도 걸릴 수 있다.)

배포 끝🥰

profile
🍓e-juhee.tistory.com 👈🏻 이사중

0개의 댓글