웹서비스 기술 익히기 - AWS에서 초간단 flask 웹서버 띄우기

5. AWS에서 초간단 flask 웹서버 띄우기

ubuntu OS에는 python2, python3 가 디폴트로 설치되어 있음

  • 간단히 pip, python을 실행하면 ubuntu OS에 있는 pip, python 버전 2로 실행될 가능성이 많음
  • 깔끔한 환경을 만들기 위해 우선 리눅스용 anaconda 를 설치해야 함

ubuntu 용 anaconda 설치

  • FTP를 사용해서 다운로드받은 파일을 AWS EC2에 업로드한 후
    • bash Anaconda3-5.1.0-Linux-x86_64.sh

PATH 에 /home/ubuntu/anaconda3/bin 추가

  • vi ~/.bashrc
    • PATH="$PATH:/home/ubuntu/anaconda3/bin"
  • ~/.bashrc 파일은 처음 터미널 접속(해당 아이디로 로그인)시에 실행됨
    • ~/.bashrc 수정 후 바로 해당 설정 적용을 위해서는 다음 명령을 실행해야 함
      • source ~/.bashrc

sudo 명령어 로 실행시, PATH 설정이 적용되도록 설정

  • sudo 명령은 별도로 PATH 설정을 해줘야 합니다. (보안 이슈)
  • sudo 의 PATH에 /home/ubuntu/anaconda3/bin 을 추가하고 싶어요
  • sudo vi /etc/sudoers
    • Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/ubuntu/anaconda3/bin"
    • 이 설정은 변경 후 바로 적용
      • sudo 명령을 실행할 때마다 해당 설정을 확인하기 때문

EC2 안에서 flask로 웹서버 실행하기

  • flask 코드 올려놓기
    • mkdir flaskapp
    • flaskapp 디렉토리에 flask 코드 파일 올리기 (예: basic.py)
  • 파이썬 가상환경 만들기
    • cd flaskapp
    • sudo conda install virtualenv
    • virtualenv flaskapp
    • source flaskapp/bin/activate
    • python3.6 basic.py

에러 확인하기

  • EC2에 flask로 웹서버를 실행한 후, 어느 순간 flask 웹서버가 다운되었다.
    • 어느 코드에 문제가 있는지, logging 라이브러리로 설정하면 되지만,
    • 핵심 코드에는 logging 라이브러리로 로그 코드를 넣어야겠지만,
    • 모든 에러를 확인하기 위해 리눅스 명령을 활용해서 간단하게 에러 확인 명령을 넣을 수 있음
  1. flask 코드에 다음 코드 추가하기
    • app.debug = True
  2. 리눅스에서 터미널에 출력되는 내용을 파일로 저장하기
    • standard output을 파일로 redirect 하기
      • echo "flask error" > flaskapp.log
    • flaskapp.log 파일 뒤에 계속 내용을 이어서 기록하려면
      • echo "flask error" >> flaskapp.log
    • 화면에도 출력하고, 파일로도 redirect 하기
      • echo "flask error" | tee flaskapp.log
    • 화면에도 출력하고, 파일로도 redirect 하기(flaskapp.log 파일 뒤에 계속 내용 기록)
      • echo "flask error" | tee -a flaskapp.log

에러는 standard output 이 아니라, standard error 로 출력될 가능성이 높음

  • 테스트를 위해 강제로 간단한 코드를 basic.py 라는 이름으로 만들어봅니다.


In [9]:
import sys

sys.stdout.write("This is a standard output")
sys.stderr.write("This is a standard error")
This is a standard output
This is a standard error
  • standard error만 파일로 redirect 하고, standard output은 화면에 출력하려면
    • python3.6 basic.py 2> flaskapp.log
  • standard output/error를 모두 파일로 redirect 하기
    • python3.6 basic.py 2&> flaskapp.log
  • standard output/error를 모두 파일로 redirect 하고 화면에도 출력하기
    • python3.6 basic.py 2>&1 | tee flaskapp.log

테스트 (다음 코드를 basic.py 로 작성하고, EC2 IP:8080/hello 로 실행)

  • 터미널에서 다음 실행
    • python3.6 basic.py 2>&1 | tee flaskapp.log
  • 웹브라우저를 오픈해서 EC2 IP:8080/hello 주소 입력
    • 해당 EC2의 Security Group 에서 8080을 Custom TCP Rule 로 InBound 룰에 추가해야 해당 포트로 flask 웹서버를 접속할 수 있음
  • 터미널에서 에러 로그 확인
  • 터미널에서 control + c 키로 basic.py 실행을 중지시키고, 해당 디렉토리에 생성된 flaskapp.log 파일 확인
    • vi flaskapp.log
In [ ]:
from flask import Flask

app = Flask(__name__)
app.debug = True
test = 1

@app.route("/hello")
def hello():
    test += 1
    if test > 4:
        return test / 0
    else:
        return "<h1>JaeSung Fighting</h1>"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port="8080")