컴퓨터 공부/💿 Airflow

[Airflow] Python & email 오퍼레이터간 Xcom 사용

letzgorats 2023. 8. 29. 07:18

이번에는 Xcom을 이용해서 email을 전송하는 실습을 해볼까 합니다.

 

Pyython Operator의 결과값을 이용해서 Email 을 전송하는데, 중간에 Xcom을 사용해보려고 합니다.

먼저 (Python → Email 오퍼레이터 Xcom 전달)을 하기 위해서

Email 오퍼레이터는 어떤 파라미터에 Template를 쓸 수 있는지 알아봐야 합니다.

email operators에서 쓸 수 있는 템플릿 변수

공식문서를 참고해보면, 'to', 'subject', 'html_content', 'files' 파라미터가 템플릿 문법을 적용할 수 있는 변수들입니다.

 

이 중에서 실습은 'subject'와 'html_content' 의 두 가지 필드에 템플릿 문법을 사용해보겠습니다.

@task(task_id='find_dog_task')
def dog_find(**kwargs):
    from random import choice
    # choice라는 함수는 리스트나 튜플 아니면 스트링 중에 아무값이나 꺼낼 수 있도록 하는 함수입니다. 
    return choice(['Dachshund','Golden Retriever'])

send_email = EmailOperator(
    task_id='send_email',
    to = 'hockey9322@naver.com'
    subject = '{{ data_interval_end | ds }} dog_find 처리결과',
    html_content = '{{ data_intrval_end | ds }} 처리 결과 <br>
                    알루는 {{ ti.xcom_pull(task_ids="find_dog_task")}} 입니다. <br>'
)

해당 코드를 dags폴더에 dags_python_email_operator.py라는 파일을 생성해 붙여줍니다.

from airflow import DAG
import pendulum
import datetime
from airflow.decorators import task
from airflow.operators.email import EmailOperator

with DAG(
    dag_id = "dags_python_email_operator",
    schedule="0 8 1 * *",
    start_date=pendulum.datetime(2023, 8, 1, tz="UTC"),
    catchup=False
) as dag:
    
    @task(task_id='find_dog_task')
    def dog_find(**kwargs):
        from random import choice
        # choice라는 함수는 리스트나 튜플 아니면 스트링 중에 아무값이나 꺼낼 수 있도록 하는 함수입니다. 
        return choice(['Dachshund','Golden Retriever'])

    send_email = EmailOperator(
        task_id='send_email',
        to = 'hockey9322@naver.com',
        subject = '{{ data_interval_end | ds }} dog_find 처리결과',
        html_content = '{{ data_intrval_end | ds }} 처리 결과 <br> 알루는 {{ ti.xcom_pull(task_ids="find_dog_task")}} 입니다. <br>'
    )

    dog_find() >> send_email

이제, email operator가 제대로 작동됐는지 airflow를 통해 확인해보겠습니다.

 

find_dog_task의 Xcom을 확인해보면 아래와 같습니다.

find_dog_task의 xcom

Golden Retriever가 choice함수를 통해 선택된 것을 알 수 있습니다.

 

이메일도 제대로 왔는지 확인해보면 아래와 같습니다.

email 결과

subject 와 html_content 의 두 가지 필드에 템플릿 문법이 잘 적용된 것을 확인할 수 있습니다.

알루는 닥스훈트니까 다시한번 dag을 실행시켜보록 하겠습니다. 4번째만에 닥스훈트가 나왔습니다!

find_dog_task의 xcom
email 결과

이상으로, PythonOperator의 결과값을 이용해서 이메일을 전송해보는 실습을 해봤습니다. 이메일 오퍼레이터를 쓸 때, 어떻게 Xcom 데이터를 가지고 오는 것이 궁금하다면, 먼저 template문법을 지원하고 있는 파라미터를 확인하고, 그에 맞게 템플릿 문법을 적용한 후 코드를 작성하면 됩니다!

 

반응형