지속성 함수를 사용한 이벤트 소스 매핑 - AWS Lambda

지속성 함수를 사용한 이벤트 소스 매핑

지속성 함수는 모든 Lambda 이벤트 소스 매핑에서 작동합니다. 표준 함수에 대해 구성하는 것과 동일한 방식으로 지속성 함수에 대한 이벤트 소스 매핑을 구성합니다. 이벤트 소스 매핑은 Amazon SQS, Kinesis 및 DynamoDB Streams와 같은 이벤트 소스를 자동으로 폴링하고, 레코드 배치를 사용하여 함수를 간접 호출합니다.

이벤트 소스 매핑은 복잡한 다단계 워크플로로 스트림 또는 대기열을 처리하는 지속성 함수에 유용합니다. 예를 들어 재시도, 외부 API 직접 호출 및 인적 승인으로 Amazon SQS 메시지를 처리하는 지속성 함수를 생성할 수 있습니다.

이벤트 소스 매핑이 지속성 함수를 간접 호출하는 방법

이벤트 소스 매핑은 지속성 함수를 동기식으로 간접 호출하고, 다음 배치를 처리하거나 레코드를 처리된 것으로 표시하기 전에 전체 지속성 실행이 완료될 때까지 기다립니다. 총 지속성 실행 시간이 15분을 초과하면 실행 제한 시간이 초과되고 실패합니다. 이벤트 소스 매핑은 제한 시간 예외를 수신하고 재시도 구성에 따라 처리합니다.

15분 실행 제한

이벤트 소스 매핑에 의해 지속성 함수가 간접 호출되는 경우 총 지속성 실행 기간은 15분을 초과할 수 없습니다. 이 제한은 개별 함수 간접 호출뿐만 아니라 시작부터 완료까지 지속되는 전체 실행에 적용됩니다.

이 15분 제한은 Lambda 함수 제한 시간(최대 15분)과 별개입니다. 함수 제한 시간은 각 개별 간접 호출이 실행될 수 있는 시간을 제어하는 반면, 지속성 실행 제한 시간은 실행 시작부터 완료까지의 총 경과 시간을 제어합니다.

예제 시나리오:

  • 유효: 지속성 함수는 각각 2분 정도 걸리는 3개 단계로 Amazon SQS 메시지를 처리한 다음 최종 단계를 완료하기 전에 5분을 기다립니다. 총 실행 시간은 11분입니다. 이 작업의 총합은 15분 미만이기 때문에 작동합니다.

  • 유효하지 않음: 지속성 함수가 Amazon SQS 메시지를 처리하고, 2분 후에 최초 처리를 완료한 다음 외부 콜백이 완료될 때까지 20분 동안 기다립니다. 총 실행 시간은 22분입니다. 15분 제한을 초과하고 실패합니다.

  • 유효하지 않음: 지속성 함수가 Kinesis 레코드를 처리하고 단계 사이에 총 30분의 대기 작업이 포함됩니다. 각 개별 간접 호출이 빠르게 완료되더라도 총 실행 시간은 15분을 초과합니다.

중요

이벤트 소스 매핑을 사용할 때 지속성 실행 제한 시간을 15분 이하로 구성하지 않으면 이벤트 소스 매핑 생성이 실패합니다. 워크플로에 더 긴 실행 시간이 필요한 경우 아래에서 설명하는 중간 함수 패턴을 사용합니다.

이벤트 소스 매핑 구성

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 함수를 사용합니다. 중간 함수는 이벤트 소스 매핑에서 이벤트를 수신하고 지속성 함수를 비동기식으로 간접 호출하여 15분 실행 제한을 제거합니다.

이 패턴은 이벤트 소스 매핑의 동기식 간접 호출 모델을 지속성 함수의 장기 실행 모델에서 분리합니다. 이벤트 소스 매핑은 지속성 실행을 시작한 후 빠르게 반환되는 중간 함수를 호출합니다. 그런 다음 지속성 함수는 필요한 기간(최대 1년) 동안 독립적으로 실행됩니다.

아키텍처

