컨테이너·워크플로우 자동화/Airflow로 워크플로우 자동화하기

[트러블슈팅] BranchOperator 이후 Task가 Skipped 되는 이유와 trigger_rule

Data Jun 2026. 1. 22. 09:36

Airflow에서 BranchOperator를 사용하면, 의도와 다르게 마지막 Task(end_task)가 Skipped 되는 상황을 자주 만나게 됩니다.
이 문제의 원인은 대부분 trigger_rule의 기본값을 그대로 사용했기 때문입니다

.

BranchOperator는 조건에 맞는 경로 하나만 실행하고, 나머지 경로는 의도적으로 Skipped 처리합니다.
문제는 그 다음입니다.

 

1. 문제의 원인: trigger_rule 기본값

Airflow의 모든 Task는 기본적으로 trigger_rule="all_success"를 사용합니다.
이 규칙은 모든 upstream task가 Success일 때만 실행됩니다.

 

2, Branch 이후 merge 지점에서 발생하는 현상

즉, 분기 구조가 다음과 같다면:

branch
 ├─ branch_a (Success)
 └─ branch_b (Skipped)
        ↓
     end_task

end_task의 관점에서는
upstream 중 하나가 Skipped이므로 조건 불만족 → end_task도 Skipped 됩니다.

 

이 동작은 버그가 아니라, Airflow가 규칙대로 정확히 실행한 결과입니다.

 

3. 해결 방법: merge 지점에 맞는 trigger_rule

이럴 때 필요한 것이 merge 지점용 trigger_rule 설정입니다.
대표적으로 가장 많이 쓰이는 규칙은 none_failed입니다.

end_task = BashOperator(
    task_id="end_task",
    bash_command="echo end",
    trigger_rule="none_failed",
)

이 규칙은 실패(Failed)만 없으면 실행되므로,
BranchOperator로 인해 발생한 Skipped는 정상 흐름으로 허용합니다.

 

비유하자면,
all_success는 “모두 참석해야 회의 시작” 이고,
none_failed는 “결석은 괜찮고 사고만 없으면 시작” 입니다.

 

Branch 이후 합류 지점에서는
전자를 쓰면 멈추고, 후자를 써야 흐름이 이어집니다.

 

4. 정리하면

BranchOperator 뒤에서 Task가 Skipped 된다면 버그가 아니라 trigger_rule=all_success 때문이며, merge 지점에는 none_failed 같은 규칙을 명시해야 합니다.