쿠키 기본 설정 선택

당사는 사이트와 서비스를 제공하는 데 필요한 필수 쿠키 및 유사한 도구를 사용합니다. 고객이 사이트를 어떻게 사용하는지 파악하고 개선할 수 있도록 성능 쿠키를 사용해 익명의 통계를 수집합니다. 필수 쿠키는 비활성화할 수 없지만 '사용자 지정' 또는 ‘거부’를 클릭하여 성능 쿠키를 거부할 수 있습니다.

사용자가 동의하는 경우 AWS와 승인된 제3자도 쿠키를 사용하여 유용한 사이트 기능을 제공하고, 사용자의 기본 설정을 기억하고, 관련 광고를 비롯한 관련 콘텐츠를 표시합니다. 필수가 아닌 모든 쿠키를 수락하거나 거부하려면 ‘수락’ 또는 ‘거부’를 클릭하세요. 더 자세한 내용을 선택하려면 ‘사용자 정의’를 클릭하세요.

Python에서 Lambda 함수 핸들러 정의

포커스 모드
Python에서 Lambda 함수 핸들러 정의 - AWS Lambda

Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 간접 호출되면 Lambda는 핸들러 메서드를 실행합니다. 함수는 핸들러가 응답을 반환하거나 종료하거나 제한 시간이 초과될 때까지 실행됩니다.

이 페이지에서는 이름 지정 규칙, 유효한 핸들러 서명 및 코드 모범 사례를 포함하여 Python에서 Lambda 함수 핸들러를 사용하는 방법을 설명합니다. 이 페이지에는 주문에 대한 정보를 가져와서 텍스트 파일 영수증을 생성하고 해당 파일을 Amazon Simple Storage Service(Amazon S3) 버킷에 넣는 Python Lambda 함수의 예제도 포함되어 있습니다.

Python Lambda 함수 코드 예제

다음 예제 Python Lambda 함수 코드는 주문에 대한 정보를 입력으로 가져와서 텍스트 파일 영수증을 생성하고 해당 파일을 Amazon S3 버킷에 넣습니다.

예 Python Lambda 함수
import json import os import logging import boto3 # Initialize the S3 client outside of the handler s3_client = boto3.client('s3') # Initialize the logger logger = logging.getLogger() logger.setLevel("INFO") def upload_receipt_to_s3(bucket_name, key, receipt_content): """Helper function to upload receipt to S3""" try: s3_client.put_object( Bucket=bucket_name, Key=key, Body=receipt_content ) except Exception as e: logger.error(f"Failed to upload receipt to S3: {str(e)}") raise def lambda_handler(event, context): """ Main Lambda handler function Parameters: event: Dict containing the Lambda function event data context: Lambda runtime context Returns: Dict containing status message """ try: # Parse the input event order_id = event['Order_id'] amount = event['Amount'] item = event['Item'] # Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET') if not bucket_name: raise ValueError("Missing required environment variable RECEIPT_BUCKET") # Create the receipt content and key destination receipt_content = ( f"OrderID: {order_id}\n" f"Amount: ${amount}\n" f"Item: {item}" ) key = f"receipts/{order_id}.txt" # Upload the receipt to S3 upload_receipt_to_s3(bucket_name, key, receipt_content) logger.info(f"Successfully processed order {order_id} and stored receipt in S3 bucket {bucket_name}") return { "statusCode": 200, "message": "Receipt processed successfully" } except Exception as e: logger.error(f"Error processing order: {str(e)}") raise

