본문으로 건너뛰기
김신건의 로그

[AWS] Step Functions: 워크플로 오케스트레이션

· 수정 · 📖 약 2분 · 659자/단어 #aws #step-functions #workflow #orchestration #serverless
Step Functions, SFN, State Machine, ASL, Express Workflow, Standard Workflow

정의

Step Functions = 서버리스 워크플로 오케스트레이션. Amazon States Language (ASL, JSON) 으로 상태 기계 정의.
각 단계의 재시도, 에러 처리, 분기, 병렬 실행을 코드 없이 선언적으로 구성.

사용 상황

상황Step Functions 활용
주문 처리 (결제 → 재고 → 배송)Task 체인 + Catch/Retry
인간 승인 후 진행Wait for Callback
CSV 파일 행 병렬 처리Distributed Map
마이크로서비스 Saga 패턴Catch + 보상 Task
ML 파이프라인 (전처리 → 학습 → 배포)Parallel + Task
주기적 배치EventBridge Scheduler + SFN

ASL 예시

{
  "StartAt": "ValidateOrder",
  "States": {
    "ValidateOrder": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:...:validate",
      "Next": "ChargePayment",
      "Retry": [{
        "ErrorEquals": ["Lambda.ServiceException"],
        "MaxAttempts": 3,
        "BackoffRate": 2.0
      }],
      "Catch": [{
        "ErrorEquals": ["ValidationError"],
        "Next": "OrderFailed"
      }]
    },
    "ChargePayment": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:...:charge",
      "Next": "ReserveInventory",
      "Catch": [{
        "ErrorEquals": ["States.ALL"],
        "Next": "RefundPayment"
      }]
    },
    "ReserveInventory": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:...:reserve",
      "Next": "ShipOrder"
    },
    "ShipOrder": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:...:ship",
      "End": true
    },
    "OrderFailed": { "Type": "Fail", "Cause": "Validation" },
    "RefundPayment": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:...:refund",
      "Next": "OrderFailed"
    }
  }
}

시각화

flowchart TD
    Start --> Validate[ValidateOrder]
    Validate -->|성공| Charge[ChargePayment]
    Validate -->|ValidationError| Fail[OrderFailed]
    Charge -->|성공| Reserve[ReserveInventory]
    Charge -->|에러| Refund[RefundPayment]
    Reserve --> Ship[ShipOrder]
    Refund --> Fail
    Ship --> End[(End)]

자세한 saga 흐름은 saga-pattern.

State 종류

Type의미
TaskLambda, ECS, Glue, SNS, SQS 등
Choiceif-else 분기
Wait대기 (sec, timestamp)
Parallel동시 실행
Map배열 iterate
Pass데이터 변환만
Succeed / Fail종료

Parallel State

여러 브랜치를 동시에 실행, 모두 완료되면 다음 단계 진행.

{
  "Type": "Parallel",
  "Branches": [
    {
      "StartAt": "SendEmailNotification",
      "States": {
        "SendEmailNotification": {
          "Type": "Task",
          "Resource": "arn:lambda:...:email",
          "End": true
        }
      }
    },
    {
      "StartAt": "UpdateAnalytics",
      "States": {
        "UpdateAnalytics": {
          "Type": "Task",
          "Resource": "arn:lambda:...:analytics",
          "End": true
        }
      }
    }
  ],
  "Next": "Done"
}

브랜치 중 하나라도 실패하면 전체 Parallel 실패. 각 브랜치에 Catch 권장.

Choice State

{
  "Type": "Choice",
  "Choices": [
    {
      "Variable": "$.orderAmount",
      "NumericGreaterThan": 1000,
      "Next": "PremiumProcessing"
    },
    {
      "Variable": "$.paymentMethod",
      "StringEquals": "CRYPTO",
      "Next": "CryptoGateway"
    }
  ],
  "Default": "StandardProcessing"
}

Choice 는 End: trueRetry 없음. 반드시 Default 설정 권장.

Standard vs Express

StandardExpress
실행 시간최대 1년5분
가격 모델per-transitionduration
적합long-running, 인간 승인짧은 API
실행 이력90일짧음
Throughput2000/s100,000+/s

Map (배열 처리)

{
  "Type": "Map",
  "ItemsPath": "$.orders",
  "MaxConcurrency": 10,
  "Iterator": {
    "StartAt": "ProcessOne",
    "States": {
      "ProcessOne": {
        "Type": "Task",
        "Resource": "arn:lambda:...",
        "End": true
      }
    }
  }
}

수만 ~ 수십만 항목 병렬 처리.

