Python 람다 함수
Python Lambda Function 생성기는 기존 Python 프로젝트에 람다 함수를 추가할 수 있는 기능을 제공합니다.
이 생성기는 AWS CDK 또는 Terraform 인프라 설정과 함께 새로운 Python 람다 핸들러를 생성합니다. 생성된 백엔드는 서버리스 배포를 위해 AWS Lambda를 사용하며, AWS Lambda Powertools의 Parser를 활용한 선택적 타입 안전성을 제공합니다. 로깅, AWS X-Ray 추적 및 Cloudwatch 메트릭을 포함한 관측 가능성을 위해 AWS Lambda Powertools를 설정합니다.
사용 방법
섹션 제목: “사용 방법”Lambda Function 생성
섹션 제목: “Lambda Function 생성”다음 두 가지 방법으로 새로운 Lambda Function을 생성할 수 있습니다:
- 설치 Nx Console VSCode Plugin 아직 설치하지 않았다면
- VSCode에서 Nx 콘솔 열기
- 클릭
Generate (UI)
"Common Nx Commands" 섹션에서 - 검색
@aws/nx-plugin - py#lambda-function
- 필수 매개변수 입력
- 클릭
Generate
pnpm nx g @aws/nx-plugin:py#lambda-function
yarn nx g @aws/nx-plugin:py#lambda-function
npx nx g @aws/nx-plugin:py#lambda-function
bunx nx g @aws/nx-plugin:py#lambda-function
어떤 파일이 변경될지 확인하기 위해 드라이 런을 수행할 수도 있습니다
pnpm nx g @aws/nx-plugin:py#lambda-function --dry-run
yarn nx g @aws/nx-plugin:py#lambda-function --dry-run
npx nx g @aws/nx-plugin:py#lambda-function --dry-run
bunx nx g @aws/nx-plugin:py#lambda-function --dry-run
매개변수 | 타입 | 기본값 | 설명 |
---|---|---|---|
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 |
iacProvider | string | Inherit | The preferred IaC provider. By default this is inherited from your initial selection. |
생성기 출력
섹션 제목: “생성기 출력”생성기는 프로젝트에 다음 파일들을 추가합니다:
디렉터리<module-name>
- <lambda-function>.py 함수 구현
functionPath
옵션이 제공된 경우, 생성기는 지정된 경로에 필요한 파일들을 추가합니다:
디렉터리<module-name>
디렉터리<custom-path>
- <function-name>.py 함수 구현
인프라
섹션 제목: “인프라”이 생성기는 선택한 iacProvider
기반으로 인프라를 코드 형태로 제공하므로, packages/common
디렉터리에 관련 CDK 구축 요소 또는 Terraform 모듈을 포함하는 프로젝트를 생성합니다.
공통 인프라스트럭처 코드 프로젝트의 구조는 다음과 같습니다:
디렉터리packages/common/constructs
디렉터리src
디렉터리app/ 특정 프로젝트/생성기에 종속적인 인프라를 위한 구축 요소
- …
디렉터리core/
app
내 구축 요소에서 재사용되는 일반적 구축 요소- …
- index.ts
app
의 구축 요소를 익스포트하는 진입점
- project.json 프로젝트 빌드 대상 및 구성
디렉터리packages/common/terraform
디렉터리src
디렉터리app/ 특정 프로젝트/생성기 전용 Terraform 모듈
- …
디렉터리core/
app
내 모듈에서 재사용되는 일반적 모듈- …
- project.json 프로젝트 빌드 대상 및 구성
생성기는 선택한 iacProvider
기반으로 함수를 배포하기 위한 인프라 코드를 생성합니다:
생성기는 packages/common/constructs
디렉터리에 위치한 CDK 구성을 생성합니다.
생성기는 packages/common/terraform/src/app/lambda-functions/<function-name>
디렉터리에 위치한 Terraform 모듈을 생성합니다.
함수 구현
섹션 제목: “함수 구현”주요 함수 구현은 <function-name>.py
에 있습니다. 예시:
import os
from aws_lambda_powertools import Logger, Metrics, Tracerfrom aws_lambda_powertools.metrics import MetricUnitfrom aws_lambda_powertools.utilities.parser import event_parserfrom aws_lambda_powertools.utilities.parser.models import EventBridgeModelfrom 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: 필요시 오류 응답 구현
생성기는 자동으로 다음 기능들을 설정합니다:
- 관측 가능성을 위한 AWS Lambda Powertools 통합
- 메트릭 수집
@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을 사용해 데이터 모델을 정의할 수 있습니다.
이벤트 타입을 지정하지 않으려면 eventSource
로 Any
를 선택하면 됩니다.
번들링
섹션 제목: “번들링”생성기는 uv를 사용해 Lambda 배포 패키지에 대한 Python 번들링을 자동으로 구성합니다:
pnpm nx run <project-name>:bundle
yarn nx run <project-name>:bundle
npx nx run <project-name>:bundle
bunx nx run <project-name>:bundle
이 프로세스는 다음을 사용합니다:
- Python 종속성을
requirements.txt
파일로 내보내기 위한uv export
- Lambda 배포를 위한 대상 플랫폼(
x86_64-manylinux2014
)에 종속성을 설치하기 위한uv pip install
함수 배포
섹션 제목: “함수 배포”이 생성기는 선택한 iacProvider
기반으로 CDK 또는 Terraform 인프라 코드를 생성합니다. 이를 통해 함수를 배포할 수 있습니다.
이 생성자는 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'); }}
다음 리소스가 설정됩니다:
- AWS Lambda 함수
- CloudWatch 로그 그룹
- X-Ray 트레이싱 구성
- CloudWatch 메트릭 네임스페이스
이 함수는 람다 이벤트 소스의 대상으로 사용될 수 있습니다:
다음 예제는 EventBridge를 사용해 일정에 따라 람다 함수를 호출하는 CDK 코드를 보여줍니다:
import { 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)], }); }}
이 생성기는 common/terraform
폴더에 함수 배포를 위한 Terraform 모듈을 생성합니다. Terraform 구성에서 다음과 같이 사용할 수 있습니다:
module "my_project_my_function" { source = "../../common/terraform/src/app/lambda-functions/my-project-my-function"
# Lambda 함수용 환경 변수 env = { SOME_VARIABLE = "some value" }
# 추가 IAM 정책 필요시 additional_iam_policy_statements = [ # 함수에 필요한 추가 권한 추가 ]}
다음 리소스가 설정됩니다:
- AWS Lambda 함수
- CloudWatch 로그 그룹
- X-Ray 트레이싱 구성
- CloudWatch 메트릭 네임스페이스
이 함수는 모든 람다 이벤트 소스의 대상으로 사용될 수 있습니다. 다음 예제는 EventBridge를 사용해 일정에 따라 람다 함수를 호출하는 Terraform 코드를 보여줍니다:
# 예약 실행을 위한 EventBridge 규칙resource "aws_cloudwatch_event_rule" "my_function_schedule" { name = "my-function-schedule" description = "15분마다 함수 트리거" schedule_expression = "cron(15 * * * ? *)"}
# EventBridge 타겟resource "aws_cloudwatch_event_target" "lambda_target" { rule = aws_cloudwatch_event_rule.my_function_schedule.name target_id = "MyFunctionTarget" arn = module.my_project_my_function.function_arn}
# EventBridge가 Lambda 함수 호출을 허용하는 권한resource "aws_lambda_permission" "allow_eventbridge" { statement_id = "AllowExecutionFromEventBridge" action = "lambda:InvokeFunction" function_name = module.my_project_my_function.function_name principal = "events.amazonaws.com" source_arn = aws_cloudwatch_event_rule.my_function_schedule.arn}