[SF Diving] 3.5일차 - AWS EC2에 개인 project 배포하기

Seungho Ha·2020년 8월 22일
2

SF Diving

목록 보기
4/6
post-thumbnail

시작하며...

요즘 hot하다는 3대 cloud(AWS, Azure, GCP - 선호도나 우호도 순서가 아니라 alphabet 순서로 나열했다...) 중에서 GCP는 본의 아니게 online 강의를 수강하면서 몇 번 다루어 보았고, AWS는 DeepRacer를 이용해 본 적이 있다.
DeepRacer는 AWS에서 제공하는 차량의 CAD model을 이용하여 다양한 track에서 입력한 algorithm을 기반으로 주행 학습을 시키고, 학습된 model을 이용하여 자율주행을 실시하여 경주하는 자율주행차량 engine(?)이다. DeepRacer를 할 때, 솔직히 click만 잘 하면 알아서 instance도 생성해주고 학습도 시켜주고 학습된 algorithm을 기반으로 test 및 simulation을 진행할 수 있어서, 거의 겉핥기 수준으로 해 본 것이라, AWS를 해봤다고 하기도 좀... 쑥스러운 수준이다.
그런데 개인 project(물론 기본 page만 개발된 아직은 아주 한심한 수준이지만)를 AWS의 EC2 instance를 이용하여 배포해 보기로 해서, 나중에 나 스스로 다시 하기 위한 guide를 작성하기로 했다.

AWS에서 EC2 instance 생성하기

  1. AWS 접속
    계정 접속 화면

  2. EC2 Instance 생성
    1) EC2 click
    2) Instance > Instance 시작 click
    3) 3번째 항목(Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-05438a9ce08100b25) 선택
    %참고% Ubuntu server가 아닌 Linux 등을 선택해서 진행하면, 3번 과정에서 ssh 명령어를 입력할 때, 'Permission denied (public key)'라는 error가 발생함
    4) 기본 설정대로 2번째 항목(t2.micro) 선택 후, 우측 하단의 '검토 및 시작' click
    5) 우측 하단의 '시작하기' click
    6) '새 키페어 생성'을 선택하여 원하는 key의 이름을 설정한 후, '키페어 다운로드' 및 '시작하기' click
    7) 완료된 화면

  3. Running instance를 이용하여 기본 setting 진행
    1) 다시 instance 화면으로 돌아옴
    %참고% 상태 검사가 '초기화 중'에서 '2/2 검사 완료'로 바뀌면 완료된 것
    2) 생성한 instance를 click -> 세부사항 확인
    3) git bash를 열어서 command 입력
    %참고% 입력하는 command는 아래와 같음
    ssh -i (download한 key pair path)/(내가 정의한 keypair명).pem ubuntu@(EC2의 IPv4 퍼블릭 IP)
    이후 fingerprint 관련 yes/no -> yes
    4) git bash에서 AWS_EC2의 instance ubuntu server에 접속 완료

EC2 instance의 Ubuntu server에 mongoDB 설치하기

1. Ubuntu server에 mongoDB 설치
%참고% 입력하는 command는 아래와 같음
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -&&
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list&&
sudo apt-get update&&
sudo apt-get install -y mongodb-org

2. mongoDB 설치 완료 화면

3. Ubuntu server에서 mongoDB 실행하기
%참고% 입력하는 command는 아래와 같음
sudo service mongod start
-> command 입력 후, 다시 command 입력으로 돌아오면 성공(아무 log가 출력되지 않음)

4. mongoDB 설치 완료 확인하기
%참고% 입력하는 command는 아래와 같음
netstat -tnlp
-> '127.0.0.1:27017' 항목이 존재하면 성공적으로 설치된 것을 의미

5. mongoDB shell에 접속
%참고% 입력하는 command는 아래와 같음
mongo

6. 계정 생성하기
%참고% 입력하는 command는 아래와 같음
use admin;
-> 계정을 admin으로 변경
db.createUser({user: "원하는id", pwd: "원하는pwd", roles:["root"]});
-> 자신의 계정을 생성

7. mongoDB 재시작
%참고% 입력하는 command는 아래와 같음
exit
-> mongoDB shell을 종료하고 ubuntu로 돌아옴
sudo service mongod restart
-> mongoDB 재시작

8. mongoDB의 config file 수정을 위해 Vim으로 file 열기
%참고% 입력하는 command는 아래와 같음
sudo vi /dtc/mongod.conf

9. mongod.conf 수정
%참고% 수정하는 내용은 아래와 같음
bindIP: 127.0.0.1 -> bindIP: 0.0.0.0
#security -> security\n(공백 2번)authorization: enabled

10. mongoDB를 재시작한 후, 0.0.0.0:27017이 목록에 존재하는지 확인
%참고% 입력하는 command는 아래와 같음
sudo service mongod restart
netstat -tnlp

AWS EC2의 instance 설정 변경 및 Robo3T에서 mongoDB 접속

1. AWS EC2 instance 설명에서 '보안그룹 > launch-wizard-1' click

2. 'launch-wizard-1'을 선택하고 우측 상단의 '작업'에서 '인바운드 규칙 편집' click

