ラムダでSESとSNSを連携させてバウンスメール処理を行う

Last-modified: Wed, 27 Dec 2017 18:58:00 JST (232d)

ラムダの勉強がてら、以前作成したSESとSNSを連携させてバウンスメール処理をするのを、ラムダ関数で実装してみました。

ラムダの作成

  1. まずは、リージョンをバージニアにします。これはSESがまだ東京リージョンで提供されていないからです。
    lambda01.jpg
  2. ラムダの画面から関数の作成をクリックします。
    lambda02.jpg
  3. ラムダはあらかじめ用意されているテンプレート集から作成する方法と、一から作成する方法があります。
    ここでは、一から作成を選択します。
    名前は適当につけて、ランタイムはNode.jsを選びます。(Python3でもやってみたのですが思いのほか難しかったので・・)
    lambda03.jpg
  4. ロールはテンプレートから新しいロールを作成を選択します。ここであらかじめ作成済みのIAMロールを選択することもできます。
    ロール名は適当につけます。
    ポリシーテンプレートは、自動作成するIAMロールポリシー(CloudWatchLogsに対する権限)に追加して何か必要な場合選択します。ここでは必要ないので選択しません。
    勿論、作成されたIAMロールに対し、後から必要に応じ権限の加筆修正をすれば反映されます。
    lambda04.jpg
  5. 関数が作成されました。
    まずは動かしてみます。上にあるテストボタンをクリックしましょう。
    lambda05.jpg
  6. ラムダでは、関数の引数となるイベントパラメタを受け取り動作しますが、ここでは、そのイベントに渡すパラメタをJSON形式で指定します。このテストイベントを作成することにより、デバック時いちいち連携元の操作をしなくても良くなる訳です。
    ここでは、動作テストを行いたいので、イベントテンプレートはHelloWorldを選択し、イベント名を適当につけて作成します。
    lambda06.jpg
  7. 先ほど作成したテストイベントを選択し、テストボタンをクリックします。
    lambda07.jpg
  8. 実行結果:成功とでて、動いたラムダ関数の結果が表示されます。ログをクリックしますと、CloudWatchLogsへ飛び、
    詳細なログが参照できます。
    開発時は随時ログに出力しながらデバックをすることになります。
    lambda08.jpg

SESとSNSとLambdaの連携

  • では実際に連携をとってみましょう。
    イメージ的には以下のような感じになります。
    Untitled.png
  1. SESの作成はSESのサンドボックス環境からメール送信を参考にしてください。
  2. SNSとSESの連携については、SESとSNSとSQSを連携させ、バウンスメール処理を行うを参考に、
    3:トピックの作成までを行います。
  3. 作成したトピックについて、サブスクリプションの発行ボタンをクリックします。
    lambda09.jpg
  4. プロトコルでは、AWS Lambdaを選択します。エンドポイントは先ほど作成したラムダ関数を選択します。
    lambda10.jpg
    これで、SESのバウンスメールが来たら、SNSへ通知が来て、それをトリガにラムダ関数が呼ばれます。

SNSからバウンスメッセージを受け取り、バウンスメールを処理するラムダ関数の作成

ここでは、実際にバウンスメール処理をするのではなく、バウンスメールアドレスを表示するまでとします。
作成したコードはこんな感じです。

ちなみにPython3で作成したのはこんな感じです。

  1. コードを保存したら、SESのテストメールよりバウンスメールテストを行いますと、こんな感じで実行されます。
    モニタリングタブをクリックして、ログにジャンプをクリックします。
    lambda11.jpg
  2. CloudWatchLogsにコンソールログに出力した、バウンスメールアドレスが記録されています。
    lambda12.jpg

テストイベントの作成

  1. ここで、このコードの最初に受信したイベントをJSONでコンソールログに出力するようにしています。
    console.log('Received event:', JSON.stringify(event, null, 2));
    これの出力をコピーしておきます。
    lambda13.jpg
  2. ラムダのテストイベントに貼り付けます。ラムダの画面からテストイベントの設定をクリックします。
    lambda14.jpg
  3. テストイベントの設定から新しいテストイベントの作成をクリック。イベント内容に先ほどのCloudWatchLogsに出力されていたイベントのJSON結果を貼り付けます。
    lambda15.jpg
  4. 作成したテストイベントを選択して、テストを実行してみます。
    lambda16.jpg
  5. これで再度SESからバウンスメールを飛ばさなくてもデバックできます。
    lambda17.jpg

CloudWatchアラーム

ラムダ関数での実行エラーは特に仕掛けをしない場合、CloudWatchLogsに吐かれます。
これだと、実行時にエラーなったことに気づかないので、SNSと連携させ、エラー発生時及び回復時に
メールを飛ばすようにします。

  1. CloudWatch画面より、アラームの作成ボタンをクリックします。
    error01.jpg
  2. メトリックの選択で、Lambdaメトリックをクリックします。
    error02.jpg
  3. 作成したラムダ関数のエラーにチェックを入れます。
    ここでは、エラーの発生回数が1回以上あればアラートを飛ばしたいので、平均から合計に変更します。
    他にもいろいろ取得可能なメトリックがあるので、応用できそうです。
    error03.jpg
  4. 次にアラートを飛ばす閾値の設定をします。今回は1回以上でアラートを飛ばす設定にします。
    error04.jpg
  5. アラートを飛ばす先の設定をします。既に作成済みのSNSトピックがあればそれを選択します。
    ここでは新規作成をするので、新しいリストをクリックします。
    error05.jpg
  6. 通知の送信先に適当なSNSトピック名を、メールリストに送信先メールアドレスを入力し、
    アラームの作成をクリックします。
    error06.jpg
  7. 入力したメールアドレスが正しいかの確認メールが飛びますので、メールを受信し承認します。
    承認されるとアラームの表示ボタンが押せるようになります。
    error07.jpg
  8. 作成したアラームをクリックし、アクションから変更をクリックします。
    error08.jpg
  9. ここで、状態が回復した際にもメールを飛ばす設定を行います。これをしないと、アラートが飛んだあと回復したのかわからなくなります。
    通知の送信先プルダウンから先ほど作成したSNSトピックを選択します。
    あと間隔はデフォルト5分間での合計になりますが、用途に応じ設定してください(最少は1分)
    error09.jpg
  10. ラムダ関数でエラーを起こしてみます。今回は手っ取り早くテストケースでHelloWorldを選択し実行すればエラーになります(SNSイベント通知を期待しているのに違うのがくるので)
    エラーになると、しばらくすると(デフォルトで5分間)このようなメールが飛びます。
    error10.jpg
  11. OKのイベントを起こしてみますと、このようなメールが飛びます。
    error11.jpg

Counter: 274, today: 1, yesterday: 0

このページの参照回数は、274です。