Apache AirflowからSendGridを使ってメール送信をしてみた

こんにちは。サービスグループの武田です。Apache Airflowからメールを送信するためにSendGridを使ってみました。
2020.08.27

こんにちは。サービスグループの武田です。

先日Amazon SESを利用して、Apache Airflowからメール送信する流れを確認しました。

今回はSESの代わりにSendGridを利用してメール送信する方法を試してみます。

事前にSendGridのアカウントが必要です。Freeプランで問題ないため、持っていない方は新規会員登録から作成しましょう。なお登録から発行まで1日程度かかりますので、余裕を持って登録しておくことをお勧めします。

SendGridのAPIキーを作成

SendGridの管理画面にログイン後、左メニューの[Settings] > [API Keys]を選択します。

続いて[Create API Key]ボタンを押下し、新しいAPIキーを作成します。

作成したAPIキーの再取得はできないため、忘れないようにメモしておきましょう。

AirflowにSendGridのサブパッケージを追加

AirflowでSendGridを利用するためにはサブパッケージのインストールが必要です。次のコマンドを実行します(私はDocker環境なのでDockerfileに追加しました)。

$ pip install 'apache-airflow[sendgrid]'

AirflowにSendGridの設定をする

次にSendGridの設定をします。前回同様、Docker Compose用にenvファイルを作成し、それを利用します(APIキーは取得したもの、アドレスは任意のものを指定します)。

mail_sendgrid.env

AIRFLOW__EMAIL__EMAIL_BACKEND=airflow.contrib.utils.sendgrid.send_email
SENDGRID_API_KEY=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
SENDGRID_MAIL_FROM=takeda@example.com

AIRFLOW__EMAIL__EMAIL_BACKENDがポイントで、これによってメール送信に使用する実装が切り替えられます。なお検証に利用しているAirflowは1.10系ですが、将来的にairflow.providers.sendgrid.utils.emailer.send_emailを利用するように変わるようです。使用するバージョンによって指定するパラメーターが変わることには留意しておきましょう。

またSENDGRID_API_KEYSENDGRID_MAIL_FROMは設定ファイルではなく環境変数で指定します。実装は引数からも指定できるようになっていますが、EmailOperator内で引き渡す作りになっていないため、自分で実装しない限りは環境変数で指定する必要があります。

あとはcomposeファイルでこのenvファイルを指定すればOKです。

docker-compose.yml

services:
  airflow:
    env_file:
      - mail_sendgrid.env
  (略)

メール送信テスト

これで準備ができました。前回作業との差分で言えば、envファイルを切り替えただけですね。それでは前回同様メール送信するDAGを作成して実行しましょう(内容は前回とほぼ同じ)。

test_sendgrid_sendmail.py

import airflow
from airflow.models import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.email_operator import EmailOperator

args = {
    "owner": "airflow",
    "start_date": airflow.utils.dates.days_ago(2),
    "provide_context": True,
}

with DAG(dag_id="test_sendgrid_sendmail", default_args=args, schedule_interval=None) as dag:

    start = DummyOperator(task_id="start")

    sendmail = EmailOperator(
        task_id="sendmail",
        to="takeda@example.com",
        subject="SendGridでメール送信",
        html_content="うまくいくかな?",
        mime_charset="utf-8",
    )

    end = DummyOperator(task_id="end")

    start >> sendmail >> end

管理画面から確認できたら手動でDAGを起動します。

少し待っていると次のメールが受信できました!

まとめ

特に難しい作業もなくSendGridと連携できました。SendGridを利用することでバウンスメールの管理なども簡単に行えます。使ったことのない方はぜひ一度試してみてください。