6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【AWS】いまさら空メール【SES+Lambda】

Last updated at Posted at 2018-12-08

概要

自分用にLambdaで便利な関数を作った
がしかし
それを起動するために、何か良いサービスがないかと探してみたが今ひとつしっくりこない。。

  • SlackCommandだとめんどくさい
  • Amazon Dashボタンだと1アクションしかできない
  • どこからでも使いたいので簡単な認証は欲しい
  • かといってそこまでサービス追加するかわからないのでサーバ立てたくないし

考えた挙句、古から伝わる 空メール という技法を使うことにした。
これがなかなか意外とメリットが多かった

  • AWS SESを使えばメールボックス使わなくても良い
  • あくまでも起動のためのキッカケなので、ウィルスとか心配しなくても良い
  • スパムが来ようが無視するので容量とか気にしなくても良い
  • イベント発生側はメール送信ができれば良い

必要なもの

  • ドメインを持っていてDNSサーバとしてRoute53を利用している→フリードメインでも良い
  • AWSアカウントを持っている
  • ググれる

#作り方
cloudcraft.png
概要は・・・

  1. DNS設定:メールがSESに到着するようにする
  2. SES設定:受信したメールをLambdaに流し入れる
  3. Lambda:受け取ってから何かする

##受信メールを受け付ける設定
このあたりを参考に。

SESの設定をすると、Route53レコードも登録してくれるみたいです。
まず、ドメイン所有者であることを確認します。
スクリーンショット 2019-10-01 20.08.51.png
Route53で管理しているドメインを入力すると
スクリーンショット 2019-10-01 20.10.11.png
TXTレコードとMXレコードを作るよ。と言っています。
USE Route53ボタンを押すと、Route53にレコードが作成され、ドメイン所有者であることを証明されます。

ルールセットを作成

どのメールアドレスに着信したら、どんなアクションをするかを登録するものです。
↓ここから
スクリーンショット 2019-10-01 20.25.43.png
↓ここに着信用のメールアドレスを入れます
スクリーンショット 2019-10-01 20.26.51.png

次のページで、着信したらどうするかを設定します

##受信したメールをさばく
上図のように、SESは東京リージョンにはないので、オレゴンあたりから東京リージョンに持っていく必要があります。
下記テスト結果

❌オレゴンSES→東京Lambda
❌オレゴンSES→東京SNS
⭕️オレゴンSES→オレゴンSNS→東京Lambda

これでLambdaにメールが届きます。
SNSで到着するので、形式はJSONです!
Amazon SES の Amazon SNS 通知のコンテンツ 👈これのMailオブジェクトです。

##Lambda

  1. SNSを受け取って起動
  2. 送信者が知っている人か?を判定
  3. 宛先のアドレスによって、処理方法を分岐
    という感じです。
SES→SNSで発火するもの
exports.handler = function(event, context) {
    var eventSns = event.Records[0].Sns;
    var msg = eventSns.Message;
    var msgObj = JSON.parse(msg);
    var flg = false;
    
    //送信者は知っている人かチェックする
    switch(msgObj.mail.source){
        case 'omae@sitteru.com' :
        case 'you@sitteru.com':
            flg = true;
            break;
        default:
            console.log("知らない人からメールが来ますた");
            console.log(msgObj.mail);
            //ログに書いて終わり
    }
    
    if(flg) {
        //from判定OKの場合のみ
        //宛先アドレスによる処理分岐
        switch(msgObj.mail.destination + ''){
            case 'ore@aws.hoge.com':
                //請求情報通知
                var aws = require('aws-sdk');
                var lambda = new aws.Lambda();
                var lmdParam = {
                    FunctionName: "★他のLambda関数★",
                    InvocationType: "Event",
                    Payload: JSON.stringify(event),
                 };
                 lambda.invoke(lmdParam, function(err, data) {
                      if(err) {
                       console.log(err + err.stack);
                      } else {
                       console.log(data);
                      }
                  });
                  
                break;
            default:
                //Slackに送るとか            
        }
    }  
};

まとめ

billing @aws.hoge.comに空メールを送ると、AWS請求料金が帰ってくる仕組みを作った。
アカウント部分を増やせば色々できそう。。
メール内容がJSONで受ける事ができるので、メール内容をDB登録とかもできますな。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?