본문 바로가기
컴퓨터관련 쪽지

[Azure Function] HttpTrigger interface 연습 (Serverless computing) python

by 프들이 2021. 8. 26.
반응형

Serverless 를 이용해서 내가 원하는 결과를 Azure 위에서 http event 발생했을 때 바로 실행 할 수 있다.

당연히 Azure 에 구독 (subscription) 이 있어야 한다.

기본 방법은 QuickStart https://docs.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-python 를 참조한다.

이 글에서는 위 Quickstart 문서를 바탕으로 만들었을 때 내가 원하는 module 을 만들어서 import 하여 사용할 경우를 정리한 것이다.

$ tree
.
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-38.pyc
│   └── predictor_diabetes.cpython-38.pyc
├── function.json
├── predictor_diabetes.py
└── sample.dat

우선 위와 같은 디렉토리 구조를 만들었다.

기본 적으로는 위의 QuickStart  문서를 따라하면 이와 같은 구조가 만들어지고 여기에 내가 추가한 것은 predictor_diabetes.py 인 상황이다.

predictor_diabetes.py 는 다음과 같은 dummy file 이다.

class DiabetesRiskPredictor:
    def __init__(self):
        pass
    def main(self, given_name: str) -> str:
        return f"{given_name}'s diabetes risk predictor"

if __name__=="__main__":
    obj = DiabetesRiskPredictor
    obj.main()

http request  를 처리하는 __init__.py 에는 다음과 같이 부른다. 여기서 중요한 것은 python library 를 만들 때 처럼 import 하는 모듈에 대한 path 를 지정해 주어야 한다는 것이다. .predictor_diabetes 에서 . 이 없으면 배포이후에 모듈을 찾지 못하는 일이 발생한다.

import logging

import azure.functions as func
from .predictor_diabetes import DiabetesRiskPredictor as DRP

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    res = {"name": None, "diabetesrisk":None}
    drpobj = DRP()
    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        res["name"]=name
        res["diabetesrisk"]=drpobj.main(name)
        return func.HttpResponse(
            (f"Hello, {name}. This HTTP triggered function executed successfully.\n"
            f"{res}")
        )


    else:
        return func.HttpResponse(
             "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
             status_code=200
        )

배포후 테스트를 해 보면 결과가 잘 나온 것을 확인 할 수 있다. 일단 GET 방식으로 name 의 값을 넘겼다.

반응형

댓글