Lambda에서 Durable Functions
Source: Dev.to
Durable Functions란?
Durable Functions는 AWS Lambda에서 직접 다단계 애플리케이션 및 워크플로를 구축할 수 있게 해줍니다. 콜백을 기반으로 앱을 일시 중지하고 나중에 계속 진행할 수 있으며, 검증된 Lambda 플랫폼을 그대로 사용할 수 있습니다. 이 기능은 Reinvent 2025에서 발표되었습니다.
어떻게 작동하나요?
Durable Functions는 상태, 체크포인트 및 재시도를 자동으로 관리합니다. 워크플로의 각 단계는 별개의 내구성 단계로 처리되어 시스템이 다음을 수행할 수 있게 합니다:
- 재시도 시 이미 완료된 단계를 건너뛰기.
- 내장된 재시도 및 지수 백오프를 사용해 외부 API 호출을 처리하기.
- 비동기 콜백(예: ERP 시스템) 대기 시 유휴 컴퓨팅 비용이 발생하지 않음.
- 진행하기 전에 사람의 승인을 위해 일시 중지.
Durable Functions 사용 사례
| 시나리오 | 기존 접근 방식 | Durable Functions 장점 |
|---|---|---|
| 주문 처리 – 재고 예약 → 결제 처리 → 배송 생성 | 어떤 단계가 성공했는지 추적하기 위한 맞춤 코드를 작성해야 하며, 수동으로 멱등성을 처리해야 함. | 자동 체크포인트가 중복 예약을 방지하고, 재시도가 투명하게 처리됩니다. |
| 외부 API 호출 (예: 결제 게이트웨이) | 재시도, 백오프, 오류 처리를 수동으로 구현해야 함. | 각 단계별로 구성 가능한 기본 제공 재시도 정책. |
| 비동기 ERP 연동 | 폴링이나 장시간 실행되는 Lambda 호출이 리소스를 낭비함. | 유휴 시간에 비용을 지불하지 않고 콜백을 기다릴 수 있음. |
| 인간 개입 | 맞춤형 일시 중지/재개 로직을 구축해야 함. | 계속 진행하기 전에 인간 승인을 기다리는 기능이 내장되어 있음. |
Durable Functions 만들기
Durable Functions는 Python 데코레이터를 사용하여 정의합니다:
샘플 코드
from aws_durable_execution_sdk_python import (
DurableContext,
durable_execution,
durable_step,
)
from aws_durable_execution_sdk_python.config import Duration
@durable_step
def validate_order(step_context, order_id):
step_context.logger.info(f"Validating order {order_id}")
return {"orderId": order_id, "status": "validated"}
@durable_step
def process_payment(step_context, order_id):
step_context.logger.info(f"Processing payment for order {order_id}")
return {"orderId": order_id, "status": "paid", "amount": 99.99}
@durable_step
def confirm_order(step_context, order_id):
step_context.logger.info(f"Confirming order {order_id}")
return {"orderId": order_id, "status": "confirmed"}
@durable_execution
def lambda_handler(event, context: DurableContext):
order_id = event['orderId']
# Step 1: Validate order
validation_result = context.step(validate_order(order_id))
# Step 2: Process payment
payment_result = context.step(process_payment(order_id))
# Simulate external confirmation wait
context.wait(Duration.from_seconds(10))
# Step 3: Confirm order
confirmation_result = context.step(confirm_order(order_id))
return {
"orderId": order_id,
"status": "completed",
"steps": [validation_result, payment_result, confirmation_result]
}
배포 후, Lambda 콘솔의 Durable Executions 탭에서 실행을 확인할 수 있습니다. 콘솔에는 다음이 표시됩니다:
- 단계 입력, 출력 및 로그.
- 대기 또는 콜백을 포함한 이벤트 기록.
UI는 Step Functions 콘솔과 비슷하지만, 기본 모델링 및 가시성은 다릅니다.
Step Functions와의 비교
| 속성 | Durable Functions | Step Functions |
|---|---|---|
| 개발 모델 | 명령형 (코드 우선) | 선언형 (상태 머신) |
| 최적 활용 분야 | Lambda 중심 비즈니스 로직 오케스트레이션 | 다양한 AWS 서비스 간 오케스트레이션 |
| 가시성 | CloudWatch 로그 | 시각적 그래프 및 실행 기록 |
언제 어떤 것을 사용할까
Lambda Durable Functions를 선호할 때:
- 워크플로가 주로 Lambda 기반 비즈니스 로직인 경우.
- 팀이 코드‑우선 접근 방식을 선호하고 단위 테스트 가능성이 높은 경우.
- 전체 상태 머신을 구축하지 않고도 장시간 실행·일시 중지/재개 동작이 필요한 경우.
- 시각적 워크플로 디자이너나 광범위한 서비스 통합이 필요하지 않은 경우.
Step Functions를 선호할 때:
- 워크플로가 여러 AWS 서비스 또는 외부 시스템을 오케스트레이션하는 경우.
- 시각적 가시성과 저코드 구성이 중요한 경우.
- 복잡한 분기, 사람‑인‑루프 단계, 혹은 높은 팬아웃 오케스트레이션이 있는 경우.
- 오케스트레이션(상태 머신)과 구현(Lambda/다른 서비스)을 명확히 분리하고 싶은 경우.