린스토리

[Flask & Ngrok] 포트포워딩 없이 외부에서 로컬 서버로 접속하기 본문

Python/API

[Flask & Ngrok] 포트포워딩 없이 외부에서 로컬 서버로 접속하기

rinaaaLee 2022. 8. 4. 17:06

딥러닝 모델을 서빙하는 과정에서 로컬 서버에서 api로 띄워놓고, 외부 노트북에서 접속해 train을 호출하는 구조로 만들고 싶었다. 회사 내부에서 로컬 서버를 구축해 사용하고자 하였고, 공용으로 쓰는 네트워킹이어서 별도 포트포워딩이 필요 없는 상태에서 test를 해보고 싶었다. 그래서 간단하게 Flask로 RestAPI를 만들어 내 노트북에서 api를 실행시켜 보도록 해보았다.


Flask

간단하게 flask로 test 구문을 작성했다.

from flask import Flask

app = Flask(__name__)

@app.route("/hello", methods=["GET"])
def hello():
    return "hello world"

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

app.run에서 host를 '0.0.0.0'으로 설정하면 모든 ip로의 접근을 허용하겠다는 뜻이 된다. 
port는 내가 임의로 설정했다. 

 

우선 로컬 서버에서 위 파일을 실행시켰다.

python api_test.py

이렇게 서버를 띄워놓고, 노트북에서 접근하고자 하는데, 

여기서 만약 포트포워딩이 되어 있지 않으면 로컬 서버의 내부 ip로의 접근이 불가능하다. 

 

그래서 포트포워딩 없이도 접근할 수 있도록 해주는 "Ngrok"을 사용하고자 한다.

 

Ngrok

Ngrok은 외부(Public)에서 로컬에 접속할 수 있게 도와주는 터널링 프로그램이다.

로컬 서버에서 우선 Ngrok을 설치한다.

내 로컬 서버는 Ubuntu 18.04 LTS가 설치되어 있다. 

"Ngrok 다운로드 페이지" 에 접속하여 본인 OS에 맞는 Ngrok을 설치한다.

curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list && sudo apt update && sudo apt install ngrok

나는 위 구문을 사용해 설치했다. 

terminal을 켜고 'ngrok'을 명령하면 정상 설치 되었음을 확일할 수 있다. 

 

그 다음, ngrok 홈페이지에서 회원가입을 하고, tocken을 등록해준다. 

이 tocken이 있으면 터널링 세션 시간 만료없이 사용할 수 있다. 

2번에 있는 명령 구문을 터미널에 입력한다. 

 

외부에서 접속하기

자, 이제 준비가 다 됐다. 

우선 로컬 서버에 api를 띄웠었다. 혹시 모르니 껐다가 다시 띄워준다. 

 

그리고 터미널을 켜고 api를 호출하는 port 번호를 입력하여 ngrok으로 터널을 만들어줄 것이다. 

ngrok http 8081

이렇게 터미널에 입력해준다. 그러면 다음과 같이 창이 나올 것이다. 

여기서 반드시..! api를 로컬에 띄워준 후 ngrok을 실행해야한다. 안그러면 포트를 못찾을테니까..!!

 

이렇게 화면이 나오면, 여기서 Forwarding 부분에 있는 http 주소를 내 노트북에서 실행시키면 된다. 

https://5812-61-74-181-1.jp.ngrok.io/hello

api 라우팅을 "/hello"로 해주었기 때문에, 끝에 이걸 붙여줘야 정확한 접근이 가능하다. 

이걸 빼먹으면 그 유명한 404에러를 만나게 된다. 

 

노트북에서 위처럼 접근하면 이제 예쁘게 "hello world"라고 적혀있는 페이지를 만날 수 있다. 

 

 


이렇게... 간단하게 노트북으로도 로컬 서버에 띄워놓은 api에 접근할 수 있도록 테스트해보았다. 
이제 내가 짠 딥러닝 모델 파일도 api로 만들어서 이렇게 사용하도록..! 할 것이다. 

후우... 어렵다... ㅎㅎ

Comments