Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다. 함수는 핸들러가 응답을 반환하거나 종료하거나 제한 시간이 초과될 때까지 실행됩니다.
Go 핸들러 기본 사항
다음 예제에서 파일 function.rb
는 handler
라는 이름의 핸들러 메서드를 정의합니다. 핸들러 함수는 2개의 객체를 입력으로 사용하며 JSON 문서를 반환합니다.
예 function.rb
require 'json'
def handler(event:, context:)
{ event: JSON.generate(event), context: JSON.generate(context.inspect) }
end
함수 구성에서 handler
설정은 핸들러를 찾을 위치를 Lambda에 알려줍니다. 앞의 예제에서 이 설정의 올바른 값은 function.handler
입니다. 여기에는 점으로 구분된 2개의 이름 즉, 파일 이름과 핸들러 메서드의 이름이 포함됩니다.
하나의 클래스에서 핸들러 메서드를 정의할 수도 있습니다. 다음 예제에서는 process
라는 이름의 모듈에서 Handler
라는 이름의 클래스에 LambdaFunctions
라는 이름의 핸들러 메서드를 정의합니다.
예 source.rb
module LambdaFunctions
class Handler
def self.process(event:,context:)
"Hello!"
end
end
end
이 경우, 핸들러 설정은 source.LambdaFunctions::Handler.process
입니다.
핸들러가 허용하는 2개의 객체로는 호출 이벤트 및 컨텍스트가 있습니다. 해당 이벤트는 호출자가 제공하는 페이로드가 포함된 Ruby 객체입니다. 페이로드가 JSON 문서인 경우, 이벤트 객체는 Ruby 해시입니다. 그렇지 않은 경우, 이 객체는 문자열입니다. 컨텍스트 객체에는 호출, 함수 및 실행 환경에 관한 정보를 제공하는 메서드와 속성이 있습니다.
함수 핸들러는 Lambda 함수가 호출될 때마다 실행됩니다. 핸들러 외부의 정적 코드는 함수의 인스턴스당 한 번씩 실행됩니다. 핸들러가 SDK 클라이언트 및 데이터베이스 연결과 같은 리소스를 사용하는 경우, 핸들러 메서드 외부에서 그러한 리소스를 생성하면 다중 호출 시 이 리소스를 다시 사용할 수 있습니다.
함수의 각 인스턴스는 다중 호출 이벤트를 처리할 수 있으며 다만 이벤트를 한 번에 하나씩만 처리합니다. 주어진 시간에 하나의 이벤트를 처리하는 인스턴스의 수는 함수의 동시성을 나타냅니다. Lambda 실행 환경에 대한 자세한 내용은 Lambda 실행 환경 수명 주기 이해 단원을 참조하세요.
Ruby Lambda 함수의 코드 모범 사례
Lambda 함수를 구축할 때 코딩 모범 사례를 사용하려면 다음 목록의 지침을 준수하세요.
-
핵심 로직에서 Lambda 핸들러를 분리합니다. 이를 통해 단위 테스트를 수행할 수 있는 더 많은 함수를 만들 수 있습니다. 예를 들어, Ruby에서 이는 다음과 같이 표시될 수 있습니다.
def lambda_handler(event:, context:) foo = event['foo'] bar = event['bar'] result = my_lambda_function(foo:, bar:) end def my_lambda_function(foo:, bar:) // MyLambdaFunction logic here end
-
함수 배포 패키지의 종속성을 제어합니다. AWS Lambda 실행 환경에는 여러 라이브러리가 포함되어 있습니다. Ruby 런타임의 경우, 여기에는 AWS SDK가 포함됩니다. 최신 기능 및 보안 업데이트를 활성화하려면 Lambda가 주기적으로 이러한 라이브러리를 업데이트해야 합니다. 이러한 업데이트는 Lambda 함수의 동작에 사소한 변화를 가져올 수 있습니다. 함수가 사용하는 종속성을 완전히 제어하려면 모든 종속성을 배포 패키지로 패키징하세요.
-
종속성의 복잡성을 최소화합니다. 실행 환경 시작 시 빠르게 로드되는 더 단순한 프레임워크가 권장됩니다.
-
배포 패키지 크기를 런타임 필요에 따라 최소화합니다. 이렇게 하면 호출 전에 배포 패키지를 다운로드하고 압축을 풀 때 걸리는 시간이 단축됩니다. Ruby에서 작성된 함수의 경우, 배포 패키지의 일부로 전체 AWS SDK 라이브러리를 업로드하지 마세요. 대신, 필요한 SDK의 구성 요소를 선택하는 젬(예: DynamoDB 또는 Amazon S3 SDK 젬)을 선택적으로 활용합니다.
-
실행 환경 재사용을 활용하여 함수 성능을 향상시킵니다. 함수 핸들러 외부에서 SDK 클라이언트 및 데이터베이스 연결을 초기화하고 정적 자산을
/tmp
디렉토리에 로컬로 캐시합니다. 동일한 함수 인스턴스에서 처리하는 후속 호출은 이러한 리소스를 재사용할 수 있습니다. 이를 통해 함수 실행 시간을 줄여 비용을 절감합니다.호출에서 발생할 수 있는 데이터 유출을 방지하려면 실행 환경을 사용하여 사용자 데이터, 이벤트 또는 보안과 관련된 기타 정보를 저장하지 마세요. 함수가 핸들러 내부 메모리에 저장할 수 없는 변경 가능한 상태에 의존하는 경우 각 사용자에 대해 별도의 함수 또는 별도의 함수 버전을 생성하는 것이 좋습니다.
-
연결 유지 지시문을 사용하여 지속적인 연결을 유지하세요. Lambda는 시간이 지남에 따라 유휴 연결을 제거합니다. 함수를 호출할 때 유휴 연결을 재사용하려고 하면 연결 오류가 발생합니다. 지속적인 연결을 유지하려면 런타임과 관련된 연결 유지 지시문을 사용하세요. 예를 들어, Node.js에서 연결 유지를 이용해 연결 재사용을 참조하세요.
-
환경 변수를 사용하여 함수에 운영 파라미터를 전달합니다. 예를 들어, Amazon S3 버킷에 기록하는 경우 기록하고 있는 버킷 이름을 하드 코딩하는 대신 환경 변수로 구성합니다.
-
Lambda 함수에서 함수가 자기 자신을 간접적으로 호출하거나 함수를 다시 간접적으로 호출할 수 있는 프로세스를 시작하는 재귀적 호출을 사용하지 마세요. 리커시브 코드를 사용할 경우, 의도하지 않은 함수 호출이 증가하고 비용이 상승할 수 있습니다. 의도치 않게 간접 호출이 대량으로 발생하는 경우 함수의 예약된 동시성을 즉시
0
으로 설정하여 코드를 업데이트하는 동안 해당 함수에 대한 모든 간접 호출을 제한합니다. -
Lambda 함수 코드에는 문서화되지 않은 비공개 API를 사용하지 마세요. AWS Lambda 관리형 런타임의 경우, Lambda는 주기적으로 보안 및 기능 업데이트를 Lambda의 내부 API에 적용합니다. 이러한 내부 API 업데이트는 이전 버전과 호환되지 않으므로 함수가 이러한 비공개 API에 종속성을 갖는 경우 호출 실패와 같은 의도하지 않은 결과를 초래할 수 있습니다. 공개적으로 사용 가능한 API의 목록은 API 레퍼런스를 참조하세요.
-
멱등성 코드를 작성합니다. 함수에 멱등성 코드를 작성하면 중복 이벤트가 동일한 방식으로 처리됩니다. 코드는 이벤트를 올바르게 검증하고 중복 이벤트를 정상적으로 처리해야 합니다. 자세한 내용은 멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까?
단원을 참조하십시오.