지속성 함수를 사용한 이벤트 소스 매핑
지속성 함수는 모든 Lambda 이벤트 소스 매핑에서 작동합니다. 표준 함수에 대해 구성하는 것과 동일한 방식으로 지속성 함수에 대한 이벤트 소스 매핑을 구성합니다. 이벤트 소스 매핑은 Amazon SQS, Kinesis 및 DynamoDB Streams와 같은 이벤트 소스를 자동으로 폴링하고, 레코드 배치를 사용하여 함수를 간접 호출합니다.
이벤트 소스 매핑은 복잡한 다단계 워크플로로 스트림 또는 대기열을 처리하는 지속성 함수에 유용합니다. 예를 들어 재시도, 외부 API 직접 호출 및 인적 승인으로 Amazon SQS 메시지를 처리하는 지속성 함수를 생성할 수 있습니다.
이벤트 소스 매핑이 지속성 함수를 간접 호출하는 방법
이벤트 소스 매핑은 지속성 함수를 동기식으로 간접 호출하고, 다음 배치를 처리하거나 레코드를 처리된 것으로 표시하기 전에 전체 지속성 실행이 완료될 때까지 기다립니다. 총 지속 실행 시간이 해당 제한 시간(기본적으로 15분 또는 Lambda 관리형 인스턴스에서 실행되는 함수의 경우 최대 90분)을 초과하면 실행 시간이 초과되고 실패합니다. 이벤트 소스 매핑은 제한 시간 예외를 수신하고 재시도 구성에 따라 처리합니다.
실행 기간 한도
이벤트 소스 매핑에 의해 내구성 함수가 호출되는 경우 총 내구성 실행 기간은 최대 함수 제한 시간을 초과할 수 없습니다. 즉, 기본(온디맨드) 용량 모드에서 실행되는 함수의 경우 15분, Lambda 관리형 인스턴스에서 실행되는 함수의 경우 최대 90분(15분으로 제한되는 Amazon MQ 및 Amazon DocumentDB 이벤트 소스 매핑 제외)입니다. 이 제한은 개별 함수 간접 호출뿐만 아니라 시작부터 완료까지 지속되는 전체 실행에 적용됩니다.
이 한도는 호출당 Lambda 함수 제한 시간과 별개이지만 둘 다 동일한 최대값(기본적으로 15분 또는 비동기 및 이벤트 소스 매핑 호출의 경우 Lambda 관리형 인스턴스에서 최대 90분)이 적용됩니다. 함수 제한 시간은 각 개별 간접 호출이 실행될 수 있는 시간을 제어하는 반면, 지속성 실행 제한 시간은 실행 시작부터 완료까지의 총 경과 시간을 제어합니다.
예제 시나리오:
-
유효(모든 용량 모드): 지속성 함수는 각각 2분 정도 걸리는 3개 단계로 Amazon SQS 메시지를 처리한 다음 최종 단계를 완료하기 전에 5분을 기다립니다. 총 실행 시간은 11분입니다. 이는 기본 한도인 15분 미만이므로 두 용량 모드에서 모두 작동합니다.
-
Lambda 관리형 인스턴스에서만 유효: 지속성 함수가 Amazon SQS 메시지를 처리하고, 2분 후에 최초 처리를 완료한 다음 외부 콜백이 완료될 때까지 20분 동안 기다립니다. 총 실행 시간은 22분입니다. 이는 기본 한도인 15분을 초과하지만 Lambda 관리형 인스턴스에서 실행되는 함수의 경우 90분 한도 내에 있습니다.
-
유효하지 않음(모든 용량 모드): 지속성 함수가 Kinesis 레코드를 처리하고 단계 사이에 총 2시간의 대기 작업이 포함됩니다. 이는 Lambda 관리형 인스턴스 한도인 90분을 초과하므로 용량 모드에 관계없이 실행이 실패합니다. 이렇게 긴 워크플로에는 중간 함수 패턴을 사용합니다.
중요
이벤트 소스 매핑을 사용할 때 지속성 실행 제한 시간을 해당 한도 내로 구성하세요. 그렇지 않으면 이벤트 소스 매핑 생성에 실패합니다. 한도는 기본적으로 15분 또는 Lambda 관리형 인스턴스의 경우 최대 90분입니다. 워크플로에 더 긴 실행 시간이 필요한 경우 아래에서 설명하는 중간 함수 패턴을 사용합니다.
이벤트 소스 매핑 구성
Lambda 콘솔, AWS CLI 또는 AWS SDK를 사용하여 지속성 함수에 대한 이벤트 소스 매핑을 구성합니다. 모든 표준 이벤트 소스 매핑 속성은 지속성 함수에 적용됩니다.
aws lambda create-event-source-mapping \ --function-name arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1 \ --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \ --batch-size 10 \ --maximum-batching-window-in-seconds 5
지속성 함수에 대한 이벤트 소스 매핑을 구성할 때는 정규화된 ARN(버전 번호 또는 별칭 포함)을 사용해야 합니다.
이벤트 소스 매핑을 사용한 오류 처리
이벤트 소스 매핑은 지속성 함수와 함께 작동하는 기본 오류 처리를 제공합니다.
-
재시도 동작: 최초 간접 호출이 실패하면 이벤트 소스 매핑이 재시도 구성에 따라 재시도됩니다. 요구 사항에 따라 최대 재시도 횟수 및 재시도 간격을 구성합니다.
-
Dead Letter Queue(DLQ): 모든 재시도 후 실패한 레코드를 캡처하도록 Dead Letter Queue(DLQ)를 구성합니다. 이를 통해 메시지가 손실되지 않고 실패한 레코드를 수동으로 검사할 수 있습니다.
-
부분 배치 실패: Amazon SQS 및 Kinesis의 경우 부분 배치 실패 보고를 사용하여 레코드를 개별적으로 처리하고 실패한 레코드만 재시도합니다.
-
오류 시 bisect: Kinesis 및 DynamoDB Streams의 경우 오류 시 bisect를 활성화하여 실패한 배치를 분할하고 문제가 있는 레코드를 격리합니다.
참고
지속성 함수는 오류 처리에 Dead Letter Queue(DLQ)를 지원하지만 Lambda 대상은 지원하지 않습니다. 실패한 간접 호출에서 레코드를 캡처하도록 DLQ를 구성합니다.
이벤트 소스 매핑 오류 처리에 대한 자세한 내용은 이벤트 소스 매핑을 참조하세요.
장기 실행 워크플로에 중간 함수 사용
워크플로에 적용 가능한 이벤트 소스 매핑 한도(기본적으로 15분 또는 Lambda 관리형 인스턴스의 경우 90분) 이상이 필요한 경우 이벤트 소스 매핑과 내구성 함수 사이에 중간 표준 Lambda 함수를 사용합니다. 중간 함수는 이벤트 소스 매핑에서 이벤트를 수신하고 지속성 함수를 비동기식으로 간접 호출하여 실행 기간 한도를 제거합니다.
이 패턴은 이벤트 소스 매핑의 동기식 간접 호출 모델을 지속성 함수의 장기 실행 모델에서 분리합니다. 이벤트 소스 매핑은 지속성 실행을 시작한 후 빠르게 반환되는 중간 함수를 호출합니다. 그런 다음 지속성 함수는 필요한 기간(최대 1년) 동안 독립적으로 실행됩니다.
아키텍처
중간 함수 패턴은 다음 3가지 구성 요소를 사용합니다.
-
이벤트 소스 매핑: 이벤트 소스(Amazon SQS, Kinesis, DynamoDB Streams)를 폴링하고 레코드 배치와 동기식으로 중간 함수를 간접 호출합니다.
-
중간 함수: 이벤트 소스 매핑에서 이벤트를 수신하고, 필요한 경우 데이터를 검증 및 변환하고, 지속성 함수를 비동기식으로 간접 호출하는 표준 Lambda 함수입니다. 이 함수는 빠르게 완료되고(일반적으로 1초 미만) 이벤트 소스 매핑에 제어 권한을 반환합니다.
-
지속성 함수: 장기간 실행할 수 있는 복잡한 다단계 로직으로 이벤트를 처리합니다. 비동기적으로 호출되므로 이벤트 소스 매핑 실행 기간 한도에 의해 제한되지 않습니다.
구현
중간 함수는 이벤트 소스 매핑에서 전체 이벤트를 수신하고 지속성 함수를 비동기식으로 간접 호출합니다. 실행 이름 파라미터를 사용하여 멱등성 실행이 시작되도록 하면 이벤트 소스 매핑이 재시도되는 경우 중복 처리를 방지합니다.
중간 함수 자체의 멱등성의 경우 Powertools for AWS Lambda를 사용하면 이벤트 소스 매핑에서 중간 함수를 재시도할 때 지속성 함수의 중복 간접 호출을 방지합니다.
지속성 함수는 실행 이름이 포함된 페이로드를 수신하고 장기 실행 로직으로 모든 레코드를 처리합니다.
주요 고려 사항
이 패턴은 이벤트 소스 매핑을 지속성 실행에서 분리하여 이벤트 소스 매핑 실행 기간 한도를 없앱니다. 중간 함수는 지속성 실행을 시작한 직후 반환되므로 이벤트 소스 매핑에서 처리가 계속될 수 있습니다. 이후 지속성 함수는 필요한 기간 동안 독립적으로 실행됩니다.
중간 함수는 지속성 실행이 완료될 때가 아니라 지속성 함수를 간접 호출할 때 성공합니다. 지속성 실행이 나중에 실패하면 이미 배치를 성공적으로 처리했기 때문에 이벤트 소스 매핑이 재시도되지 않습니다. 지속성 함수에서 오류 처리를 구현하고 실패한 실행에 대해 Dead Letter Queue(DLQ)를 구성합니다.
멱등성 실행이 시작되도록 실행 이름 파라미터를 사용합니다. 이벤트 소스 매핑이 중간 함수를 재시도하면 실행 이름이 이미 존재하므로 지속성 함수가 중복 실행을 시작하지 않습니다.
지원되는 이벤트 소스
지속성 함수는 이벤트 소스 매핑을 사용하는 모든 Lambda 이벤트 소스를 지원합니다.
Amazon SQS 대기열(표준 및 FIFO)
Kinesis 스트림
DynamoDB Streams
Amazon Managed Streaming for Apache Kafka(Amazon MSK)
자체 관리형 Apache Kafka
Amazon MQ(ActiveMQ 및 RabbitMQ)
Amazon DocumentDB 변경 스트림
모든 이벤트 소스 유형에는 지속성 함수 간접 호출 시 앞서 설명한 지속성 실행 한도(기본값 15분)가 적용됩니다. Lambda 관리형 인스턴스에서는 이러한 이벤트 소스의 한도가 90분으로 증가합니다. 단, Amazon MQ 및 Amazon DocumentDB는 15분으로 제한됩니다.