기본 개념
Lambda는 JavaScript, TypeScript, Python에 대한 지속성 실행 SDK를 제공합니다. 이러한 SDK는 지속성 함수를 빌드하고, 진행 중 체크포인트를 지정하고, 재시도를 처리하고, 실행 흐름을 관리하는 데 필요한 기본 요소를 제공하는 기반입니다. 전체 SDK 설명서 및 예제는 GitHub의 JavaScript/TypeScript SDK
지속성 실행
지속성 실행은 체크포인트 및 재생 메커니즘을 사용하여 비즈니스 로직 진행 상황을 추적하고, 실행을 일시 중지하고, 장애로부터 복구하는 Lambda 지속성 함수의 전체 수명 주기를 나타냅니다. 일시 중지 또는 중단 후에 함수가 재개되면 이전에 완료된 체크포인트가 재생되고 함수가 계속 실행됩니다.
수명 주기에는 특히 일시 중지 또는 장애 복구 후 실행을 완료하기 위해 여러 번의 Lambda 함수 간접 호출이 포함될 수 있습니다. 이 접근 방식을 사용하면 중단이 발생해도 안정적인 진행 상황을 유지하면서 함수를 장기간(최대 1년) 실행할 수 있습니다.
재생 작동 방식
Lambda는 함수가 실행될 때 모든 지속성 작업(단계, 대기 및 기타 작업)에 대한 실행 로그를 유지합니다. 함수를 일시 중지해야 하거나 중단이 발생하면 Lambda는 이 체크포인트 로그를 저장하고 실행을 중지합니다. 재개할 시간이 되면 Lambda는 처음부터 함수를 다시 호출하고 체크포인트 로그를 재생하여 저장된 값을 완료된 작업으로 대체합니다. 즉, 코드는 다시 실행되지만 이전에 완료된 단계는 다시 실행되지 않습니다. 저장된 결과가 대신 사용됩니다.
이 재생 메커니즘은 지속성 함수를 이해하는 데 있어 필수적입니다. 코드는 재생 중에 결정론적이어야 합니다. 즉, 동일한 입력이 주어지면 동일한 결과를 생성해야 합니다. 재생 도중 다른 값을 생성하여 비결정론적 동작을 유발할 수 있으므로 단계를 벗어나는 부작용(예: 난수 생성 또는 현재 시간 가져오기)이 있는 작업 사용은 자제합니다.
DurableContext
DurableContext는 지속성 함수가 수신하는 컨텍스트 객체입니다. 체크포인트를 생성하고 실행 흐름을 관리하는 단계 및 대기와 같은 지속성 작업에 대한 메서드를 제공합니다.
지속성 함수는 기본 Lambda 컨텍스트 대신 DurableContext를 수신합니다.
지속성 함수용 Python SDK는 동기식 메서드를 사용하며 await을 지원하지 않습니다. TypeScript SDK는 async/await을 사용합니다.
단계
단계는 기본 제공 재시도 및 자동 체크포인트 지정을 사용하여 비즈니스 로직을 실행합니다. 각 단계는 결과를 저장하고, 이를 통해 중단 후 완료된 모든 단계에서 함수가 재개될 수 있습니다.
대기 상태
대기 상태는 함수가 계속될 때까지 실행을 중지(및 충전 중지)하는 계획된 일시 중지입니다. 이 상태를 사용하여 기간, 외부 콜백 또는 특정 조건을 대기합니다.
함수에 대기가 발생하거나 일시 중지해야 하는 경우 Lambda는 체크포인트 로그를 저장하고 실행을 중지합니다. 재개할 시간이 되면 Lambda는 함수를 다시 호출하고 체크포인트 로그를 재생하여 저장된 값을 완료된 작업으로 대체합니다.
보다 복잡한 워크플로의 경우 지속성 Lambda 함수에는 동시 실행에 parallel(), 배열 처리에 map(), 중첩된 작업에 runInChildContext(), 폴링에 waitForCondition() 같은 고급 작업도 제공됩니다. 각 작업의 사용 시기에 대한 자세한 예제와 지침은 예제를 참조하세요.
기타 함수 간접 호출
간접 호출을 사용하면 지속성 함수가 다른 Lambda 함수를 직접 호출하고 결과를 기다릴 수 있습니다. 호출 함수는 간접 호출된 함수가 실행되는 동안 일시 중지되어 결과 보존을 위한 체크포인트를 생성합니다. 이를 통해 특수 함수가 특정 태스크를 처리하는 모듈식 워크플로를 빌드할 수 있습니다.
context.invoke()를 사용하여 지속성 함수 내에서 다른 함수를 직접 호출합니다. 간접 호출에 체크포인트가 지정되므로 간접 호출된 함수가 완료된 후 함수가 중단되면 함수를 다시 간접 호출하지 않고 저장된 결과로 재개됩니다.
간접 호출된 함수는 지속성 또는 표준 Lambda 함수일 수 있습니다. 지속성 함수를 간접 호출하면 직접 호출 함수는 전체 지속성 실행이 완료될 때까지 기다립니다. 이 패턴은 각 함수가 특정 도메인을 처리하는 마이크로서비스 아키텍처에서 일반적이므로 재사용 가능한 특수 함수에서 복잡한 워크플로를 구성할 수 있습니다.
참고
교차 계정 간접 호출은 지원되지 않습니다. 간접 호출된 함수는 직접 호출 함수와 동일한 AWS 계정에 있어야 합니다.
지속성 함수 구성
지속성 함수에는 실행 동작 및 데이터 보존을 제어하는 특정 구성 설정이 있습니다. 이러한 설정은 표준 Lambda 함수 구성과 별개이며 전체 지속성 실행 수명 주기에 적용됩니다.
DurableConfig 객체는 지속성 함수에 대한 구성을 정의합니다.
{ "ExecutionTimeout": Integer, "RetentionPeriodInDays": Integer }
실행 제한 시간
실행 제한 시간은 지속성 실행이 시작부터 완료까지 실행될 수 있는 시간을 제어합니다. 이는 단일 함수 간접 호출이 실행될 수 있는 기간을 제어하는 Lambda 함수 제한 시간과 다릅니다.
지속성 실행은 체크포인트, 대기 및 재생을 진행하면서 여러 Lambda 함수 간접 호출에 걸칠 수 있습니다. 실행 제한 시간은 개별 함수 간접 호출이 아닌 지속성 실행의 총 경과 시간에 적용됩니다.
차이점 이해
Lambda 함수 제한 시간(최대 15분)은 함수의 각 개별 간접 호출을 제한합니다. 지속성 실행 제한 시간(최대 1년)은 실행이 시작되는 시점부터 완료, 실패 또는 제한 시간까지의 총 시간을 제한합니다. 이 기간 동안 함수는 단계를 처리하고, 대기하고, 실패로부터 복구할 때 여러 번 간접 호출될 수 있습니다.
예를 들어, 지속성 실행 제한 시간을 24시간으로 설정하고 Lambda 함수 제한 시간을 5분으로 설정한 경우 다음이 적용됩니다.
각 함수 간접 호출은 5분 이내에 완료되어야 합니다.
전체 지속성 실행은 최대 24시간 동안 실행될 수 있습니다.
이 24시간 동안 함수가 여러 번 간접 호출될 수 있습니다.
대기 작업은 Lambda 함수 제한 시간에 포함되지 않지만 실행 제한 시간에 포함됩니다.
Lambda 콘솔, AWS CLI 또는 AWS SAM을 사용하여 지속성 함수를 생성할 때 실행 제한 시간을 구성할 수 있습니다. Lambda 콘솔에서 함수를 선택하고, 구성과 지속성 실행을 선택합니다. 실행 제한 시간 값을 초 단위로 설정합니다(기본값: 86,400초/24시간, 최소: 60초, 최대: 31,536,000초/1년).
참고
실행 제한 시간과 Lambda 함수 제한 시간은 서로 다른 설정입니다. Lambda 함수 제한 시간은 각 개별 간접 호출이 실행될 수 있는 시간을 제어합니다(최대 15분). 실행 제한 시간은 전체 지속성 실행의 총 경과 시간(최대 1년)을 제어합니다.
보존 기간
보존 기간은 지속성 실행이 완료된 후 Lambda가 실행 내역 및 체크포인트 데이터를 보존하는 기간을 제어합니다. 이 데이터에는 단계 결과, 실행 상태 및 전체 체크포인트 로그가 포함됩니다.
보존 기간이 만료된 후 Lambda는 실행 내역 및 체크포인트 데이터를 삭제합니다. 더 이상 실행 세부 정보를 검색하거나 실행을 재생할 수 없습니다. 보존 기간은 실행이 터미널 상태(SUCCEEDED, FAILED, STOPPED 또는 TIMED_OUT)에 도달하면 시작됩니다.
Lambda 콘솔, AWS CLI 또는 AWS SAM을 사용하여 지속성 함수를 생성할 때 보존 기간을 구성할 수 있습니다. Lambda 콘솔에서 함수를 선택하고, 구성과 지속성 실행을 선택합니다. 일 단위로 보존 기간 값을 설정합니다(기본값: 14일, 최소: 1일, 최대: 90일).
규정 준수 요구 사항, 디버깅 요구 사항 및 비용 고려 사항에 따라 보존 기간을 선택합니다. 보존 기간이 길수록 디버깅 및 감사에 더 많은 시간이 확보되지만 스토리지 비용은 증가합니다.