AWS Lambda Durable Functions: 지속되는 워크플로우 구축

발행: (2025년 12월 4일 오전 06:33 GMT+9)
10 min read
원문: Dev.to

Source: Dev.to

Durable Functions란?

Durable Functions는 일시 중지와 재개가 가능한 Lambda 함수입니다. 함수가 콜백을 기다리거나 1시간 동안 대기하면, Lambda는 상태를 체크포인트하고 실행을 중단합니다. 재개할 시간이 되면 Lambda는 정확히 중단된 지점부터, 모든 변수와 컨텍스트를 그대로 유지한 채 다시 실행합니다.

이는 새로운 컴퓨팅 모델이 아니라, 자동 상태 관리가 추가된 일반 Lambda입니다. 일반 async/await 코드를 작성하면 됩니다. Lambda가 이를 내구성 있게 만들어 줍니다.

간단한 예제

주문을 생성하고, 5분을 기다린 뒤 알림을 보내는 워크플로우 예시입니다:

import { DurableContext, withDurableExecution } from '@aws/durable-execution-sdk-js';

export const handler = withDurableExecution(
  async (event: any, context: DurableContext) => {
    const order = await context.step('create-order', async () => {
      return createOrder(event.items);
    });

    await context.wait({ seconds: 300 });

    await context.step('send-notification', async () => {
      return sendEmail(order.customerId, order.id);
    });

    return { orderId: order.id, status: 'completed' };
  }
);

그게 전부입니다. 설정할 상태 머신도 없고, 관리할 데이터베이스도 없으며, 폴링 루프도 없습니다. 대기 중에 함수는 일시 중지되고, 유휴 상태에서는 비용이 발생하지 않으며, 5분 후 자동으로 재개됩니다.

주요 기능

  • 긴 실행 시간 – 워크플로우는 최대 1년까지 실행될 수 있습니다. 개별 호출은 여전히 15분으로 제한되지만, 워크플로우는 여러 호출에 걸쳐 계속됩니다.
  • 자동 체크포인트 – Lambda는 각 단계마다 함수 상태를 저장합니다. 오류가 발생하면 마지막 체크포인트부터 재개되며, 처음부터 다시 시작하지 않습니다.
  • 내장 재시도 – 지수 백오프와 같은 재시도 전략을 구성할 수 있습니다. 재시도 로직과 타이밍을 Lambda가 자동으로 처리합니다.
  • 콜백 대기 – 외부 이벤트가 도착할 때까지 실행을 일시 중지합니다. 인간 승인, 웹훅 응답, 비동기 API 결과 등에 적합합니다.
  • 병렬 실행 – 여러 작업을 동시에 실행하고 모두 완료될 때까지 기다릴 수 있습니다. 조정은 Lambda가 담당합니다.
  • 중첩 워크플로우 – 다른 Durable Functions를 호출해 복잡한 워크플로우를 간단한 빌딩 블록으로 구성합니다.

작동 방식: 리플레이 모델

Durable Functions는 리플레이 기반 실행 모델을 사용합니다. 함수가 재개될 때 Lambda는 처음부터 다시 실행하지만, 실제 연산을 다시 수행하는 대신 체크포인트된 결과를 사용합니다.

첫 번째 호출 – 함수가 실행되어 각 단계와 체크포인트 결과를 생성합니다.
대기 또는 콜백 – 함수가 일시 중지되고, Lambda가 상태를 저장하고 실행을 멈춥니다.
재개 – Lambda가 함수를 다시 호출하고, 처음부터 리플레이합니다.
리플레이 – 연산은 체크포인트된 결과를 즉시 반환하므로 재실행되지 않습니다.
계속 – 함수는 대기 이후의 로직을 기존 컨텍스트와 함께 진행합니다.

이 모델은 함수가 언제나 일관된 상태를 보도록 보장합니다. 연산은 결정적이어야 하며, 한 번 실행된 결과가 동일하게 재생됩니다.

자세히 보기: Understanding the Replay Model

