본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
AWS Step Functions; Step Functions
여러 AWS 서비스 호출을 상태 머신으로 엮어 순서·분기·병렬·재시도·대기를 관리하는 AWS의 서버리스 워크플로 오케스트레이션 서비스

Step Functions는 "주문 검증 → 결제 → 재고 차감 → 배송 요청"처럼 여러 단계로 이루어진 업무 흐름을 코드 대신 상태 머신 정의로 관리한다. 각 단계에서 Lambda 함수를 부르거나 DynamoDB, SQS, ECS, Glue, SageMaker 같은 서비스 API를 직접 호출하고, 실패하면 재시도하거나 보상 단계로 넘어간다. 실행 상태와 이력은 서비스가 보관하므로 함수끼리 서로 호출하며 상태를 넘기는 복잡한 코드가 필요 없다. 흐름은 콘솔의 Workflow Studio에서 그림으로 확인하고 편집할 수 있다. 상태 머신 개념 자체는 유한 오토마타 문서를 참고한다.

Step Functions 워크플로(상태 머신) 예
항목 설명
상태 머신 워크플로 정의. Amazon States Language(ASL)라는 JSON 기반 언어로 작성한다.
상태 상태 머신의 단계. 이름, Type, 다음 상태(Next) 또는 종료 여부를 가진다.
실행 상태 머신을 입력 JSON으로 한 번 돌린 것
데이터 처리 상태 사이에 JSON을 넘기며, JSONata 또는 JSONPath로 입력·출력을 걸러 내거나 변환한다.
크기 한도 작업·상태·실행의 입력과 출력은 각각 256KiB까지. 큰 데이터는 S3에 두고 경로만 넘긴다.
실행 역할 상태 머신이 다른 서비스를 호출할 때 쓰는 IAM 역할
상태 하는 일
Task 일 하나를 수행. Lambda 호출, AWS 서비스 API 호출, HTTPS API 호출, 액티비티(외부 작업자) 대기
Choice 입력 값에 따라 다음 상태를 고르는 분기
Parallel 여러 분기를 동시에 실행하고 모두 끝나면 결과를 합침
Map 입력 배열(또는 S3의 대량 데이터)의 항목마다 같은 단계를 반복 실행. 분산 모드는 항목마다 하위 워크플로를 띄워 대규모 병렬 처리
Wait 지정한 시간이나 시각까지 대기
Pass 입력을 그대로 넘기거나 고정 값을 추가·변환
Succeed / Fail 실행을 성공 또는 실패로 끝냄

표준 워크플로와 Express 워크플로

편집 원본 편집
구분 표준(Standard) Express
최대 실행 시간 1년 5분
실행 보장 정확히 1회 실행 비동기 Express는 최소 1회, 동기 Express는 최대 1회
요금 상태 전이 횟수 기준 실행 횟수, 실행 시간, 메모리 사용량 기준
실행 이력 Step Functions가 보관(종료 후 90일), 콘솔에서 시각적 디버깅 서비스가 보관하지 않음. CloudWatch Logs 로깅을 켜서 확인
서비스 통합 패턴 요청-응답, 작업 실행(.sync), 콜백 대기(.waitForTaskToken) 모두 지원 요청-응답만 지원(.sync, 콜백 미지원)
분산 Map, 액티비티 지원 미지원
적합한 경우 오래 걸리는 업무 흐름, 사람 승인, 결제처럼 중복 실행이 곤란한 처리, 감사 이력이 필요한 경우 초당 수많은 이벤트를 짧게 처리하는 IoT 수집, 스트리밍 변환, 모바일 백엔드

Express 워크플로는 같은 단계가 다시 실행될 수 있으므로 각 단계를 멱등하게 설계해야 한다.

