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

⚡ Argo Events 완벽 가이드: Sensor, EventBus 그리고 트리거의 모든 것

by gasbugs 2026. 1. 2.
반응형

안녕하세요! Argo 생태계의 이벤트 기반 자동화 핵심, Argo Events에 대해 아주 깊이 있게 다뤄보겠습니다.

이 포스팅은 단순한 개념 설명을 넘어, 이벤트가 발생해서 실제 워크플로우가 실행되기까지의 전 과정을 설계하고 다수의 조건을 제어하는 고급 테크닉까지 상세히 담고 있습니다. 양이 많으니 집중해서 따라와 주세요! 🚀

 

현대적인 클라우드 네이티브 환경에서는 특정 사건(GitHub 푸시, S3 파일 업로드, 메시지 큐 수신 등)에 반응하여 자동으로 작업을 수행하는 이벤트 기반 아키텍처(Event-Driven Architecture)가 필수적입니다. Argo 프로젝트에서는 이를 Argo Events가 담당합니다.

오늘은 이벤트의 흐름을 결정하는 핵심 리소스들과 그 정교한 설정법을 파헤쳐 봅니다.


1. 🌊 워크플로우 트리거 순서: 이벤트의 여정

Argo Events에서 이벤트가 전달되는 흐름은 크게 3단계(또는 4단계)로 나뉩니다.

  1. EventSource: 외부의 이벤트를 감지합니다. (예: Webhook, Kafka, S3, SNS 등)
  2. EventBus: EventSource와 Sensor 사이의 운송 통로 역할을 합니다. NATS Jetstream 같은 메시징 시스템을 기반으로 동작하며, 이벤트의 안정적인 전달을 보장합니다.
  3. Sensor: EventBus를 통해 전달된 이벤트를 필터링하고 분석합니다. "조건이 맞나?"를 확인하는 두뇌 역할을 합니다.
  4. Trigger: 모든 조건이 충족되었을 때 실제로 수행할 액션을 정의합니다. (예: Argo Workflow 실행, Lambda 호출 등)

2. 🚌 EventBus: 이벤트의 고속도로

EventBus는 Argo Events 인프라의 중추입니다. 과거에는 Sensor와 EventSource가 직접 통신했지만, 이제는 EventBus를 통해 결합도를 낮추고 안정성을 높였습니다.

  • 리소스 특징: * nats 옵션을 주로 사용하며, 내부적으로 고성능 메시지 큐를 생성합니다.
    • 이벤트의 유실을 방지하고 순서를 보장합니다.
YAML
apiVersion: argoproj.io/v1alpha1
kind: EventBus
metadata:
  name: default
spec:
  nats:
    native:
      # 메시지 복제본 수를 설정하여 고가용성 보장
      replicas: 3
      # 데이터 보관을 위한 퍼시스턴트 볼륨 설정
      auth: token

3. 🧠 Sensor: 정교한 필터링과 논리 제어

Sensor는 가장 복잡하고 중요한 리소스입니다. 단순히 이벤트를 받는 것을 넘어, 여러 이벤트를 조합하거나 특정 조건이 맞을 때만 트리거를 실행하도록 설계할 수 있습니다.

🔍 Filters와 expr (Expression) 사용하기

단순히 "이벤트가 왔다"는 것만으로 부족할 때가 있습니다. "GitHub 푸시 중에서 main 브랜치일 때만" 혹은 "JSON 데이터의 특정 값이 100 이상일 때만" 실행하고 싶을 때 filters와 expr을 사용합니다.

  • data: 페이로드의 특정 필드 값 비교.
  • expr: 복잡한 논리식(비교, 연산) 처리.

⛓️ 다수의 조건 설정 (Dependencies)

여러 개의 EventSource로부터 이벤트가 모두 모여야 트리거를 실행하고 싶을 때 dependencies를 활용합니다.


4. 🛠️ 실무 코드 예제: 다중 조건 및 필터링 Sensor

아래 코드는 두 가지 이벤트(Webhook A와 Webhook B)가 모두 발생하고, 특정 조건이 맞을 때만 Argo Workflow를 실행하는 고급 설정 예시입니다.

YAML
apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
  name: complex-sensor
spec:
  template:
    serviceAccountName: argo-events-sa
  # 1. 이벤트 의존성 정의 (어디서 오는 이벤트를 기다릴 것인가)
  dependencies:
    - name: dep-webhook-a
      eventSourceName: webhook-source
      eventName: endpoint-a
      # 필터 설정: 데이터 내용 검증
      filters:
        data:
          - path: "body.status"
            type: "string"
            value:
              - "confirmed" # status가 confirmed인 경우만 통과
    - name: dep-webhook-b
      eventSourceName: webhook-source
      eventName: endpoint-b

  # 2. 논리 조건 (expr): 여러 의존성의 조합 결정
  # dep-webhook-a가 성공하거나, dep-webhook-b가 성공할 때 실행하도록 설정 가능
  circuit: "dep-webhook-a && dep-webhook-b" # AND 조건: 둘 다 만족해야 함

  # 3. 트리거 정의 (무엇을 할 것인가)
  triggers:
    - template:
        name: workflow-trigger
        k8s:
          operation: create
          source:
            resource:
              apiVersion: argoproj.io/v1alpha1
              kind: Workflow
              metadata:
                generateName: event-driven-job-
              spec:
                entrypoint: main
                templates:
                  - name: main
                    container:
                      image: alpine:latest
                      command: [sh, -c]
                      # 이벤트 데이터를 워크플로우 파라미터로 전달하기
                      args: ["echo 'Event received from A and B!'"]
          # 4. Parameters: 이벤트 데이터를 리소스 정의에 주입
          parameters:
            - src:
                dependencyName: dep-webhook-a
                dataKey: body.user_id
              dest: spec.arguments.parameters.0.value # 워크플로우의 특정 위치로 전달

5. 💡 핵심 리소스 특징 정리

  1. EventSource (입력): * 특징: 다양한 프로토콜(HTTP, MQTT, Calendar 등) 지원.
    • 팁: Webhook 사용 시 Secret을 통해 보안 인증을 반드시 설정하세요.
  2. Sensor (판단): * 특징: 가장 연산 집약적인 리소스.
    • 팁: filters를 잘 활용하면 불필요한 워크플로우 실행을 줄여 비용을 절감할 수 있습니다.
  3. Trigger (출력): * 특징: Kubernetes 리소스 생성 외에도 HTTP 호출, Kafka 메시지 전송, Slack 알림 등이 가능합니다.
    • 팁: k8s 트리거 사용 시 해당 작업을 수행할 수 있는 적절한 RBAC(ServiceAccount) 권한 부여가 필수입니다.

📝 마치며

Argo Events는 단순한 자동화를 넘어 인텔리전트한 파이프라인을 구축하게 해줍니다. 오늘 배운 EventBus의 안정성, Sensor의 정교한 expr 필터링, 그리고 다중 dependencies 설정을 활용하면 어떤 복잡한 비즈니스 로직도 쿠버네티스 위에서 구현할 수 있습니다. 🏆

처음에는 하나의 Webhook으로 시작해 보세요. 점차 여러 조건을 조합해 나가며 시스템을 견고하게 만드는 재미를 느끼실 수 있을 겁니다!

반응형