일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Backoff
- pytorch
- 매매봇
- 고유값
- docker
- BitCoin
- leetcode
- onnx #openvino #tf2onnx #openvinokeras
- Python #open #read #파이썬
- Mecab
- Flask
- python
- Gunicorn
- GPT
- NLP
- ML #머신러닝
- OpenAI
- overloaed
- GPT API
- GPU
- CentOS
- 파이썬 #기초 #응애
- Anaconda
- Python #for문 #while문 #응애
- vram
- ML
- DataLoader
- MySQL
- UUID
- GCP
- Today
- Total
람쥐썬더
[PYTHON] Vercel Flask 배포 본문
Vercel 에서 Flask 를 배포하며 생긴 문제점들
기본적으로 Next.js 와 같은 프로젝트를 배포하는데 쓰는거다 보니 python 에 대해서는 조금 불친절함 감이 있다
그래도 Pro 기준 월 2만원에 여러 프로젝트 올려 사용할 수 있으니 가벼운 배포 여러개 하기에 용이하고 비용 절감때문에 올렸다..
( 번거롭기는 해도 이런저런 문제점 때문에 인스턴스 올려서 쓸까 고민도 했지만 돈이읍다 읍서 )
Basic Flask 구성
서버리스 형식이지만 api 형식이 아니라 그냥 사용 하려 했을 때는 위와같은 rewrite 형식으로는 작동 되지 않았음
그래서 다르게 구성을 해줬다
Root 구성은 따로 구성 하지 않고 완전 root foler 에 application.py 를 넣고의 구성은
│ package.json
│ Pipfile
│ README.md
│ requirements.txt
│ vercel.json
│ application.py
vercel.json
{
"version" : 2,
"builds": [
{
"src": "application.py",
"use": "@vercel/python",
"config": { "maxLambdaSize": "15mb", "runtime": "python3.9" }
}
],
"routes": [
{
"src": "/(.*)",
"dest": "application.py"
}
]
}
packages.json
{
"engines": {
"node": "18.x"
}
}
위에 적어놓은 바와 같이 rewrite를 사용하지 않고 builds 를 통해 빌드 설정을 구성한다
근데 문의도 그렇고 최근 문서를 보면 이 방법은 구버전 방식이며 권장하지 않는다고 한다.
But 간단한 render 및 구성의 배포는 충분하고 빌드 시간도 빠르기 때문에 사용해도 무방하긴 하다
Nevertheless 이 구성은 Duration 이나 기타 Vercel 에서의 배포 설정이 되지 않기 때문에 api 형식으로 구성하는걸 추천 한다 ( 라고 Vercel CS 팀에서 답변왔음 )
Time Out 에러
실제로 Max-duration 때문에 요청 시간이 15초를 초과하면 Timeout 이 났고 이를 해결하기 위해서 구성 자체를 전부 다 바꿔줬다..
DefaultMaximum
Hobby | 10s | 60s |
Pro | 15s | 300s |
Enterprise | 15s | 900s |
플랜 별 기본 , 최대 시간이며 짱나게 기본 15초로 설정해뒀다..
API 요청이 17~18 초 걸리는데 이것 때문에 귀찮게 전체 구성을 바꿧음..
Vercel 에서 권장하는 Severless Standard 형식
│ package.json
│ Pipfile
│ README.md
│ requirements.txt
│ vercel.json
└─api
└─ application.py
vercel.json
{
"version": 2,
"rewrites": [{ "source": "/(.*)", "destination": "api/application.py" }],
"functions": {
"api/application.py": {
"memory": 1024,
"maxDuration": 300
}
},
}
application.py 에서의 요청 max-duration 과 memory 설정을 함께 바꿔줬다
모든 파일에 적용하고 싶다면 "*/*" 형식으로 잡아주면 설정된?다 ( 사실 해보진 않았는데 nextjs에서는 됐음 )
import error
그리고 또 발생한 문제는 custom util을 불러오지 못한다는 문제가 있었다
flask 에서 blueprint 형식으로 route 를 찢어줬는데 이걸 import 할때 발생하는 문제 ..
서버리스를 각잡고 써본적이 없어서 경로에는 크게 신경쓰지 않았는데 얘가 발목을 잡았다.
폴더 구성은 아래와 같다
│ package.json
│ Pipfile
│ README.md
│ requirements.txt
│ vercel.json
└─api
├─routes
│ ├─ __init__.py
│ └─ verify.py
├─data
│ └─ raw.json
├─static
├─templates
└─utils
├─ __init__.py
└─ func.py
해결법은 2가지
1. 파일 내부에서 경로에 대해 규칙을 잡아주거나
2. vercel.json 에서 환경 설정으로 경로를 설정해주거나
나는 두가지 다 사용했다
내부 경로에 대한 규칙은 json파일을 열어올 때 ( data/raw.json )
vercel.json 환경 설정은 custom util 및 blueprint 를 불러올때 ( routes, utils )
두 가지 방식으로 사용한다
일단 1번의 상대 경로로 데이터를 불러올 때는
## application.py
import os
import json
base_dir = os.path.dirname(os.path.abspath(__file__))
data_path = os.path.join(base_dir, 'data', 'raw.json')
with open(data_path, 'r') as raw_data:
data = json.load(raw_data)
위와 같이 상대적으로 경로를 지정해주고 불러오는 식으로 해결됐고 불러오는 path에 따라 유동적으로 설정 돼야한다.
그리고 2번의 utils 및 routes 를 정상적으로 import 하기 위해서는 vercel.json 을 설정해주면 된다
{
"version": 2,
"rewrites": [{ "source": "/(.*)", "destination": "api/application.py" }],
"functions": {
"api/application.py": {
"memory": 1024,
"maxDuration": 300
}
},
"env": {
"PYTHONPATH": "api/" #### PYTHONPATH 잡아주기
}
}
이게 아니면 import 를 상대경로로 해줘도 되긴 하는데 로컬에서 경로 설정 안해주면 귀찮으니까..
# application.py
import .utils import *
import .routes import *
flask 를 배포할 때 발생했던 문제는 크게 이정도이고
Discussion 보면 Django, FastAPI 관계 없는듯 하다.
'파이썬' 카테고리의 다른 글
[PYTHON] 애매한 random 보다 uuid (0) | 2024.02.22 |
---|---|
[PYTHON] FLASK - GUNICORN (0) | 2023.12.31 |
[PYTHON] PYTORCH 이미지 DataLoader 구축 플로우 정리 (0) | 2023.11.20 |
[PYTHON] AttributeError: module 'openai' has no attribute 'ChatCompletion' (0) | 2023.11.07 |
[Leetcode] 1337. The K Weakest Rows in a Matrix (0) | 2023.09.18 |