FastAPI는 Swagger를 기본적으로 내장하여 제공하는데, JWT 인증 관련해서 Swagger에서 바로 사용해 볼 수 있도록 하는 Authorize 버튼을 활성화하는 방법에 대해 공유한다. JWT 토큰을 넣으면 인증이 완료되고, 유저 정보를 갖고 있도록 구현할 것이다. 기본적으로 JWT 관련 로직은 미리 구현되어있다고 가정하고 여기서는 따로 다루지 않는다. # HTTPBearer 구현 FastAPI는 보안을 위해 몇 가지 기본 클래스를 제공하는데, 이 중 OAuth2PasswordBearer라고 있는데 얘를 바로 사용하면 Swagger 모달창에 불필요한 인풋들도 추가되어서 여기서는 사용하지 않을 것이다. 우리는 FastAPI가 제공하는 HTTPBearer 클래스를 상속받아서 구현할 것이다. 이렇게 ..
pytorch아 tensorflow로 작성된 딥러닝 모델을 FastAPI로 서빙하는 방법에대해 공유한다. # 서론 딥러닝 개발자가 어느정도 서버 지식을 갖고 있어서 모델 서빙까지 해주면 더할나위 없이 좋지만, 그렇지 않은 경우 서버 개발자가 이를 수행해야한다. 필자는 보통 모델 서빙 서버와 비즈니스 서버를 분리하지 않고 하나의 FastAPI 프레임워크로 구성하는데, 프로젝트 규모가 크다면 모델 서빙용 서버를 따로 분리하는 것도 방법이다. # 딥러닝 개발자의 역할 필자는 Vision 관련 모델 (Shufflenet이나 resnet 등)만 연동해봐서, 이 기준으로 설명함을 미리 알린다. 1. 모델 학습시키기 딥러닝 개발자는 코랩이든 워크스테이션이든 일단 학습을 시킨다. 2. 모델 소스와 weight 파일 전..
FastAPI 프레임워크로 이벤트 기반 아키텍처를 구축하는 방법에 대해 공유한다. # 이벤트 기반 아키텍처란? 새로운 댓글 작성 시, 게시물 작성자에게 알림을 보내야 하는 기능을 구현해야 한다고 가정해 보자. 이때 "댓글 작성 로직" 마지막에 "게시물 작성자에게 푸시 알림 전송 로직"이 포함될 것이다. 이러면 "댓글 작성"은 본연의 역할과는 다소 다른 도메인인, "푸시 알림 전송"이라는 로직을 포함하게 된다. (즉, 알림 도메인에 의존성이 생긴다.) 이를 이벤트 기반 아키텍처로 변경하면 결합도를 낮출 수 있다. 댓글 작성 -> 댓글 작성 완료 이벤트 발행 댓글 작성 완료 이벤트 핸들러에서 푸시 알림 전송 이러한 이벤트 기반 아키텍처는 로컬 이벤트(앱 서버 내부 이벤트)와 외부 이벤트 구조(카프카, 메시지..
FastAPI에서 AWS S3에 이미지 업로드하는 방법을 공유한다 # S3 버킷 생성 버킷 생성 부분은 따로 다루지 않겠다. 구글에 검색하면 자료가 많이 나오니 참조하면 될 것 같다. 퍼블릭 엑세스를 모두 허용했는데도 access denied가 뜬다면, 권한 정책을 잘못 설정한 것일 가능성이 있으므로 다음을 체크해본다. https://dev.classmethod.jp/articles/if-access-denied-appears-even-though-you-disabled-public-access-blocking-on-amazon-s3-what-is-the-workaround/ Amazon S3에서 퍼블릭 액세스 차단을 비활성화 했음에도 AccessDenied이 뜨는 경우 해결 방법은? | Develo A..
# 서론 Uvicorn은 싱글 프로세스라 서비스를 실제로 할 때 서버 성능 저하가 발생할 수 있다. 그래서 해당 Uvicorn들을 여러개 관리하여 멀티프로세스 환경을 구성할 수 있도록하는 Gunicorn을 사용해서 프로세스를 여러개 구동한다. # Gunicorn 설치 pip3 install gunicorn EC2 환경에 Gunicorn을 설치한다. # Gunicorn 실행 gunicorn main:app --workers 2 --worker-class uvicorn.workers.UvicornWorker --daemon --access-logfile ./log.log --workers : 프로세스 갯수다 (최대 vcpu 갯수 * 2 만큼 설정하기를 권장) --worker-class : 프로세스를 다중으로..
# 페이징 기본 unit_per_page = 5 offset = page * unit_per_page db.query(Gallery).offset(offset).limit(unit_per_page).all() offset과 limit을 활용해서 페이징을 처리한다. # 정렬 기준을 넣고 싶을 때 unit_per_page = 5 offset = page * unit_per_page db.query(Gallery).order_by(desc(Gallery.created_time)).offset(offset).limit(unit_per_page).all() offset 앞에 order_by 옵션을 넣어준다. # 사용예시 # 갤러리 - 사진/그림 리스트 반환 @router.get("/gallery") async d..
# 서론 FastAPI를 AWS EC2에 nginx를 활용하여 배포하는 방법을 정리 * EC2 인스턴스를 생성하고 접속하는 방법은 따로 다루지 않는다. # EC2 기본 설정 EC2를 생성하면 기본적으로 python3가 설치되어있다. 하지만 pip3는 설치되어 있지 않으므로 설치해준다. sudo apt install python3-pip pip이 설치되면 서버 구동에 필요한 모듈들을 다운로드 받는다. pip3 install -r requirements.txt # Nginx 설정 FastAPI 서버 포트를 포워딩해줄 프록시 서버인 nginx를 다운받는다. sudo apt install nginx 다음으로 nginx config 파일을 작성한다. 다음 경로로 이동하여 fastapi.conf 파일을 생성한다. ..
2024. 01. 01 업데이트 # 서론 FastAPI 프레임워크에서 이미지 (multipart form data)를 업로드 하는 방법을 공유한다. * FastAPI 공식문서 Request Files 탭에 기록되어 있음 https://fastapi.tiangolo.com/tutorial/request-files/ Request Files - FastAPI Request Files You can define files to be uploaded by the client using File. Info To receive uploaded files, first install python-multipart. E.g. pip install python-multipart. This is because uploade..