파일은 다음 코드 섹션을 포함하고 있습니다.

  • import 블록: 이 블록을 사용하여 Lambda 함수에 필요한 라이브러리를 포함합니다.

  • SDK 클라이언트 및 로거의 전역 초기화: 핸들러 외부에 초기화 코드를 포함하면 실행 환경 재사용을 활용하여 함수 성능을 개선할 수 있습니다. 자세한 내용은 Python Lambda 함수의 코드 모범 사례 섹션을 참조하세요.

  • def upload_receipt_to_s3(bucket_name, key, receipt_content): 이 함수는 기본 lambda_handler 함수에서 직접적으로 호출하는 도우미 함수입니다.

  • def lambda_handler(event, context): 기본 애플리케이션 논리를 포함한 코드의 기본 핸들러 함수입니다. Lambda가 함수 핸들러를 간접적으로 호출하면 Lambda 런타임은 함수에 두 개의 인수, 즉 함수가 처리할 데이터가 포함된 이벤트 객체와 함수 간접 호출에 대한 정보가 포함된 컨텍스트 객체를 전달합니다.

핸들러 이름 지정 규칙

Lambda 함수를 생성할 때 정의된 함수 핸들러 이름은 다음에서 파생됩니다.

  • Lambda 핸들러 함수가 있는 파일의 이름.

  • Python 핸들러 함수의 이름.

위 예제에서 파일의 이름이 lambda_function.py인 경우 핸들러는 lambda_function.lambda_handler로 지정됩니다. 이는 Lambda 콘솔을 사용하여 생성한 함수에 지정되는 기본 핸들러 이름입니다.

콘솔에서 다른 파일 이름 또는 함수 핸들러 이름을 사용하여 함수를 생성하는 경우 기본 핸들러 이름을 편집해야 합니다.

함수 핸들러 이름 변경(콘솔)
  1. Lambda 콘솔의 함수 페이지를 열고 함수를 선택합니다.

  2. Code(코드) 탭을 선택합니다.

  3. 아래로 스크롤하여 런타임 설정 창으로 이동한 다음 편집을 선택합니다.

  4. 핸들러에서 함수 핸들러의 새 이름을 입력합니다.

  5. Save(저장)를 선택합니다.

Lambda 이벤트 객체 사용

Lambda는 함수를 간접적으로 호출할 때 이벤트 객체 인수를 함수 핸들러에 전달합니다. JSON 객체는 Lambda 함수의 가장 일반적인 이벤트 형식입니다. 이전 섹션의 코드 예제에서 함수는 다음 형식의 입력을 예상합니다.

{ "Order_id": "12345", "Amount": 199.99, "Item": "Wireless Headphones" }

함수가 다른 AWS 서비스에 의해 간접적으로 호출되는 경우 입력 이벤트도 JSON 객체입니다. 이벤트 객체의 정확한 형식은 함수를 간접적으로 호출하는 서비스에 따라 달라집니다. 특정 서비스의 이벤트 형식을 확인하려면 다른 AWS 서비스의 이벤트로 Lambda 간접 호출 장의 해당 페이지를 참조하세요.

입력 이벤트가 JSON 객체의 형태인 경우 Lambda 런타임은 객체를 Python 딕셔너리로 변환합니다. 코드의 변수에 입력 JSON의 값을 할당하려면 예제 코드에 나와 있는 것처럼 표준 Python 딕셔너리 메서드를 사용합니다.

데이터를 함수에 JSON 배열 또는 다른 유효한 JSON 데이터 유형으로 전달할 수도 있습니다. 다음 표에는 Python 런타임이 이러한 JSON 유형을 변환하는 방법이 정의되어 있습니다.

JSON 데이터 유형 Python 데이터 형식
객체 딕셔너리(dict)
배열 리스트(list)
숫자 정수(int) 또는 부동 소수점 숫자(float)
문자열 문자열(str)
불(bool)
null NoneType(NoneType)

Lambda 컨텍스트 객체 액세스 및 사용

Lambda 컨텍스트 객체에는 함수 간접 호출 및 실행 환경에 관한 정보가 포함되어 있습니다. Lambda는 간접적으로 호출될 때 컨텍스트 객체를 함수에 자동으로 전달합니다. 컨텍스트 객체를 사용하여 모니터링 목적으로 함수의 간접 호출에 대한 정보를 출력할 수 있습니다.