상태에서 오류가 나면 기본적으로 실행 전체가 실패한다. Task, Parallel, Map 상태에는 Retry와 Catch를 붙여 이를 바꾼다.

  • Retry: 오류 이름(ErrorEquals)별로 첫 재시도 간격(IntervalSeconds, 기본 1초), 최대 시도 횟수(MaxAttempts, 기본 3회), 간격 배수(BackoffRate, 기본 2.0)를 지정한다. 지수 백오프가 기본 동작이다.
  • Catch: 재시도를 다 써도 실패하면 지정한 상태로 넘어간다. 실패 알림, 보상 트랜잭션(이미 한 결제 취소 등)에 쓴다.
  • States.ALL, States.Timeout, States.TaskFailed 같은 미리 정의된 오류 이름이 있다.
  • TimeoutSeconds와 HeartbeatSeconds로 응답 없는 작업을 끊는다.
{
  "StartAt": "ChargePayment",
  "States": {
    "ChargePayment": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Arguments": {
        "FunctionName": "arn:aws:lambda:us-east-1:111122223333:function:charge-payment",
        "Payload": "{% $states.input %}"
      },
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 2,
          "MaxAttempts": 3,
          "BackoffRate": 2.0
        }
      ],
      "Catch": [
        {
          "ErrorEquals": ["States.ALL"],
          "Next": "NotifyFailure"
        }
      ],
      "Next": "Done"
    },
    "NotifyFailure": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sns:publish",
      "Arguments": {
        "TopicArn": "arn:aws:sns:us-east-1:111122223333:order-failures",
        "Message": "{% $string($states.input) %}"
      },
      "Next": "Failed"
    },
    "Failed": {
      "Type": "Fail"
    },
    "Done": {
      "Type": "Succeed"
    }
  },
  "QueryLanguage": "JSONata"
}
  • 최적화된 통합: Lambda, ECS·Fargate, Batch, DynamoDB, SNS, SQS, Glue, SageMaker, EventBridge 등은 Step Functions 전용 형식으로 간단히 호출한다.
  • AWS SDK 통합: 200개가 넘는 AWS 서비스의 9,000개 이상 API 작업을 Lambda 없이 직접 호출한다.
  • HTTPS 엔드포인트: 외부 SaaS API도 Task 상태에서 호출할 수 있다.
통합 패턴 동작 예
요청-응답(기본) API 호출 응답을 받으면 바로 다음 상태로 감 SQS 메시지 보내기
작업 실행(.sync) 시작한 작업이 끝날 때까지 기다림 ECS 태스크, Glue 작업, Batch 작업 완료 대기
콜백 대기(.waitForTaskToken) 작업 토큰을 넘기고 SendTaskSuccess/SendTaskFailure로 토큰이 돌아올 때까지 멈춤 사람 승인, 외부 시스템 처리 완료 대기

사람 승인 대기 패턴

편집 원본 편집
  1. Task 상태가 .waitForTaskToken 패턴으로 SNS나 SQS에 작업 토큰이 담긴 승인 요청을 보낸다.
  2. 승인자가 이메일 링크 등을 누르면 API Gateway와 Lambda가 SendTaskSuccess(또는 SendTaskFailure)로 토큰을 돌려준다.
  3. 워크플로는 토큰이 돌아올 때까지 멈춰 있다가, 결과에 따라 Choice 상태로 다음 단계를 고른다.

대기는 표준 워크플로의 최대 실행 시간인 1년까지 가능하므로, 며칠이 걸리는 결재 흐름도 서버 없이 구현할 수 있다.

  • "여러 Lambda 함수와 서비스를 순서·분기·재시도와 함께 조율", "운영 오버헤드 최소"면 Step Functions이다. 함수끼리 서로 직접 호출하게 하는 보기는 결합도가 높아 오답인 경우가 많다.
  • 사람 승인이나 외부 시스템 응답을 기다리는 단계는 콜백 대기(.waitForTaskToken)와 표준 워크플로이다.
  • 15분을 넘는 처리는 Lambda 하나로 하지 말고 Step Functions로 단계를 나누거나 .sync로 ECS·Batch 작업을 기다린다.
  • 초당 대량의 짧은 이벤트 처리이고 비용이 중요하면 Express 워크플로, 오래 걸리거나 정확히 1회 실행·감사 이력이 필요하면 표준 워크플로이다.
  • S3에 쌓인 수많은 객체를 병렬 처리하라는 문제에는 분산 Map을 떠올린다.