본문 바로가기
Minding's Programming/Airflow

[Airflow] Bash Operator로 쉘 스크립트 파일 실행하기

by Minding 2024. 7. 19.
728x90
반응형

쉘 스크립트는?

  • Unix/Linux Shell 명령을 이용해 만들어지고 인터프리터에 의해 한 줄씩 처리되는 파일
    (ex. 컴파일 방식: C, Java / 인터프리터 방식: Python, Shell)
  • echo, mkdir 등 기본적인 쉘 명령어를 입력해 작성하며, 변수를 입력받거나 for/if문 및 함수도 사용 가능하다.
  • 확장자가 없어도 동작하지만 주로 파일명에 .sh 확장자를 붙임

 

왜 쉡 스크립트가 필요한가?

  • 쉘 명령어를 이용해 복잡한 로직을 처리하는 경우 함수화하여 간단히 하기 위해
    (ex. sftp를 통해 파일 받은 후 DB에 Insert & tar.gz로 압축해두기)
  • 쉘 명령어 재사용을 위해서

 

Worker 컨테이너에서 쉘 스크립트를 수행하려면?

  • 일반적으로 컨테이너에서 쉘 스크립트를 이용하지 못하는 이유
    • 컨테이너는 외부의 파일을 인식할 수 없음
    • 컨테이너 내 파일을 만들어줄 경우, 재시작시 파일이 사라짐

 

  • 해결 방법
    • /plugins 폴더 내 쉘 스크립트를 저장해 지워지지 않고 사용할 수 있도록 한다.
    • Airflow에서도 커스텀한 py파일 또는 sh파일은 해당 폴더를 이용하라고 권장.

 

Bash Operator로 쉘 스크립트 파일 실행시키기

FRUIT=$1
if [ $FRUIT == APPLE ];then
	echo "You selected Apple!"
elif [ $FRUIT == ORANGE ];then
	echo "You selected Orange!"
elif [ $FRUIT == GRAPE ];then
	echo "You selected Grape!"
else
	echo "You selected other Fruit!"
fi

 

위 코드의 간단한 sh 파일을 DAG 파일을 만들어서 실행시켜 보았다.

* 주의할 점: airflow를 실행시키기 전 chmod를 통해 해당 sh파일의 실행 권한을 먼저 설정해주어야 한다.

# 해당 파일이 있는 디렉토리 진입 후
chmod 777 select_fruit.sh

 

from airflow import DAG
import pendulum
import datetime
from airflow.operators.bash import BashOperator

with DAG(
    dag_id="dags_bash_select_fruit",
    schedule="10 0 * * 6#1", # 첫 번째 토요일 0시 10분마다
    start_date=pendulum.datetime(2023, 3, 1, tz="Asia/Seoul"),
    catchup=False
) as dag:
    
    t1_orange = BashOperator(
        task_id="t1_orange",
        bash_command="/opt/airflow/plugins/shell/select_fruit.sh ORANGE",
    )

    t2_avocado = BashOperator(
        task_id="t2_avocado",
        bash_command="/opt/airflow/plugins/shell/select_fruit.sh AVOCADO",
    )

    t1_orange >> t2_avocado

위와 같이 DAG 파일을 만든 후 이전에 했던 방식과 똑같이 Task를 실행시켜준다.

 

로그를 확인해보면 정상적으로 실행된 것을 확인할 수 있다.

728x90
반응형

댓글