[fast api] - uvicorn으로 api서버 실행하기
들어가며
최근 들어, fast api 실습을 진행했었다. 실습을 진행하며, api 서버가 열리지 않는? 경험을 했었다. 그 이유는 내가 host라는 개념에 대해서 명확히 인지하지 못하고 있었기 때문!
관련해서, fast api 앱을 실행하는 예제와 host개념에 대해서 간단히 정리하려고 한다.
fast-api 예제
우선, fast api와 uvicorn을 설치해준다.
pip install fastapi
pip install uvicorn
다음으로, 간단한 main.py를 만들어준다.
https://fastapi.tiangolo.com/ko/tutorial/first-steps/
첫걸음 - FastAPI
첫걸음 가장 단순한 FastAPI 파일은 다음과 같이 보일 겁니다: from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} 위를 main.py에 복사합니다. 라이브 서버를 실행합
fastapi.tiangolo.com
예제는 여기서 가져왔다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
그리고, 터미널에서 uvicorn을 이용해 main.py를 실행해주면
uvicorn app:main.py --reload
API 서버에 접속할 수 없다고 나온다! 왜 그럴까?
에러 해결
일단, 내 환경에 대해서 먼저 설명하겠다.
현재, 내컴퓨터(mac)에서 GCP VM instance 터미널을 이용하고 있는 상황이다. 그렇다면, 여기서 질문 앞선, 코드를 실행하면 host는 기본적으로 localhost가 된다. (127.0.0.1은 로컬호스트를 나타내는 특별한 IP 주소이다.)
uvicorn app:main.py --reload
그렇다면, 여기서 질문 내 컴퓨터(=맥)와 GCP Server의 호스트는 같을까 다를까?
당연히! 다르다. 즉, API접속이 안됐던 이유는 앱 실행 디폴트 호스트 값이 로컬 호스트인데 GCP서버의 로컬호스트와 내 컴퓨터의 로컬 호스트가 다르기 때문이다.
그래서, 아래와 같이 코드를 수정해주어야 한다.
uvicorn app:main.py --reload --host 0.0.0.0 --port 8000
0.0.0.0은 IPv4체계의 모든 IP주소를 의미한다. 즉, 누구나 여기 API앱에 들어와도 된다는 의미이다. 이후, GCP의 공인IP(=외부)주소와 8000포트를 입력하면 fastAPI 앱에 접속할 수 있게 된다. http://공인IP:8000
Host 뭐길래?
그래서, 지금까지 내용을 정리해보자면 GCP서버의 로컬호스트와 내 컴퓨터의 로컬호스트가 다르기 때문에 앱 실행을 못했다!이다. 그렇다면, 호스트가 뭐길래?
호스트라는 의미는 매우 광범위한데, IP(Internet Porotocol)안에서 보자면 호스트 = 컴퓨터이다. 즉, 인터넷이라는 도구를 매게로 각각의 호스트들이 양방향으로 정보를 교환하는 것이다.
다시, 앞선 코드를 살펴보자.
uvicorn app:main.py --reload --host 0.0.0.0 --port 8000
여기서 host(=컴퓨터) 라고 생각했을 때, 앱을 실행한 서버의 "공인IP"주소만 알면 누구나, 8000포트로 들어오라는 의미가 된다. host=가 주인이라는 뜻이 있으니.. 마치 host가 앱의 "주인"이 아닌가? 라는 헷갈림이 처음에 있었는데, host를 우리가 사용하는 각각의 컴퓨터로 생각하면 편할 것 같다.