Digdag オペレーター実践:メール送信(SMTP認証情報にAWS SESを利用) #digdag
Digdagを理解してみるシリーズ、当エントリでは『メール配信』についてご紹介してみたいと思います。
SMTP認証情報の取得(AWS SES)
まずはAWS SESからSMTP認証情報を収集します。管理コンソールでAWS SESのメニューに遷移、ダッシュボード情報からSMTPサーバ情報を控えておきます。
上記画面から『Create My SMTP Credentials』をクリックし、認証に用いるユーザー名とパスワードを取得。この情報も併せて控えておきます。
mail>:オペレータを使ったDigdagメール配信実践
GitHubに設定のサンプルがありましたのでこれを元に設定ファイルを作成。
*.digファイルはこんな風に。(※指定のメールアドレスはいずれもAWS SESによる『Eメールアドレスの検証』を済ませておく必要がありますので御注意を)
timezone: Asia/Tokyo _export: mail: host: email-smtp.us-east-1.amazonaws.com port: 587 username: AKIAxxxxxxxxxxxxxxxx password: AtyJ(以下略) debug: true +step_sendmail: mail>: mail-templates.txt subject: 【Digdag】AWS SESを使ったメール送信テスト host: email-smtp.us-east-1.amazonaws.com from: 送信元アドレス to: [送信先アドレスその1, 送信先アドレスその2]
また、テンプレートとして用いるテキストファイルは以下のような内容としました。
${moment().format("YYYY-MM-DD HH:mm:ss Z")} -------------- こんにちは! こんばんは!! これはDigdagからのメール送信テストです。
上記構成でタスクを実行。しかしエラーとなってしまいました...
$ digdag run mail-by-ses.dig 2016-11-13 13:16:02 +0900: Digdag v0.8.18 2016-11-13 13:16:03 +0900 [WARN] (main): Reusing the last session time 2016-11-13T00:00:00+09:00. 2016-11-13 13:16:03 +0900 [INFO] (main): Using session /home/ec2-user/cm-digdag/cm1/.digdag/status/20161113T000000+0900. 2016-11-13 13:16:03 +0900 [INFO] (main): Starting a new session project id=1 workflow name=mail-by-ses session_time=2016-11-13T00:00:00+09:00 2016-11-13 13:16:05 +0900 [INFO] (0016@+mail-by-ses+step_sendmail): mail>: mail-templates.txt 2016-11-13 13:16:06 +0900 [WARN] (0016@+mail-by-ses+step_sendmail): Unsecure 'password' parameter is deprecated. DEBUG: JavaMail version 1.5.6 DEBUG: successfully loaded resource: /META-INF/javamail.default.providers DEBUG: Tables of loaded providers DEBUG: Providers Listed By Class Name: : : DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEBUG SMTP: Using mechanism LOGIN DEBUG SMTP: AUTH LOGIN command trace suppressed DEBUG SMTP: AUTH LOGIN failed 2016-11-13 13:16:06 +0900 [ERROR] (0016@+mail-by-ses+step_sendmail): Task +mail-by-ses+step_sendmail failed. javax.mail.AuthenticationFailedException: 535 AUTH failed (task execution) 2016-11-13 13:16:07 +0900 [INFO] (0016@+mail-by-ses^failure-alert): type: notify error: * +mail-by-ses+step_sendmail: 535 AUTH failed Task state is saved at /home/ec2-user/cm-digdag/cm1/.digdag/status/20161113T000000+0900 directory. * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time. * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
上記エラーメッセージを元に色々調べてみると、DigdagのGitHubリポジトリ内Issueでの以下のやり取りを発見。上記実行ログ7行目で出力されている様に、現状ではパスワードの直設定は推奨されていない(且つ実施に対応していない)形式となっている様です。
上記Issuesのやり取りの内容に従い、所定の場所に設定ファイルを作成、
$ cd ~/ $ mkdir .config/ $ cd .config/ $ mkdir digdag/ $ cd digdag/ $ vi config ---- secrets.mail.password = Aty(以下略) ----
併せて、上記*.digファイルの_exportセクションに記載していたパスワード設定行も削除しておきます。
そして再実行。今度は上手く行ったようです!
$ digdag run mail-by-ses.dig --rerun 2016-11-13 13:20:02 +0900: Digdag v0.8.18 2016-11-13 13:20:04 +0900 [WARN] (main): Reusing the last session time 2016-11-13T00:00:00+09:00. 2016-11-13 13:20:04 +0900 [INFO] (main): Using session /home/ec2-user/cm-digdag/cm1/.digdag/status/20161113T000000+0900. 2016-11-13 13:20:04 +0900 [INFO] (main): Starting a new session project id=1 workflow name=mail-by-ses session_time=2016-11-13T00:00:00+09:00 2016-11-13 13:20:06 +0900 [INFO] (0016@+mail-by-ses+step_sendmail): mail>: mail-templates.txt DEBUG: JavaMail version 1.5.6 DEBUG: successfully loaded resource: /META-INF/javamail.default.providers DEBUG: Tables of loaded providers : : 250 Ok 010001585be9ee47-c8a6c05b-d865-4495-a1d1-17bc8baabb5f-000000 DEBUG SMTP: message successfully delivered to mail server QUIT 221 Bye Success. Task state is saved at /home/ec2-user/cm-digdag/cm1/.digdag/status/20161113T000000+0900 directory. * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time. * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
送信先のメール受信も確認してみます。ちゃんと届いてました!
まとめ
という訳でDigdagによるメール配信(SMTPサーバにAWS SESを利用)のご紹介でした。意外とサクッと出来たので使い勝手としては便利で良いと思います。後は想定される使われ方としてはエラー時の内容の連携や当エントリでも使った様な『テンプレートファイル』のより発展した使い方(パラメータを連携してバリエーション豊かに内容を表示)が考えられますので、その辺りをどうやって実現するか・出来るかといったところでしょうか。(Digdagのパラメータを使えば行けるのかな?) こちらからは以上です。