일반적인 사용 사례

  • 승인 워크플로우 – 인간 승인을 기다렸다가 진행합니다. 사용자가 승인 또는 거부를 클릭할 때까지 함수가 일시 중지됩니다.
  • Saga 패턴 – 보상 작업을 통해 분산 트랜잭션을 조정합니다. 단계가 실패하면 이전 단계가 자동으로 롤백됩니다.
  • 예약 작업 – 특정 시간이나 간격을 기다립니다. 자정에 데이터 처리, 24시간 후 알림 전송, 5분마다 재시도 등을 구현합니다.
  • API 오케스트레이션 – 여러 API를 호출하고 재시도와 오류 처리를 수행합니다. 응답을 조정하고 부분 오류를 우아하게 처리합니다.
  • 데이터 처리 파이프라인 – 대규모 데이터를 단계별로 처리하고 체크포인트합니다. 실패 시 마지막 성공 단계부터 재개합니다.
  • 이벤트 기반 워크플로우 – 웹훅, IoT 신호, 사용자 행동 등 외부 이벤트에 반응합니다. 이벤트를 기다렸다가 도착하면 처리를 이어갑니다.

워크플로우 테스트하기

오래 실행되는 워크플로우를 테스트한다고 해서 몇 시간을 기다릴 필요는 없습니다. Durable Execution SDK에는 로컬에서 밀리초 단위로 함수를 실행할 수 있는 테스트 라이브러리가 포함되어 있습니다:

import { LocalDurableTestRunner } from '@aws/durable-execution-sdk-js-testing';

const runner = new LocalDurableTestRunner({
  handlerFunction: handler,
});

const execution = await runner.run();

expect(execution.getStatus()).toBe('SUCCEEDED');
expect(execution.getResult()).toEqual({ orderId: '123', status: 'completed' });

테스트 러너는 체크포인트를 시뮬레이션하고, 시간 기반 대기를 건너뛰며, 모든 연산을 검사할 수 있게 해줍니다. 콜백, 재시도, 실패 상황을 AWS에 배포하지 않고도 테스트할 수 있습니다.

자세히 보기: Testing Durable Functions

AWS SAM으로 배포하기

몇 가지 핵심 설정만으로 SAM을 사용해 Durable Functions를 배포할 수 있습니다:

Resources:
  OrderProcessorFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/order-processor
      Handler: index.handler
      Runtime: nodejs22.x
      DurableConfig:
        ExecutionTimeout: 900
        RetentionPeriodInDays: 7
    Metadata:
      BuildMethod: esbuild
      BuildProperties:
        EntryPoints:
          - index.ts

DurableConfig 속성은 내구성 실행을 활성화하고 워크플로우 제한 시간을 지정합니다. SAM은 체크포인트와 상태 관리를 위한 IAM 권한을 자동으로 처리합니다.

자세히 보기: Deploying Durable Functions with SAM

Durable Functions를 사용해야 할 때

  • 워크플로우가 여러 단계에 걸쳐 대기나 콜백을 포함할 때
  • 지수 백오프를 포함한 자동 재시도가 필요할 때
  • 여러 비동기 작업을 조정하고 싶을 때
  • 인간 승인이나 외부 이벤트가 필요한 프로세스일 때
  • 상태 관리를 직접 하지 않고 장기 작업을 처리하고 싶을 때
  • 설정보다 코드로 워크플로우를 정의하고 싶을 때

시작하기

  1. SDK 설치
    npm install @aws/durable-execution-sdk-js
  2. 함수 작성withDurableExecution()으로 핸들러를 래핑합니다.
  3. 내구성 연산 사용context.step(), context.wait(), context.waitForCallback() 등.
  4. 로컬 테스트LocalDurableTestRunner로 빠르게 반복 테스트합니다.
  5. SAM으로 배포 – 템플릿에 DurableConfig를 추가합니다.
  6. 실행 모니터링 – Amazon CloudWatch와 AWS X‑Ray를 활용해 가시성을 확보합니다.

추가 자료

Back to Blog

관련 글

더 보기 »

혼돈에서 코드로: ALPHALABS

밤새도록 나를 괴롭힌 문제 나는 누구나 AI 트레이딩 에이전트를 만들고, 전략을 백테스트하며, 성과를 입증할 수 있는 플랫폼을 구축하고 싶었다.

WordPress + Kiro

개요: WordPress와 Kiro AI IDE를 통합하면 콘텐츠 관리와 에이전트 개발이 만나는 효율적인 워크플로우가 열립니다. WordPress의…