중간 함수 패턴은 다음 3가지 구성 요소를 사용합니다.

  1. 이벤트 소스 매핑: 이벤트 소스(Amazon SQS, Kinesis, DynamoDB Streams)를 폴링하고 레코드 배치와 동기식으로 중간 함수를 간접 호출합니다.

  2. 중간 함수: 이벤트 소스 매핑에서 이벤트를 수신하고, 필요한 경우 데이터를 검증 및 변환하고, 지속성 함수를 비동기식으로 간접 호출하는 표준 Lambda 함수입니다. 이 함수는 빠르게 완료되고(일반적으로 1초 미만) 이벤트 소스 매핑에 제어 권한을 반환합니다.

  3. 지속성 함수: 장기간 실행할 수 있는 복잡한 다단계 로직으로 이벤트를 처리합니다. 비동기식으로 간접 호출되므로 15분 제한이 적용되지 않습니다.

구현

중간 함수는 이벤트 소스 매핑에서 전체 이벤트를 수신하고 지속성 함수를 비동기식으로 간접 호출합니다. 실행 이름 파라미터를 사용하여 멱등성 실행이 시작되도록 하면 이벤트 소스 매핑이 재시도되는 경우 중복 처리를 방지합니다.

TypeScript
import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'; import { SQSEvent } from 'aws-lambda'; import { createHash } from 'crypto'; const lambda = new LambdaClient({}); export const handler = async (event: SQSEvent) => { // Invoke durable function asynchronously with execution name await lambda.send(new InvokeCommand({ FunctionName: 'arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1', InvocationType: 'Event', Payload: JSON.stringify({ executionName: event.Name, event: event }) })); return { statusCode: 200 }; };
Python
import boto3 import json import hashlib lambda_client = boto3.client('lambda') def handler(event, context): # Invoke durable function asynchronously with execution name lambda_client.invoke( FunctionName='arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1', InvocationType='Event', Payload=json.dumps({ 'executionName': execution_name, 'event': event["name"] }) ) return {'statusCode': 200}

중간 함수 자체의 멱등성의 경우 Powertools for AWS Lambda를 사용하면 이벤트 소스 매핑에서 중간 함수를 재시도할 때 지속성 함수의 중복 간접 호출을 방지합니다.

지속성 함수는 실행 이름이 포함된 페이로드를 수신하고 장기 실행 로직으로 모든 레코드를 처리합니다.

TypeScript
import { withDurableExecution, DurableContext } from '@aws/durable-execution-sdk-js'; export const handler = withDurableExecution( async (payload: any, context: DurableContext) => { const sqsEvent = payload.event; // Process each record with complex, multi-step logic const results = await context.map( sqsEvent.Records, async (ctx, record) => { const validated = await ctx.step('validate', async () => { return validateOrder(JSON.parse(record.body)); }); // Wait for external approval (could take hours or days) const approval = await ctx.waitForCallback( 'approval', async (callbackId) => { await requestApproval(callbackId, validated); }, { timeout: { hours: 48 } } ); // Complete processing return await ctx.step('complete', async () => { return completeOrder(validated, approval); }); } ); return { statusCode: 200, processed: results.getResults().length }; } );
Python
from aws_durable_execution_sdk_python import durable_execution, DurableContext import json @durable_execution def handler(payload, context: DurableContext): sqs_event = payload['event'] # Process each record with complex, multi-step logic def process_record(ctx, record): validated = ctx.step( lambda _: validate_order(json.loads(record['body'])), name='validate' ) # Wait for external approval (could take hours or days) approval = ctx.wait_for_callback( lambda callback_id: request_approval(callback_id, validated), name='approval', config=WaitForCallbackConfig(timeout_seconds=172800) # 48 hours ) # Complete processing return ctx.step( lambda _: complete_order(validated, approval), name='complete' ) results = context.map(sqs_event['Records'], process_record) return {'statusCode': 200, 'processed': len(results.get_results())}

주요 고려 사항

이 패턴은 이벤트 소스 매핑을 지속성 실행에서 분리하여 15분 실행 제한을 없앱니다. 중간 함수는 지속성 실행을 시작한 직후 반환되므로 이벤트 소스 매핑에서 처리가 계속될 수 있습니다. 이후 지속성 함수는 필요한 기간 동안 독립적으로 실행됩니다.

중간 함수는 지속성 실행이 완료될 때가 아니라 지속성 함수를 간접 호출할 때 성공합니다. 지속성 실행이 나중에 실패하면 이미 배치를 성공적으로 처리했기 때문에 이벤트 소스 매핑이 재시도되지 않습니다. 지속성 함수에서 오류 처리를 구현하고 실패한 실행에 대해 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분의 지속성 실행 제한이 적용됩니다.