결론은 안된다.
학교에서 대여해준 NHN Toast Cloud 서버가 8월 말에 사용이 중지된다는 얘기를 듣고 AWS에 입문해볼까 하다가 어차피 토이 프로젝트이니 이 정도는 Netlify나 Heroku에 서비스해도 될 것 같아서 배포를 하려 했는데, 딱 거기서 생각을 멈췄어야 했다. 아직도 머리가 얼얼하다.
결론부터 말하자면 정적 웹(파일 업데이트가 없고 화면 view만 존재하는 웹)이 아니라면 헤로쿠든 네트리파이든 쓰면 안된다!!!
정확히 오후 한시부터 밤 열시까지 이 삽질을 했다.
안된다.
Flask는 기본적으로 파이썬을 개발용 웹으로 서비스해주기 때문에 gunicorn
, wsgi
같은 웹팩을 이용해서 사이트를 외부에 노출시켜야 한다.
플라스크 기반의 블로그가 네트리파이나 헤로쿠에서 잘 돌아가는 이유는, 지금 내가 쓰고 있는 헥소나 지킬과 같은 블로그 툴은 git push
과정으로 배포하는 방식이라 결국 푸시할 때마다 정적 뷰가 생성되기 때문에 잘 사용되는 것이다.
내가 옮기려는 Flask 앱은 이미지를 업로드하면 그 이미지를 분석해주는 서비스이기 때문에 이미지 “업로드”는 헤로쿠, 네트리파이와 같은 PaaS 클라우드에서는 할 수 없다..
네트리파이 개발자가 client-side가 아닌 server-side 앱은 호스팅이 안된다고 한다.
정적인 웹은 얼마든지 호스팅할 수 있다. 억울해서 이거라도 적어놓으려 한다.
안되지만,
파일 업로드 등의 로직이 없는 Static Web은 네트리파이, 헤로쿠에서 얼마든지 서비스할 수 있는데, 일단 Flask 앱은 다 만들었다고 가정하고 이를 조금만 바꿔보자.
네트리파이는 Flask-Freeze
를 이용하면 되고, 헤로쿠는 gunicorn
선에서 서비스할 수 있다. 네트리파이는 이 글에 잘 정리되어 있으니 따라하면 되고, 헤로쿠만 정리해보겠다.
헤로쿠에서 Flask 배포하기
우선 메인 앱(py)을 실행하는 부분이
1 | if __name__ == '__main__': |
다음과 같이 되어 있는지부터 확인해보자. port
를 임의로 건드리면 안된다.
또한 앱을 라우팅하는 파이썬 파일에는
1 | app = Flask(__name__) |
당연히 app
을 Flask
화 해야한다.
그리고 프로젝트 최상위 폴더에 gunicorn
관련 설정 파일을 하나 만드는데 확장자 없는 Procfile
파일을 만들어서
1 | web: gunicorn <메인 앱 이름>:app |
이렇게 한 줄의 텍스트를 넣고 저장한다. 이 Procfile
을 헤로쿠에서 web
으로 인식하고 gunicorn
기반으로 웹을 외부에 노출시키게 된다.
이제 requirements.txt
와 runtime.txt
만 설정하면 된다. 모두 프로젝트 최상위 폴더에 위치시킨다. 기본적으로 Flask
와 웹팩 모듈들을 넣어준다. (파이썬 3.6.1 버전 기준이므로 버전에 맞게 바꿔준다)
requirements.txt
1 | click==6.7 |
이제 파이썬 버전만 설정하면 정말 끝이다.
runtime.txt
1 | python-3.6.1 |
이제 헤로쿠에 깃을 연결하고 배포하면 된다. 끝.
난 여기까지는 호스팅이 되는데 파일을 업로드하면 (당연히)
헤로쿠에서 파일 리퀘스트를 거부하는 500 Error가 발생한다.
이제 뭔가를 할 때는 되는지 안되는지부터 보고 삽질을 하던지 해야겠다.. 아무튼 내가 옮기려 했던 앱은 AWS에서 서비스 할 예정이다.