콘텐츠로 이동

파이썬 람다 함수

Python Lambda Function 생성기는 기존 파이썬 프로젝트에 람다 함수를 추가할 수 있는 기능을 제공합니다.

이 생성기는 AWS CDK 인프라 설정과 함께 새로운 파이썬 람다 핸들러를 생성합니다. 생성된 백엔드는 서버리스 배포를 위해 AWS Lambda를 사용하며, AWS Lambda Powertools의 Parser를 이용한 타입 안전성을 옵션으로 제공합니다. 로깅, AWS X-Ray 추적, Cloudwatch 메트릭을 포함한 관측 가능성을 위해 AWS Lambda Powertools를 설정합니다.

다음 두 가지 방법으로 새로운 Lambda Function을 생성할 수 있습니다:

  1. 설치 Nx Console VSCode Plugin 아직 설치하지 않았다면
  2. VSCode에서 Nx 콘솔 열기
  3. 클릭 Generate (UI) "Common Nx Commands" 섹션에서
  4. 검색 @aws/nx-plugin - py#lambda-function
  5. 필수 매개변수 입력
    • 클릭 Generate
    매개변수 타입 기본값 설명
    project 필수 string - The project to add the lambda function to
    functionName 필수 string - The name of the function to add
    functionPath string - The path within the project source directory to add the function to
    eventSource string Any Optional event source model to use for the lambda function

    생성기는 프로젝트에 다음 파일들을 추가합니다:

    • 디렉터리<module-name>
      • <lambda-function>.py 함수 구현체

    생성기는 또한 packages/common/constructs 디렉토리에 배포용 CDK 구문을 생성합니다.

    functionPath 옵션이 제공된 경우, 생성기는 지정된 경로에 필요한 파일들을 추가합니다:

    • 디렉터리<module-name>
      • 디렉터리<custom-path>
        • <function-name>.py 함수 구현체

    주요 함수 구현체는 <function-name>.py에 위치합니다. 예시:

    import os
    from aws_lambda_powertools import Logger, Metrics, Tracer
    from aws_lambda_powertools.metrics import MetricUnit
    from aws_lambda_powertools.utilities.parser import event_parser
    from aws_lambda_powertools.utilities.parser.models import EventBridgeModel
    from aws_lambda_powertools.utilities.typing import LambdaContext
    os.environ["POWERTOOLS_METRICS_NAMESPACE"] = "Foo"
    os.environ["POWERTOOLS_SERVICE_NAME"] = "Foo"
    logger: Logger = Logger()
    metrics: Metrics = Metrics()
    tracer: Tracer = Tracer()
    @tracer.capture_lambda_handler
    @metrics.log_metrics
    @event_parser(model=EventBridgeModel)
    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    logger.info("Received event", extra={"event": event.model_dump() })
    metrics.add_metric(name="InvocationCount", unit=MetricUnit.Count, value=1)
    try:
    # TODO: 구현 필요
    metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1)
    # TODO: 성공 응답 구현 필요 (필요시)
    except Exception as e:
    logger.exception(e)
    metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1)
    # TODO: 에러 응답 구현 필요 (필요시)

    생성기는 자동으로 다음 기능들을 설정합니다:

    1. 관측 가능성을 위한 AWS Lambda Powertools 통합
    2. 메트릭 수집
    3. @event_parser를 이용한 타입 안전성

    AWS Lambda Powertools를 이용한 관측 가능성

    섹션 제목: “AWS Lambda Powertools를 이용한 관측 가능성”

    생성기는 AWS Lambda Powertools를 사용한 구조화된 로깅을 구성합니다.

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    logger.info("Received event", extra={"event": event.model_dump()})

    로거는 자동으로 다음을 포함합니다:

    • 이벤트 요청
    • Lambda 컨텍스트 정보
    • 콜드 스타트 표시기

    AWS X-Ray 추적이 자동으로 구성됩니다. 커스텀 서브세그먼트를 추가할 수 있습니다:

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    # 새로운 서브세그먼트 생성
    with tracer.provider.in_subsegment("function-subsegment"):
    # 로직 구현
    return ....

    CloudWatch 메트릭이 각 요청마다 자동으로 수집됩니다. 커스텀 메트릭 추가 가능:

    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    metrics.add_metric(name="NewMetric", unit=MetricUnit.Count, value=1)
    return ...

    기본 메트릭 포함 사항:

    • 호출 횟수
    • 성공/실패 횟수
    • 콜드 스타트 메트릭

    람다 함수 생성 시 eventSource를 선택한 경우, AWS Lambda Powertools의 @event_parser가 함수에 적용됩니다. 예시:

    @event_parser(model=EventBridgeModel)
    def lambda_handler(event: EventBridgeModel, context: LambdaContext):
    event.detail_type # <- IDE 자동완성 지원되는 타입 안전 접근

    이를 통해 Fast API 작업과 유사하게 Pydantic을 이용한 데이터 모델 정의가 가능합니다.

    이벤트 타입을 지정하지 않으려면 eventSourceAny를 선택하면 됩니다.

    Python Lambda Function 생성기는 common/constructs 폴더에 배포용 CDK 구문을 생성합니다. CDK 애플리케이션에서 다음과 같이 사용 가능:

    import { MyProjectMyFunction } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // 스택에 함수 추가
    const fn = new MyProjectMyFunction(this, 'MyFunction');
    }
    }

    이 구문은 다음을 설정합니다:

    1. AWS Lambda 함수
    2. CloudWatch 로그 그룹
    3. X-Ray 추적 설정
    4. CloudWatch 메트릭 네임스페이스

    이 함수는 모든 람다 이벤트 소스의 대상으로 사용 가능합니다:

    다음 예제는 Event Bridge를 이용한 스케줄 기반 람다 함수 호출을 위한 CDK 코드를 보여줍니다:

    import { EventPattern, Rule, Schedule } from 'aws-cdk-lib/aws-events';
    import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets';
    import { MyProjectMyFunction } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // 스택에 함수 추가
    const fn = new MyProjectMyFunction(this, 'MyFunction');
    // EventBridge 작업에 함수 추가
    const eventRule = new Rule(this, 'MyFunctionScheduleRule', {
    schedule: Schedule.cron({ minute: '15' }),
    targets: [new LambdaFunction(fn)],
    });
    }
    }