컨텍스트 객체는 Lambda 런타임 인터페이스 클라이언트에 정의된 Python 클래스입니다. 컨텍스트 객체 속성의 값을 반환하려면 컨텍스트 객체에서 해당 메서드를 사용합니다. 예를 들어, 다음 코드 조각은 aws_request_id 속성 값(간접 호출 요청의 식별자)을 request라는 변수에 할당합니다.

request = context.aws_request_id

Lambda 컨텍스트 객체 사용에 대해 자세히 알아보고 사용 가능한 메서드 및 속성의 전체 목록을 보려면 Lambda 컨텍스트 객체를 사용하여 Python 함수 정보 검색 섹션을 참조하세요.

Python 핸들러에 대해 유효한 핸들러 서명

Python에서 핸들러 함수를 정의할 때 함수에는 두 개의 인수가 필요합니다. 첫 번째 인수는 Lambda 이벤트 객체이고 두 번째 인수는 Lambda 컨텍스트 객체입니다. 일반적으로 이러한 입력 인수의 이름은 eventcontext이지만 원하는 이름을 지정할 수 있습니다. 단일 입력 인수로 핸들러 함수를 선언하면 Lambda가 함수 실행을 시도할 때 오류가 발생합니다. Python에서 핸들러 함수를 선언하는 가장 일반적인 방법은 다음과 같습니다.

def lambda_handler(event, context):

다음 예제와 같이 함수 선언에서 Python 유형 힌트를 사용할 수도 있습니다.

from typing import Dict, Any def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:

다른 AWS 서비스에서 생성된 이벤트 및 컨텍스트 객체에 대해 특정 AWS 유형 지정을 사용하려면 함수의 배포 패키지에 aws-lambda-typing 패키지를 추가합니다. 개발 환경에서 pip install aws-lambda-typing을 실행하여 이 라이브러리를 설치할 수 있습니다. 다음 코드 조각은 AWS 특정 유형 힌트를 사용하는 방법을 보여줍니다. 이 예제에서 예상되는 이벤트는 Amazon S3 이벤트입니다.

from aws_lambda_typing.events import S3Event from aws_lambda_typing.context import Context from typing import Dict, Any def lambda_handler(event: S3Event, context: Context) -> Dict[str, Any]:

핸들러 함수에는 Python async 함수 유형을 사용할 수 없습니다.

값 반환

선택적으로 핸들러는 값을 반환할 수 있지만, 이러한 값은 JSON 직렬화가 가능해야 합니다. 일반적인 반환 유형에는 dict, list, str, int, floatbool이 포함됩니다.

반환된 값은 함수를 간접 호출한 간접 호출 유형서비스에 따라 달라집니다. 예시:

  • RequestResponse 간접 호출 유형을 사용하여 Lambda 함수를 동기적으로 간접 호출하는 경우에는 Lambda가 Python 함수 직접 호출의 결과를 Lambda 함수를 간접 호출하는 클라이언트에 반환합니다(간접 호출 요청에 대한 HTTP 응답에서 JSON으로 직렬화됨). 예를 들어 AWS Lambda 콘솔은 RequestResponse 간접 호출 유형을 사용하기 때문에 콘솔에서 함수를 간접 호출할 때 콘솔에 반환 값이 표시됩니다.

  • 핸들러가 json.dumps로 직렬화가 불가능한 객체를 반환하는 경우 런타임에서 오류를 반환하게 됩니다.

  • None 문이 포함되지 않은 Python 함수가 묵시적으로 하는 것처럼 핸들러가 return을 반환하는 경우, 런타임은 null을 반환하게 됩니다.

  • Event 호출 유형(비동기식 호출)을 사용하는 경우에는 해당 값이 폐기됩니다.

예제 코드에서 핸들러는 다음과 같은 Python 딕셔너리를 반환합니다.

{ "statusCode": 200, "message": "Receipt processed successfully" }

