멱등성 - AWS Lambda

멱등성

지속성 함수는 실행 이름을 통해 시작되는 실행에 대해 기본 멱등성을 제공합니다. 실행 이름을 제공하면 Lambda는 이를 사용하여 중복 실행을 방지하고 간접 호출 요청의 안전한 재시도를 활성화합니다. 단계에는 기본적으로 최소 1회 실행 시맨틱이 있습니다. 재생 도중 SDK는 완료된 단계를 다시 실행하지 않고 체크포인트 결과를 반환하지만 완료 전에 잠재적 재시도를 처리하려면 비즈니스 로직이 멱등성이어야 합니다.

참고

Lambda 이벤트 소스 매핑(ESM)은 시작 시 멱등성을 지원하지 않습니다. 따라서 각 간접 호출(재시도 포함)은 새로운 지속성 실행을 시작합니다. 이벤트 소스 매핑을 사용하는 멱등성 실행을 보장하려면 Powertools for AWS Lambda와 같은 함수 코드에서 멱등성 로직을 구현하거나 일반 Lambda 함수를 프록시(디스패처)로 사용하여 멱등성 키(실행 이름 파라미터)로 지속성 함수를 간접 호출합니다.

실행 이름

지속성 함수를 간접 호출할 때 실행 이름을 제공할 수 있습니다. 실행 이름은 멱등성 키 역할을 하므로 중복 실행을 생성하지 않고도 간접 호출 요청을 안전하게 재시도할 수 있습니다. 이름을 제공하지 않으면 Lambda는 고유한 실행 ID를 자동으로 생성합니다.

실행 이름은 계정과 리전 내에서 고유해야 합니다. 실행 이름이 이미 존재하는 함수를 간접 호출하는 경우 Lambda의 동작은 기존 실행의 상태와 페이로드가 일치하는지 여부에 따라 달라집니다.

멱등성 동작

다음 표에서는 실행 이름, 기존 실행 상태 및 페이로드의 일치 여부에 따라 Lambda가 간접 호출 요청을 처리하는 방법을 설명합니다.

시나리오 이름 제공 여부 기존 실행 상태 페이로드 동일 여부 동작
1 아니요 해당 사항 없음 해당 사항 없음 새 실행 시작: Lambda가 고유한 실행 ID를 생성하고 새 실행 시작
2 존재하지 않거나 보존이 만료됨 해당 사항 없음 새 실행 시작: Lambda가 제공된 이름의 새 실행 시작
3 실행 멱등성 시작: Lambda가 중복을 시작하지 않고 기존 실행 정보 반환, 동기식 간접 호출의 경우 실행 중인 실행에 다시 연결하는 역할 수행
4 실행 아니요 오류: 이 이름으로 된 실행이 이미 다른 페이로드로 실행 중이므로 Lambda에서 DurableExecutionAlreadyExists 오류 반환
5 종료(성공, 실패, 중지 또는 제한 시간 초과) 멱등성 시작: Lambda가 새 실행을 시작하지 않고 기존 실행 정보 반환, 종료된 실행 결과가 반환됨
6 종료(성공, 실패, 중지 또는 제한 시간 초과) 아니요 오류: 이 이름으로 된 실행이 이미 다른 페이로드로 완료되었으므로 Lambda에서 DurableExecutionAlreadyExists 오류 반환
Note

시나리오 3과 5는 Lambda가 중복을 생성하는 대신 기존 실행 정보를 반환하여 중복 간접 호출 요청을 안전하게 처리하는 멱등성을 보여줍니다.

단계 멱등성

단계에는 기본적으로 최소 1회 실행 시맨틱이 있습니다. 대기, 콜백 또는 실패 후 함수가 재생되면 SDK는 체크포인트 로그를 기준으로 각 단계를 확인합니다. 이미 완료된 단계의 경우 SDK는 단계 로직을 다시 실행하지 않고 체크포인트가 지정된 결과를 반환합니다. 하지만 단계가 실패하거나 단계가 완료되기 전에 함수가 중단되면 단계가 여러 번 실행될 수 있습니다.

잠재적 재시도를 처리하려면 단계로 래핑된 비즈니스 로직이 멱등성이어야 합니다. 멱등성 키를 사용하면 단계가 재시도되더라도 결제 또는 데이터베이스 쓰기와 같은 작업이 한 번만 실행됩니다.

예제: 단계에서 멱등성 키 사용

TypeScript
import { withDurableExecution, DurableContext } from '@aws/durable-execution-sdk-js'; import { randomUUID } from 'crypto'; export const handler = withDurableExecution( async (event: any, context: DurableContext) => { // Generate idempotency key once const idempotencyKey = await context.step('generate-key', async () => { return randomUUID(); }); // Use idempotency key in payment API to prevent duplicate charges const payment = await context.step('process-payment', async () => { return paymentAPI.charge({ amount: event.amount, idempotencyKey: idempotencyKey }); }); return { statusCode: 200, payment }; } );
Python
from aws_durable_execution_sdk_python import durable_execution, DurableContext import uuid @durable_execution def handler(event, context: DurableContext): # Generate idempotency key once idempotency_key = context.step( lambda _: str(uuid.uuid4()), name='generate-key' ) # Use idempotency key in payment API to prevent duplicate charges payment = context.step( lambda _: payment_api.charge( amount=event['amount'], idempotency_key=idempotency_key ), name='process-payment' ) return {'statusCode': 200, 'payment': payment}

실행 모드를 AT_MOST_ONCE_PER_RETRY로 설정하여 최대 1회 실행 시맨틱을 사용하도록 단계를 구성할 수 있습니다. 이를 통해 재시도당 최대 1회 단계가 실행되지만 단계가 완료되기 전에 함수가 중단되면 전혀 실행되지 않을 수 있습니다.

SDK는 재생 중에 해당 단계 이름과 순서가 체크포인트 로그와 일치하는지 확인하여 결정론적 재생을 적용합니다. 코드가 다른 순서로 또는 이름이 다른 단계를 실행하려고 하면 SDK에서 NonDeterministicExecutionError가 발생합니다.

다음은 완료된 단계에서 재생이 작동하는 방식입니다.

  1. 첫 번째 간접 호출: 함수가 A 단계를 실행하고, 체크포인트를 생성한 다음 대기합니다.

  2. 두 번째 간접 호출(대기 후): 함수가 처음부터 다시 재생되고, A 단계는 다시 실행하지 않고 체크포인트가 지정된 결과를 즉시 반환한 다음 B 단계를 계속합니다.

  3. 세 번째 간접 호출(추가 대기 후): 함수가 처음부터 다시 재생되고, A 단계와 B 단계가 체크포인트가 지정된 결과를 즉시 반환한 다음 C 단계를 계속합니다.

이 재생 메커니즘을 사용하면 완료된 단계가 다시 실행되지 않지만 완료 전에 재시도를 처리하려면 비즈니스 로직이 여전히 멱등성이어야 합니다.