Python에서 Lambda 함수 핸들러 정의 - AWS Lambda

Python에서 Lambda 함수 핸들러 정의

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

Python에서 함수 핸들러를 생성할 때 다음과 같은 일반적인 구문을 사용합니다.

def handler_name(event, context): ... return some_value

이름 지정

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

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

  • Python 핸들러 함수의 이름.

함수 핸들러는 임의의 이름일 수 있지만 Lambda 콘솔의 기본 이름은 lambda_function.lambda_handler입니다. 이 함수 핸들러 이름은 함수 이름(lambda_handler)과, 핸들러 코드가 저장된 파일(lambda_function.py)을 나타냅니다.

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

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

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

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

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

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

작동 방식

Lambda가 함수 핸들러를 호출할 때 Lambda 런타임은 함수 핸들러에 다음 두 개의 인수를 전달합니다.

  • 첫 번째 인수는 이벤트 객체입니다. 이벤트는 처리할 Lambda 함수에 대한 데이터가 포함된 JSON 형식 문서입니다. Lambda 런타임은 이벤트를 객체로 변환한 후 함수 코드에 전달합니다. 이 객체는 일반적으로 Python dict 유형입니다. 또한 list, str, int, float 또는 NoneType 유형이 될 수 있습니다.

    이벤트 객체에는 호출 서비스의 정보가 포함됩니다. 함수를 호출할 때, 이벤트의 구조와 내용을 결정합니다. AWS 서비스는 함수를 호출할 때 이벤트 구조를 정의합니다. AWS 서비스의 이벤트에 대한 자세한 내용은 다른 AWS 서비스의 이벤트로 Lambda 간접 호출 단원을 참조하세요.

  • 두 번째 인수는 컨텍스트 객체입니다. 컨텍스트 객체는 런타임에 Lambda에 의해 함수로 전달됩니다. 이 객체는 호출, 함수 및 런타임 환경에 관한 정보를 제공하는 메서드 및 속성들을 제공합니다.

값 반환

선택적으로, 핸들러는 값을 반환할 수 있습니다. 반환된 값은 함수를 호출한 호출 유형서비스에 따라 달라집니다. 예:

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

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

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

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

참고

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

예시

다음 섹션에서는 Lambda와 함께 사용할 수 있는 Python 함수의 예를 보여줍니다. Lambda 콘솔을 사용하여 함수를 작성하는 경우 이 섹션의 함수를 실행하기 위해 .zip 아카이브 파일을 연결할 필요가 없습니다. 이러한 함수는 선택한 Lambda 런타임에 포함된 표준 Python 라이브러리를 사용합니다. 자세한 내용은 배포 패키지 단원을 참조하십시오.

메시지 반환

다음 예제에서는 lambda_handler라는 함수를 보여줍니다. 이 함수는 사용자 입력으로 이름과 성을 받고 입력으로 받은 이벤트의 데이터가 포함된 메시지를 반환합니다.

def lambda_handler(event, context): message = 'Hello {} {}!'.format(event['first_name'], event['last_name']) return { 'message' : message }

다음 이벤트 데이터를 사용하여 함수를 호출할 수 있습니다.

{ "first_name": "John", "last_name": "Smith" }

응답은 입력으로 전달된 이벤트 데이터를 보여줍니다.

{ "message": "Hello John Smith!" }

응답 구문 분석

다음 예제에서는 lambda_handler라는 함수를 보여줍니다. 이 함수는 런타임에 Lambda에 의해 전달된 이벤트 데이터를 사용합니다. JSON 응답에 반환된 AWS_REGION에서 환경 변수를 구문 분석합니다.

import os import json def lambda_handler(event, context): json_region = os.environ['AWS_REGION'] return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": json.dumps({ "Region ": json_region }) }

이벤트 데이터를 사용하여 함수를 호출할 수 있습니다.

{ "key1": "value1", "key2": "value2", "key3": "value3" }

Lambda 런타임은 초기화 중에 여러 환경 변수를 설정합니다. 런타임 시 응답에 반환되는 환경 변수에 대한 자세한 내용은 단원을 참조하세요Lambda 환경 변수를 사용하여 코드의 값 구성

이 예제의 함수는 Invoke API의 성공적인 응답(200)에 따라 달라집니다. Invoke API 상태에 대한 자세한 내용은 Invoke Response Syntax를 참조하세요.

계산 반환

다음 예제에서는 lambda_handler라는 함수를 보여줍니다. 이 함수는 사용자 입력을 받아들이고 사용자에게 계산을 반환합니다. 이 예제에 대한 자세한 내용은 aws-doc-sdk-examples GitHub 리포지토리를 참조하세요.

import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ... result = None action = event.get('action') if action == 'increment': result = event.get('number', 0) + 1 logger.info('Calculated result of %s', result) else: logger.error("%s is not a valid action.", action) response = {'result': result} return response

다음 이벤트 데이터를 사용하여 함수를 호출할 수 있습니다.

{ "action": "increment", "number": 3 }

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 함수를 만들려면 어떻게 해야 합니까? 단원을 참조하십시오.