3. 좌측 하단의 '규칙 추가'를 click하여 3개의 규칙을 추가한 후, 우측 하단의 '규칙 저장' click
%참고% 추가되는 규칙은 아래와 같음
HTTP / TCP / 80 / Anywhere -> HTTP 접속을 위한 기본 port
Custom TCP / TCP / 5000 / Anywhere -> flask 기본 port
Custom TCP / TCP / 27017 / Anywhere -> 외부에서 mongoDB에 접속을 하기 위한 port

4. 추가한 인바운드 규칙이 제대로 저장되었는지 확인

Robo3T에서 AWS EC2 instance의 Ubuntu server에 설치한 mongoDB에 접속

1. Robo3T 실행 > Connect > Create > 'Connection' tab에서 insatnce의 IP 주소를 입력

2. 'Authentication' tab에서 mongoDB에 생성한 계정 정보를 입력

3. 접속 성공 확인

FileZilla를 이용하여 AWS EC2 instance의 Ubuntu server에 project 올리기

1. FileZilla 열기

2. Site 생성
%참고% 아래의 순서대로 site를 생성
1) 좌측 상단의 '파일(F) > 사이트 관리자' 선택
2) 좌측 하단의 'New site' click
3) 좌측 'Select entry'에 '원하는 site 이름'을 입력
4) 우측 '프로토콜(t)'에서 'SFTP - SSH File Transfer Protocol' 선택
5) 우측 '호스트(H)'에 'AWS EC2의 IP 주소'를 입력
6) 우측 '로그온 유형(L)'에서 '키 파일' 선택
7) 우측 '사용자(U)'에 'ubuntu' 입력
8) 우측 '키 파일(K)'에 AWS EC2 instance에서 생성한 key pair를 찾아서 선택
9) '확인' click

3. 사이트 관리자에서 생성한 site를 선택한 후 '연결'을 click하여 연결

4. 개인 project의 folder를 우측의 ubuntu folder에 drag&drop

AWS EC2의 Ubuntu server에 python 관련 package 설치

1. python3를 실행할 때 python만으로 실행할 수 있도록 명령어 변경
%참고% 입력하는 command는 아래와 같음
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

2. pip(python install package)3 설치
%참고% 입력하는 command는 아래와 같음
sudo apt-get update
sudo apt-get install -y python3-pip

3. pip3를 실행할 때 pip만으로 실행할 수 있도록 명령어 변경
%참고% 입력하는 command는 아래와 같음
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1

4. flask 설치
%참고% 입력하는 command는 아래와 같음
pip install flask

AWS EC2의 Ubuntu server에 올린 개인 project 실행하기

1. 개인 project에서 사용하는 package 설치
%참고% 입력하는 command는 아래와 같음
pip install (설치해야 하는 package명 입력 - 여러 개인 경우, 공백 1칸으로 이어서 입력)

2. 개인 project directory로 이동
%참고% 입력하는 command는 아래와 같음
cd ~/(FileZilla에서 upload한 개인 project 경로)

3. app.py에서 MongoClient 부분 수정하기
%참고% 아래와 같이 수정해야 함
1) 수정 전
client = MongoClient('localhost', 27017)
2) 수정 방법 - git bash(AWS EC2 Ubuntu server)에서 생성한 계정의 id/pwd 이용
client = MongoClient('mongodb://(생성한 id):(생성한 pwd)@(AWS EC2의 IP 주소)', 27017)
3) 수정 후
client = MongoClient('mongodb://shha:hash@54.180.87.227', 27017)

4. app.py 실행
%참고% 입력하는 command는 아래와 같음
python app.py

5. chrome에서 AWS EC2 instance의 IP 주소를 입력하여 개인 project 출력 확인
%참고% chrome 창에 아래와 같이 주소를 입력
http://(AWS EC2 instance의 IP 주소):5000/

6. python 실행을 멈추고, port forwarding rule 입력
%참고% 입력하는 command는 아래와 같음
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
-> Web service는 5000 port에서 실행되고 있기 때문에, ip 주소 뒤에 ':5000/' 처럼 port를 입력해주어야 함
-> Http 요청에서는 80 port를 기본으로 사용하고 있기 때문에, 80 port로 오는 request를 5000 port로 전달해주는 port forwarding을 사용하면, ip 주소만 입력해도 원하는 web service 화면으로 갈 수 있음

7. app.py를 다시 실행시킨 후, AWS EC2의 ip 주소만 입력하여 web service 실행 확인

8. 원격 접속을 종료해도 server가 계속 돌아가도록 설정
%참고% 입력하는 command는 아래와 같음
nohup python app.py &

9. 원격 접속 종료

10. chrome에서 AWS EC2 ip 주소로 다시 접속 확인

마치며...

솔직히 말해서, 아직도 cloud를 제대로 이해한 것도 아니고, 제대로 사용한 것도 아니라는 사실에는 변함이 없지만, 그래도 아주 조금씩이지만 한 걸음씩 발전해 나가고 있다는 느낌이 든다... 개인 project를 모두 완성한 후, local에서 test해보고 마지막에 AWS에 올리고 싶었지만, 어차피 instance는 삭제해버리면 아무도 모르는 일이 되는 거니까 미완성이라도 직접 해봤다는 사실에 의의를 두고 싶다.
이제 ToDoList에서 개발만 빡세게 해서 목록을 하나씩 지워나갈 일만 남은 것 같다:)

profile
Bachelor of Mechanical Engineering -> Master of Mechanical Engineering (Intelligent Systems and Robotics Laboratory) -> IT Developer -> Next...?

0개의 댓글