Lambda 런타임은 이 딕셔너리를 직렬화하고 함수를 간접적으로 호출한 클라이언트에 JSON 문자열로 반환합니다.

참고

Python 3.9 이상 릴리스에서 Lambda는 호출의 requestId를 오류 응답에 포함합니다.

핸들러에서 AWS SDK for Python (Boto3) 사용

종종 Lambda 함수를 사용하여 다른 AWS 서비스 및 리소스와 상호 작용하는 경우가 있습니다. 이러한 리소스와 상호 작용하는 가장 간단한 방법은 AWS SDK for Python (Boto3)을 사용하는 것입니다. 모든 지원되는 Lambda Python 런타임에는 SDK for Python 버전이 포함되어 있습니다. 그러나 코드에서 SDK를 사용해야 하는 경우 함수의 배포 패키지에 SDK를 포함하는 것이 좋습니다. 배포 패키지에 SDK를 포함하면 종속성을 완벽하게 제어할 수 있으며 다른 라이브러리와 버전이 일치하지 않는 문제가 발생할 위험이 줄어듭니다. 자세한 내용은 Python의 런타임 종속 항목이전 버전과의 호환성를 참조하세요.

Lambda 함수에서 SDK for Python을 사용하려면 함수 코드 시작 부분에 있는 가져오기 블록에 다음 문을 추가합니다.

import boto3

pip install 명령을 사용하여 함수의 배포 패키지에 boto3 라이브러리를 추가합니다. .zip 배포 패키지에 종속성을 추가하는 방법에 대한 자세한 지침은 종속 항목이 있는 .zip 배포 패키지 생성 섹션을 참조하세요. 컨테이너 이미지로 배포된 Lambda 함수에 종속성을 추가하는 것에 대해 자세히 알아보려면 기본 이미지에서 이미지 생성 또는 대체 기본 이미지에서 이미지 생성 섹션을 참조하세요.

코드에서 boto3을 사용하는 경우 클라이언트를 초기화하기 위해 자격 증명을 제공할 필요가 없습니다. 예를 들어, 예제 코드에서 다음 코드 줄을 사용하여 Amazon S3 클라이언트를 초기화합니다.

# Initialize the S3 client outside of the handler s3_client = boto3.client('s3')

Python을 사용하면 Lambda가 자격 증명을 사용하여 환경 변수를 자동으로 생성합니다. boto3 SDK는 초기화 중에 함수의 환경 변수에서 이러한 자격 증명을 확인합니다.

환경 변수에 액세스

핸들러 코드에서 os.environ.get 메서드를 사용하여 환경 변수를 참조할 수 있습니다. 예제 코드에서는 다음 코드 줄을 사용하여 정의된 RECEIPT_BUCKET 환경 변수를 참조합니다.

# Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET')

코드 시작 부분에 있는 가져오기 블록에 import os 문을 포함하는 것을 잊지 마세요.

Python Lambda 함수의 코드 모범 사례

