본문 바로가기
클라우드/Argo

🏗️ Argo Workflows 설계 가이드: DAG vs Steps 그리고 데이터의 흐름(Artifact)

by gasbugs 2026. 1. 3.

안녕하세요! 오늘은 Argo Workflows의 핵심 설계 철학인 DAGSteps, 그리고 워크플로우 간 데이터를 주고받는 핵심 수단인 Artifact에 대해 아주 깊이 있게 다뤄보겠습니다. 🚀

이 글을 다 읽고 나면 복잡한 파이프라인을 어떤 구조로 설계해야 할지, 그리고 이전 단계의 결과물을 어떻게 다음 단계로 안전하게 전달할지 완벽하게 이해하시게 될 겁니다.

 

Argo Workflows에서 작업을 배치하는 방법은 크게 두 가지입니다. 바로 Steps(순차적)DAG(의존성 기반)입니다. 비슷해 보이지만 사용 사례와 데이터 참조 방식에서 큰 차이가 있습니다.


1. Steps: 순차적인 단계별 실행 🪜

Steps는 말 그대로 작업을 '단계별'로 나열하는 방식입니다.

✅ 어떤 경우에 사용하나요?

  • 작업의 흐름이 위에서 아래로 명확하게 흐를 때.
  • 여러 작업을 동시에 실행(병렬)하거나, 특정 그룹이 끝난 후 다음 그룹으로 넘어가야 할 때.
  • 구조가 단순하고 직관적인 파이프라인을 설계할 때.

📝 코드 예시 및 설명 (Steps)

YAML
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: steps-example-
spec:
  entrypoint: main
  templates:
  - name: main
    steps:
    - - name: step1 # 첫 번째 단계 (병렬 그룹 1)
        template: echo
        arguments: {parameters: [{name: message, value: "Step 1"}]}
    - - name: step2-a # 두 번째 단계 (병렬 실행 A)
        template: echo
        arguments: {parameters: [{name: message, value: "Step 2-A"}]}
      - name: step2-b # 두 번째 단계 (병렬 실행 B)
        template: echo
        arguments: {parameters: [{name: message, value: "Step 2-B"}]}

  - name: echo
    inputs:
      parameters: [{name: message}]
    container:
      image: alpine:latest
      command: [echo, "{{inputs.parameters.message}}"]

2. DAG: 복잡한 의존성 기반 실행 🕸️

DAG(Directed Acyclic Graph)는 작업 간의 **'의존성'**을 명시적으로 정의합니다.

✅ 어떤 경우에 사용하나요?

  • 작업들이 복잡하게 얽혀 있어 순서대로 나열하기 어려울 때.
  • 특정 작업이 여러 개의 이전 작업 결과에 의존할 때.
  • 효율적인 병렬 처리가 극도로 중요할 때 (의존성이 없는 작업은 즉시 실행됨).

📝 코드 예시 및 설명 (DAG)

YAML
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: dag-example-
spec:
  entrypoint: main
  templates:
  - name: main
    dag:
      tasks:
      - name: A
        template: echo
      - name: B
        depends: "A" # A가 성공해야 실행
        template: echo
      - name: C
        depends: "A" # A가 성공해야 실행 (B와 병렬)
        template: echo
      - name: D
        depends: "B && C" # B와 C가 모두 성공해야 실행
        template: echo

  - name: echo
    container:
      image: alpine:latest
      command: [echo, "Running task"]

3. 이전 결과(Output)를 가져오는 방식의 차이 🔄

두 방식은 변수를 참조하는 문법(Variable Scope)이 다릅니다. 이 부분을 틀리면 워크플로우가 실행되지 않으니 주의하세요!

① Steps에서 참조하기

steps.<STEP_NAME>.outputs.parameters.<PARAM_NAME> 형식을 사용합니다.

  • 예: {{steps.generate-id.outputs.parameters.id}}

② DAG에서 참조하기

tasks.<TASK_NAME>.outputs.parameters.<PARAM_NAME> 형식을 사용합니다.

  • 예: {{tasks.generate-id.outputs.parameters.id}}

💡 핵심 차이: 참조하는 접두어가 steps냐 tasks냐의 차이입니다. 구조에 맞는 올바른 키워드를 사용해야 합니다.


4. Artifact: 대용량 데이터 전달의 핵심 📦

Parameter가 짧은 문자열이나 숫자를 전달한다면, Artifact는 파일, 디렉토리, 대용량 데이터를 전달할 때 사용합니다. (S3, GCS, Minio 등 외부 저장소가 필요합니다.)

✅ Artifact의 특징

  • Input/Output: 한 단계에서 파일을 생성(outputs.artifacts)하고 다음 단계에서 이를 입력(inputs.artifacts)으로 받습니다.
  • 영속성: 파드가 삭제되어도 외부 저장소에 데이터가 남으므로 나중에 결과를 확인할 수 있습니다.

📝 실전 코드: Artifact 전달하기

YAML
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: artifact-passing-
spec:
  entrypoint: main
  templates:
  - name: main
    dag:
      tasks:
      - name: generate-file
        template: producer
      - name: consume-file
        depends: "generate-file"
        template: consumer
        arguments:
          artifacts:
          # 이전 task의 출력을 입력으로 연결
          - name: input-file
            from: "{{tasks.generate-file.outputs.artifacts.result-file}}"

  - name: producer # 파일을 만드는 템플릿
    container:
      image: alpine:latest
      command: [sh, -c]
      args: ["echo 'important data' > /tmp/out.txt"]
    outputs:
      artifacts:
      - name: result-file # 이 이름으로 아티팩트 생성
        path: /tmp/out.txt # 컨테이너 내 실제 경로

  - name: consumer # 파일을 받는 템플릿
    inputs:
      artifacts:
      - name: input-file # 입력 아티팩트 정의
        path: /tmp/in.txt # 컨테이너 내 어디에 배치할지
    container:
      image: alpine:latest
      command: [cat, /tmp/in.txt]

5. 요약 및 선택 가이드 📊

구분 Steps DAG
철학 순차적 흐름 (Sequential) 의존성 네트워크 (Dependency)
가독성 단순한 흐름에 유리 복잡한 관계 파악에 유리
변수 참조 {{steps.NAME.outputs...}} {{tasks.NAME.outputs...}}
병렬 처리 리스트의 리스트([ [A, B] ])로 정의 depends가 없으면 자동 병렬 실행

어떤 것을 선택해야 할까요?

  1. 흐름이 단순하다면 Steps를 선택하여 직관성을 높이세요.
  2. 작업 간의 선후 관계가 복잡하고, 비선형적인 파이프라인이라면 DAG가 정답입니다.
  3. 데이터가 파일 형태라면 주저 말고 Artifact를 구성하세요.

Argo Workflows의 강력함은 이러한 구조적 유연성에서 나옵니다. 여러분의 비즈니스 로직에 가장 적합한 구조를 설계해 보세요! 🛠️