Apache AirflowからSendGridを使ってメール送信をしてみた
こんにちは。サービスグループの武田です。
先日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キーは取得したもの、アドレスは任意のものを指定します)。
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_KEY
とSENDGRID_MAIL_FROM
は設定ファイルではなく環境変数で指定します。実装は引数からも指定できるようになっていますが、EmailOperator内で引き渡す作りになっていないため、自分で実装しない限りは環境変数で指定する必要があります。
あとはcomposeファイルでこのenvファイルを指定すればOKです。
services: airflow: env_file: - mail_sendgrid.env (略)
メール送信テスト
これで準備ができました。前回作業との差分で言えば、envファイルを切り替えただけですね。それでは前回同様メール送信するDAGを作成して実行しましょう(内容は前回とほぼ同じ)。
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を利用することでバウンスメールの管理なども簡単に行えます。使ったことのない方はぜひ一度試してみてください。