AWS CDK(Python)를 사용하여 API Gateway + Lambda에서 POST 수신

AWS CDK와는 대단히 말하면, AWS상에서 구축하는 어플리케이션의 설계서(CloudFormation)를 프로그래밍 언어로 써 버리자는 것.
이 기사에서는 POST 된 JSON을 API Gateway를 통해 Lambda에서 처리하는 간단한 흐름을 Python을 사용하여 구현합니다.
AWS CDK를 사용할 수 있도록 설정하려면 아래 공식 문서 등을 참조하십시오.
  • Getting started with the AWS CDK

  • AWS CDK Workshop

  • 절차



    먼저 적절한 디렉토리를 만들고 다음 cdk.json를 만듭니다.

    cdk.json
    {
      "app": "python3 app.py"
    }
    

    그런 다음 그 디렉토리에 새로운 디렉토리 (예 : lambda)를 만들고 그 안에 Lambda의 함수를 만듭니다 (여기서는 webhook.py). 단순히 요청 본문 부분의 JSON을 그대로 반환하는 함수입니다.

    lambda/webhook.py
    import json
    
    def handler(event, content):
        try:
            body = event.get("body")
            print(body)
            status_code = 200
        except Exception as e:
            status_code = 500
            body = {"description": str(e)}
        return {
            "statusCode": status_code,
            "headers": {
                "Content-Type": "text/plain"
            },
            "body": json.dumps(body)
        }
    

    마지막으로 원래 디렉토리로 돌아가서 혼마루의 앱을 정의해 갑니다( app.py ).

    app.py
    import os
    from aws_cdk import (
        core,
        aws_lambda as _lambda,
        aws_apigateway as apigw
    )
    
    class PrintPostStack(core.Stack):
    
        def __init__(self, scope: core.App, name: str, **kwargs) -> None:
            super().__init__(scope, name, **kwargs)
    
            lambda_func = _lambda.Function(
                self, "PrintPostFunc",
                code=_lambda.Code.from_asset("lambda"),
                handler="webhook.handler",
                runtime=_lambda.Runtime.PYTHON_3_7,
            )
    
            api = apigw.RestApi(self, "PrintPostApi")
            api.root.add_method("POST", apigw.LambdaIntegration(lambda_func))
    
    app = core.App()
    
    PrintPostStack(
        app, "PrintPostStack",
        env={
            "region": os.environ["CDK_DEFAULT_REGION"],
            "account": os.environ["CDK_DEFAULT_ACCOUNT"]
        }
    )
    app.synth()
    
  • Stack은 빌드되는 AWS 리소스 전체 집합을 가리키는 용어입니다.
  • lambda_func 에서 Lambda 함수를 설정합니다.
  • code=_lambda.Code.from_asset("lambda") 는 Lambda 함수 파일이 lambda 디렉토리에 있다는 것을
  • handler="webhook.handler"webhook.pyhandler
  • runtime=_lambda.Runtime.PYTHON_3_7는 파이썬 3.7을 사용합니다.

  • api 에서 API Gateway를 구성 중입니다.
  • api.root.add_method("POST", apigw.LambdaIntegration(lambda_func))에서 POST 메서드를 추가, lambda_func와 통합


  • 이상입니다. 그리고는 아래의 명령으로 배포할 뿐.
    $ cdk deploy
    

    성공하면 엔드포인트 URL이 표시됩니다. cURL 명령으로 적절한 JSON을 POST하고 응답을 확인해 봅시다.
    $ curl -X POST \
    > -H "Content-Type: application/json" \ 
    > -d '{"Key1":"Value1", "Key2":"Value2"}' \
    > https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
    
    "{\"Key1\":\"Value1\", \"Key2\":\"Value2\"}"
    

    위와 같이 JSON이 그대로 돌아오면 성공입니다.

    또, webhook.py 에서는 리퀘스트 바디부를 print(body) 하고 있습니다. 이 로그는 CloudWatch에서 확인할 수 있습니다. AWS 콘솔 > 서비스에서 CloudWatch를 찾아 클릭한 다음 로그 > 로그 그룹에서 PrintPostStack 라는 이름의 로그를 확인합니다. 다음과 같이 JSON이 표시되어야합니다.


    이상입니다! 매우 간단한 API Gateway + Lambda를 통해 AWS CDK를 소개해 보았습니다.
    이하의 공식의 예도 참고가 된다고 생각하므로 봐 주세요.
  • AWS CDK Intro Workshop > Python Workshop
  • htps : // 기주 b. 코 m / 아 ws-sa mp ぇ s / 아 ws-cdk - 에 mp ぇ s
  • 좋은 웹페이지 즐겨찾기