Lambda 함수를 구축할 때 코딩 모범 사례를 사용하려면 다음 목록의 지침을 준수하세요.

  • 핵심 로직에서 Lambda 핸들러를 분리합니다. 이를 통해 단위 테스트를 수행할 수 있는 더 많은 함수를 만들 수 있습니다. 예를 들어, Python에서 이는 다음과 같이 표시될 수 있습니다.

    def lambda_handler(event, context): foo = event['foo'] bar = event['bar'] result = my_lambda_function(foo, bar) def my_lambda_function(foo, bar): // MyLambdaFunction logic here
  • 함수 배포 패키지의 종속성을 제어합니다. AWS Lambda 실행 환경에는 여러 라이브러리가 포함되어 있습니다. Node.js 및 Python 런타임의 경우, 여기에는 AWS SDK가 포함됩니다. 최신 기능 및 보안 업데이트를 활성화하려면 Lambda가 주기적으로 이러한 라이브러리를 업데이트해야 합니다. 이러한 업데이트는 Lambda 함수의 동작에 사소한 변화를 가져올 수 있습니다. 함수가 사용하는 종속성을 완전히 제어하려면 모든 종속성을 배포 패키지로 패키징하세요.

  • 종속성의 복잡성을 최소화합니다. 실행 환경 시작 시 빠르게 로드되는 더 단순한 프레임워크가 권장됩니다.

  • 배포 패키지 크기를 런타임 필요에 따라 최소화합니다. 이렇게 하면 호출 전에 배포 패키지를 다운로드하고 압축을 풀 때 걸리는 시간이 단축됩니다.

  • 실행 환경 재사용을 활용하여 함수 성능을 향상시킵니다. 함수 핸들러 외부에서 SDK 클라이언트 및 데이터베이스 연결을 초기화하고 정적 자산을 /tmp 디렉토리에 로컬로 캐시합니다. 동일한 함수 인스턴스에서 처리하는 후속 간접 호출은 이러한 리소스를 재사용할 수 있습니다. 이를 통해 함수 실행 시간을 줄여 비용을 절감합니다.

    호출에서 발생할 수 있는 데이터 유출을 방지하려면 실행 환경을 사용하여 사용자 데이터, 이벤트 또는 보안과 관련된 기타 정보를 저장하지 마세요. 함수가 핸들러 내부 메모리에 저장할 수 없는 변경 가능한 상태에 의존하는 경우 각 사용자에 대해 별도의 함수 또는 별도의 함수 버전을 생성하는 것이 좋습니다.

  • 연결 유지 지시문을 사용하여 지속적인 연결을 유지하세요. Lambda는 시간이 지남에 따라 유휴 연결을 제거합니다. 함수를 호출할 때 유휴 연결을 재사용하려고 하면 연결 오류가 발생합니다. 지속적인 연결을 유지하려면 런타임과 관련된 연결 유지 지시문을 사용하세요. 예를 들어, Node.js에서 연결 유지를 이용해 연결 재사용을 참조하세요.

  • 환경 변수를 사용하여 함수에 운영 파라미터를 전달합니다. 예를 들어, Amazon S3 버킷에 기록하는 경우 기록하고 있는 버킷 이름을 하드 코딩하는 대신 환경 변수로 구성합니다.

  • Lambda 함수에서 함수가 자기 자신을 간접적으로 간접 호출하거나 함수를 다시 간접적으로 간접 호출할 수 있는 프로세스를 시작하는 재귀적 간접 호출을 사용하지 마세요. 리커시브 코드를 사용할 경우, 의도하지 않은 함수 호출이 증가하고 비용이 상승할 수 있습니다. 의도치 않게 간접 호출이 대량으로 발생하는 경우 함수의 예약된 동시성을 즉시 0으로 설정하여 코드를 업데이트하는 동안 해당 함수에 대한 모든 간접 호출을 제한합니다.

  • Lambda 함수 코드에는 문서화되지 않은 비공개 API를 사용하지 마세요. AWS Lambda 관리형 런타임의 경우, Lambda는 주기적으로 보안 및 기능 업데이트를 Lambda의 내부 API에 적용합니다. 이러한 내부 API 업데이트는 이전 버전과 호환되지 않으므로 함수가 이러한 비공개 API에 종속성을 갖는 경우 호출 실패와 같은 의도하지 않은 결과를 초래할 수 있습니다. 공개적으로 사용 가능한 API의 목록은 API 레퍼런스를 참조하세요.

  • 멱등성 코드를 작성합니다. 함수에 멱등성 코드를 작성하면 중복 이벤트가 동일한 방식으로 처리됩니다. 코드는 이벤트를 올바르게 검증하고 중복 이벤트를 정상적으로 처리해야 합니다. 자세한 내용은 멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까? 단원을 참조하십시오.

프라이버시사이트 이용 약관쿠키 기본 설정
© 2025, Amazon Web Services, Inc. 또는 계열사. All rights reserved.