Slack SDK로 메세지 보내기 (with Airflow)
Airflow 버전에 따라서 의존성 때문에 slack operator 쓰기가 영 불편합니다. 그래서 python slack sdk로 slack operator를 대체하는 방법에 대해 정리해봅니다.
Q. 왜 Airflow가 지원하는 Operator를 쓰지 않나요?
A. 언제 지원이 끊길지 모르고, 버전별로 호환이 될지 모르기 때문입니다. sdk를 사용하면 의존성 단계를 한단계 줄일 수 있습니다. (slack과 나 사이의 Airflow 의존성을 제거)
python-slack-sdk github를 참조하시면 더 자세한 튜토리얼을 확인할 수 있습니다.
install
Python 3.6 이상만 지원한다고 합니다.
pip install slack_sdk
Basic Usage
code first.
from slack_sdk import WebClient
client = WebClient(token='SLACK_BOT_TOKEN')
response = client.chat_postMessage(channel='#random', text="Hello world!")
WebClient
클래스로 slack message를 보낼 client
instance를 만들었습니다. 그리고 chat_postMessage
메서드로 보낼 채널과, 텍스트를 정해서 전달합니다. response
로는 전송 성공, 실패 결과가 전달됩니다.
여기에 error 처리를 추가할 수도 있고, slack_sdk는 async 함수도 지원하기 때문에 필요하면 가져다 쓰면 되겠습니다.
Q. 그런데 내가 사용하는 Slack 에 연결할 토큰은 어디서 찾을 수 있나요?
A. 여기에 그림과 함께 설명되어 있습니다. SlackApp을 생성하고 권한을 부여해서 OAuth Access Token이라는 것을 발급해야 합니다.
with Airflow
airflow 에서는 간단하게는 아래처럼 사용할 수 있습니다.
from datetime import datetime
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from slack_sdk import WebClient
default_args = {
'owner': 'mskim',
'depends_on_past': False,
'start_date': datetime(2021, 1, 1),
}
dag = DAG(
'test_slack',
default_args=default_args,
schedule_interval='@once',
)
def send_slack_message(channel, message):
client = WebClient(token='SLACK_BOT_TOKEN')
client.chat_postMessage(channel='#random', text="Hello world!")
with dag:
PythonOperator(
task_id="send_slack_message",
python_callable=send_slack_message,
op_kwargs=dict(
channel="#random",
text="hello world!",
),
)
airflow에서 자주 사용하는 callback 함수는 [Airflow] Slack으로 결과 전달하기을 참조해서 클래스를 만들거나, 함수를 반환하는 함수를 만들어서 사용할 수도 있겠습니다.
closing
축하합니다! airflow 의존성 없이 python으로 언제든 slack message를 보낼 수 있게 되었습니다.
Leave a comment