Distributed Map (2022+)

수백만 항목까지. S3 prefix 의 모든 객체 처리 같은 큰 batch.

{
  "Type": "Map",
  "ItemReader": {
    "Resource": "arn:aws:states:::s3:getObject",
    "Parameters": {
      "Bucket": "my-bucket",
      "Key": "data/records.csv"
    }
  },
  "MaxConcurrency": 1000,
  "ToleratedFailurePercentage": 5
}

Wait for Callback

{
  "Type": "Task",
  "Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
  "Parameters": {
    "FunctionName": "manual-approval-notifier",
    "Payload": { "taskToken.$": "$$.Task.Token" }
  }
}

인간 승인 / 외부 API 응답 대기. 토큰을 외부에 넘기고 완료 알림 대기.

Saga 패턴 아키텍처

flowchart TD
    Start --> Order["주문 생성"]
    Order -->|성공| Payment["결제 처리"]
    Order -->|실패| End1["종료: 실패"]
    Payment -->|성공| Inventory["재고 예약"]
    Payment -->|실패| CancelOrder["주문 취소"]
    Inventory -->|성공| Ship["배송 처리"]
    Inventory -->|실패| RefundPay["결제 환불"]
    RefundPay --> CancelOrder
    Ship --> Done["완료"]

각 단계 실패 시 보상 트랜잭션 역순 실행. Step Functions 의 Catch 로 구현.
자세히는 saga-pattern, outbox-pattern.

모니터링

도구용도
CloudWatch Logs실행 이력, 상태 전환 로그
X-Ray각 Task 의 latency / 오류 추적
CloudWatch MetricsExecutionsStarted, ExecutionsFailed 등
# SAM/CloudFormation 에서 로깅 활성화
StateMachine:
  Type: AWS::Serverless::StateMachine
  Properties:
    Logging:
      Level: ALL
      IncludeExecutionData: true
      Destinations:
        - CloudWatchLogsLogGroup:
            LogGroupArn: !GetAtt SFNLogGroup.Arn

Step Functions vs Temporal

Step FunctionsTemporal
운영managed (AWS)self-host 또는 Temporal Cloud
코드JSON ASL언어 코드 (TS, Go, Java, …)
학습 곡선중간높음
가격per-transitionhosted 또는 자체
적합AWS-native멀티 클라우드 / 복잡 코드

흔한 함정

WARNING

  1. Retry / Catch 미정의 = 한 단계 실패 = 전체 fail. 명시 정책.
  2. Express 의 5분 한도 = 모르고 사용하면 truncation. Standard 권장 (모르면).
  3. 상태 사이 데이터 전달 너무 큼 = 256KB 한도. S3 reference 패턴 사용.
  4. 시각화만 의존 = 복잡 workflow 의 디버깅 어려움. CloudWatch Logs + X-Ray.
  5. Choice 의 Default 없음 = 매칭 실패 시 runtime error.
  6. Parallel 브랜치에서 외부 상태 변경 = 보상 트랜잭션 없으면 partial 업데이트 위험.

관련 위키

이 글의 용어 (5개)
[AWS] CloudWatch: 메트릭, 로그, 알람cloud
정의 CloudWatch = AWS 의 모니터링 + 로그 + 알람 통합 서비스. 메트릭 수집, 로그 집계, 대시보드, 알람, 이상 감지를 하나의 서비스에서 제공. 사용 상황 | …
[AWS] EventBridge: 이벤트 버스, 스케줄러, partner sourcescloud
정의 EventBridge = AWS 의 통합 event bus. 옛 CloudWatch Events 의 후계. AWS service 이벤트 + custom 이벤트 + SaaS …
[AWS] Lambda: 서버리스 함수, 트리거, 동시성cloud
정의 AWS Lambda = 서버리스 함수 실행. 이벤트 트리거 → 함수 실행 → 결과 / 비동기 처리. 서버 관리 0. 사용 상황 | 상황 | Lambda 적합성 | |---|…
[Pattern] Outbox Pattern: DB + 메시지의 원자성distributed-systems
정의 Outbox Pattern = DB 변경 + 메시지 발행 의 원자성 보장. 이중 쓰기 (dual write) 문제 의 표준 해결. 문제: Dual Write | 시나리오 |…
[Pattern] Saga: 분산 트랜잭션의 보상 흐름distributed-systems
정의 Saga = 여러 service 의 로컬 트랜잭션 을 연결한 긴 흐름. 한 단계 실패 시 이전 단계의 보상 (compensating) 트랜잭션 으로 논리적 롤백. [!IMP…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기