AWS CDK를 사용하는 AWS Lambda 함수 URL

12783 단어
AWS는 최근 Lambda를 위한 훌륭한 새 기능을 출시했습니다. AWS Lambda Function URLs

함수 URL은 Lambda 함수에 대한 작업HTTP GET을 수행하는 더 간단한 방법을 허용하므로 패턴을 대체할 것을 약속합니다.

Github repository can be found here.

CDK 초기화 및 배포



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

CDK를 설정했으면 프로젝트를 설정해야 합니다.
  • mkdir CDK_Lambda_URL && cd CDK_Lambda_URL
  • 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.

    from aws_cdk import CfnResource, Stack
    from aws_cdk import aws_lambda as _lambda
    from aws_cdk import aws_lambda_python_alpha as _lambda_python
    from constructs import Construct
    
    
    class LambdaStack(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.example_lambda = None
    
            self.build_infrastructure()
    
        def build_infrastructure(self):
            # For convenience, consolidate infrastructure construction
            self.build_lambda()
    
        def build_lambda(self):
            self.example_lambda = _lambda_python.PythonFunction(
                scope=self,
                id="ExampleLambda",
                # entry points to the directory
                entry="lambda_funcs/LambdaURL",
                # index is the file name
                index="URL_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="ExampleLambdaFunctionURL",
            )
    
            # Set up the Lambda Function URL
            CfnResource(
                scope=self,
                id="lambdaFuncUrl",
                type="AWS::Lambda::Url",
                properties={
                    "TargetFunctionArn": self.example_lambda.function_arn,
                    "AuthType": "NONE",
                    "Cors": {"AllowOrigins": ["*"]},
                },
            )
    
            # Give everyone permission to invoke the Function URL
            CfnResource(
                scope=self,
                id="funcURLPermission",
                type="AWS::Lambda::Permission",
                properties={
                    "FunctionName": self.example_lambda.function_name,
                    "Principal": "*",
                    "Action": "lambda:InvokeFunctionUrl",
                    "FunctionUrlAuthType": "NONE",
                },
            )
    
            # Get the Function URL as output
            Output(
                scope=self,
                id="funcURLOutput",
                value=cfnFuncUrl.get_att(attribute_name="FunctionUrl").to_string(),
            )
    
    
    


    최소 작동 Lambda 함수



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

    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에서 스택 배포를 볼 수 있습니다. 인프라가 상대적으로 단순하기 때문에 신속해야 합니다.

    스택의 URL 출력을 사용하거나 AWS Console에서 Lambda 함수로 이동하여 Lambda Function URL를 찾을 수 있습니다.





    함수 URL 쿼리


    Function URL를 쿼리하고 람다 함수에서 다시 응답을 받으려면 GET 또는 requests를 사용하여 Postman 요청을 보내십시오.

    좋은 웹페이지 즐겨찾기