XCom과 Variable의 차이
XCom으로는 특정 DAG, 특정 schedule에 수행되는 task 간에만 데이터를 공유할 수 있었다.
Variable을 사용하면 모든 DAG에서 공통적으로 사용할 전역 변수를 등록하고 사용할 수 있다. 즉, 모든 DAG이 공유할 수 있는 전역 변수이다.
Variable 등록
Airflow UI에서 쉽게 등록할 수 있다.
실제 등록한 Variable의 key, value 값은 메타 DB variable 테이블에 저장된다.
Variable 사용
2가지 방법으로 Variable 사용이 가능하다.
- Variable 라이브러리 이용
- Jinja Template 이용 (권고)
Variable 라이브러리 이용
라이브러리를 이용해 operator 외부에서 변수를 가져오는 방법이다.
import pendulum
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.models import Variable
with DAG(
dag_id="dags_bash_with_variable",
schedule="10 9 * * *",
start_date=pendulum.datetime(2023, 12, 1, tz="Asia/Seoul"),
catchup=False
) as dag:
var_value = Variable.get('sample_key')
bash_var_1 = BashOperator(
task_id='bash_var_1',
bash_command=f'echo variable: {var_value}'
)
이 방법은 스케줄러가 주기적으로 DAG을 파싱할 때 Variable.get 개수만큼 DB 연결을 일으켜 불필요한 부하가 발생한다. 스케줄러 과부하 원인 중 하나이므로 이 방법보다는 template 변수를 이용해 operator 내부에서 가져오는 방법이 권고된다.
Jinja Template 이용
bash_var_2 = BashOperator(
task_id='bash_var_2',
bash_command='echo variable: {{ var.value.sample_key }}'
)
Jinja template 이용해 operator 내부에서 변수를 가져온다.
Variable 자동 마스킹
Variable에 password, api key 등을 등록하면 코드에 노출하지 않고 해당 변수들을 사용할 수 있다. 또한 airflow는 특정 단어가 포함되는 variable은 자동으로 마스킹 처리를 해준다.
- access_token
- api_key
- apikey
- authorization
- passphrase
- passwd
- password
- private_key
- secret
- token
Key에 위 리스트 단어를 포함하게 되면 value는 마스킹 처리되어 보이지 않는다.
bash_var_2 = BashOperator(
task_id='bash_var_2',
bash_command='echo variable: {{ var.value.api_key }}'
)
task에서 출력을 해봐도 마스킹 처리되어 출력된다.
그런데 메타 DB variable 테이블에서는 아래처럼 value가 그대로 보이므로 주의해야 한다.
마스킹되는 단어를 원하는 대로 추가할 수도 있다. config parameter 중 sensitive_var_conn_names 파라미터를 이용해 지정하거나 도커 컴포즈에서는 AIRFLOW_CORE_SENSITIVE_VAR_CONN_NAMES를 이용해 지정할 수 있다.
협업 환경에서의 Variable
Variable은 주로 협업 환경에서 표준화된 DAG을 만들기 위해 주로 사용한다. 개발자들끼리 서로 다르게 지정하지 말아야 할 값들을 전역 변수로 세팅하고 사용한다.
예로
- base_sh_dir = /opt/airflow/plugins/shell
- base_file_dir = /opt/airflow/plugins/files
- Email, Alert 메시지를 받을 담당자의 email 주소
디렉토리 경로나 email 주소 정보 등을 지정해놓고 가져와 사용한다. 코드에 작성하지 않고 variable에 등록해 사용하면 업데이트 및 관리가 쉬워진다.
'Data > Airflow' 카테고리의 다른 글
Airflow | Bash Operator에서 XCom으로 Task 간 데이터 공유 (0) | 2024.04.01 |
---|---|
Airflow | Python Operator에서 XCom으로 Task 간 데이터 공유 (0) | 2024.03.30 |
Airflow | Python Operator에서 Macro 사용 (0) | 2024.03.30 |
Airflow | Bash Operator에서 Macro 사용 (4) | 2024.02.06 |
Airflow | Python Operator에서 Template 변수 사용 (0) | 2024.02.06 |