Digdag オペレーター実践:メール送信(SMTP認証情報にAWS SESを利用) #digdag

treasure-data-logo

Digdagを理解してみるシリーズ、当エントリでは『メール配信』についてご紹介してみたいと思います。

SMTP認証情報の取得(AWS SES)

まずはAWS SESからSMTP認証情報を収集します。管理コンソールでAWS SESのメニューに遷移、ダッシュボード情報からSMTPサーバ情報を控えておきます。

digdag-mail-by-ses_01

上記画面から『Create My SMTP Credentials』をクリックし、認証に用いるユーザー名とパスワードを取得。この情報も併せて控えておきます。

digdag-mail-by-ses_02

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-mail-by-ses_03

まとめ

という訳でDigdagによるメール配信(SMTPサーバにAWS SESを利用)のご紹介でした。意外とサクッと出来たので使い勝手としては便利で良いと思います。後は想定される使われ方としてはエラー時の内容の連携や当エントリでも使った様な『テンプレートファイル』のより発展した使い方(パラメータを連携してバリエーション豊かに内容を表示)が考えられますので、その辺りをどうやって実現するか・出来るかといったところでしょうか。(Digdagのパラメータを使えば行けるのかな?) こちらからは以上です。

参考情報

AWS Cloud Roadshow 2017 福岡