この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。サービスグループの武田です。
先日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_KEY
とSENDGRID_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を利用することでバウンスメールの管理なども簡単に行えます。使ったことのない方はぜひ一度試してみてください。