AWS CDK를 사용하여 API 프런트 Lambda 함수 배포

이 프로젝트는 Python 맛 AWS CDK를 사용하여 API 게이트웨이를 통해 액세스할 수 있는 Lambda 함수를 배포하는 최소 작업 예제입니다. API를 사용하면 데이터를 Lambda 함수에 직접 전달하고 결과와 함께 응답을 받을 수 있습니다.

이 패턴을 사용하여 가능한 것은 무엇입니까?



1) 함수에 데이터를 전달하고 기계 학습 예측을 다시 얻습니다.
2) S3에 저장된 파일을 요청하고 보안 링크를 다시 가져옵니다.
3) 함수에 매개변수를 보내고 복잡한 계산을 다시 가져옵니다.
4) 데이터베이스 검색.
등...

Github repository can be found here.

CDK 초기화 및 배포



CDK 설정 및 환경 부트스트래핑은 다루지 않겠습니다. 해당 정보를 찾을 수 있습니다here..

CDK를 설정했으면 프로젝트를 설정해야 합니다.
  • mkdir CDK_Lambda_API && cd CDK_Lambda_API
  • cdk init --language python
  • source .venv/bin/activate
  • 선택 사항: Lambda 함수에 추가 라이브러리가 필요한 경우 Docker를 사용하여 스택을 배포하는 동안 사용자 지정 빌드를 허용하도록 requirements.txt에 aws-cdk.aws-lambda-python-alpha를 추가합니다.
  • pip install -r requirements.txt && pip install -r requirements-dev.txt
    이제 빈 스택을 AWS에 배포합니다.
  • cdk deploy

  • 스택 설계



    이 스택은 도커 컨테이너를 사용하여 모든 추가 라이브러리로 함수를 빌드하기 위해 aws-lambda-python-alpha를 사용하여 람다 함수를 배포합니다. 실행하기 전에 Docker가 설치되어 있고 데몬이 실행 중인지 확인하십시오cdk deploy.

    # lambda_api_stack.py
    
    from aws_cdk import Stack
    from aws_cdk import aws_apigateway as apigw
    from aws_cdk import aws_lambda as _lambda
    from aws_cdk import aws_lambda_python_alpha as _lambda_python
    from constructs import Construct
    
    
    class LambdaModelPredictionsStack(Stack):
        def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
            super().__init__(scope, construct_id, **kwargs)
    
            # in __init__ I like to initialize the infrastructure I will be creating
            self.prediction_lambda = None
            self.gateway = None
            # Additional useful infrastructure might include an S3 bucket,
            # an EFS store, SQS queue, etc.
    
            self.build_infrastructure()
    
        def build_infrastructure(self):
            # For convenience, consolidate infrastructure construction
            self.build_lambda()
            self.build_gateway()
    
        def build_lambda(self):
            self.prediction_lambda = _lambda_python.PythonFunction(
                scope=self,
                id="PredictionLambda",
                # entry points to the directory
                entry="lambda_funcs/APILambda",
                # index is the file name
                index="API_lambda.py",
                # handler is the function entry point name in the lambda.py file
                handler="handler",
                runtime=_lambda.Runtime.PYTHON_3_9,
                # name of function on AWS
                function_name="ExampleAPILambda",
            )
    
        def build_gateway(self):
            # This will attach an API gateway as a trigger to our
            # lambda function above. The return of the handler function also
            # gets routed back to the API gateway.
            self.gateway = apigw.LambdaRestApi(
                self, "Endpoint", handler=self.prediction_lambda
            )
    
    


    최소 작동 Lambda 함수



    API 게이트웨이가 예상하는 응답 형식의 예here를 볼 수 있습니다.

    # lambda_funcs/APILambda/API_lambda.py
    
    from logging import getLogger
    
    logger = getLogger()
    logger.setLevel(level="DEBUG")
    
    
    def handler(event, context):
        logger.debug(msg=f"Initial event: {event}")
        response = {
            "isBase64Encoded": False,
            "statusCode": 200,
            "headers": {
                "Access-Control-Allow-Origin": "*",
            },
            "body": f"Nice! You said {event['queryStringParameters']['q']}",
        }
        return response
    
    


    이제 할 수 있습니다 cdk deploy . Lambda 함수는 도커를 사용하여 빌드되고 부트스트랩된 ECR 리포지토리에 업로드됩니다. 프로젝트가 빌드되면 CloudFormation 템플릿을 합성하고 인프라 배포를 시작합니다. AWS CloudFormation에서 스택 배포를 볼 수 있습니다. 인프라가 상대적으로 단순하기 때문에 신속해야 합니다.

    프로세스가 완료되면 CDK는 API 게이트웨이의 끝점 URL을 출력합니다.



    API 게이트웨이 쿼리



    API 게이트웨이를 쿼리하고 람다 함수에서 다시 응답을 받으려면 requests 또는 Postman를 사용하여 get 요청을 보내십시오.

    좋은 웹페이지 즐겨찾기