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

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

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

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

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

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

#作り方
![cloudcraft.png](https://qiita-image-store.s3.amazonaws.com/0/185989/4f789e6f-b437-ce20-7d30-1921be014070.png)
概要は・・・
1. DNS設定：メールがSESに到着するようにする
2. SES設定：受信したメールをLambdaに流し入れる
3. Lambda：受け取ってから何かする

##受信メールを受け付ける設定
[このあたり](https://qiita.com/foxtrackjp/items/435bd6a77a04c23e03f3)を参考に。

SESの設定をすると、Route５３レコードも登録してくれるみたいです。
まず、ドメイン所有者であることを確認します。
![スクリーンショット 2019-10-01 20.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/90a59497-6644-fb85-a4e7-aad5c7e98ddc.png)
Route５３で管理しているドメインを入力すると
![スクリーンショット 2019-10-01 20.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/fbcf3797-acd6-aa0f-f3f7-3c8913ad4eaf.png)
TXTレコードとMXレコードを作るよ。と言っています。
USE Route５３ボタンを押すと、Route53にレコードが作成され、ドメイン所有者であることを証明されます。

## ルールセットを作成
どのメールアドレスに着信したら、どんなアクションをするかを登録するものです。
↓ここから
![スクリーンショット 2019-10-01 20.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/e0c08a46-ac51-9741-04f0-caa949d05f31.png)
↓ここに着信用のメールアドレスを入れます
![スクリーンショット 2019-10-01 20.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/95d7b291-8c75-0c8d-4ea0-a074dd02fd0a.png)

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

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

これでLambdaにメールが届きます。
SNSで到着するので、形式はJSONです！
[Amazon SES の Amazon SNS 通知のコンテンツ](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/notification-contents.html)  👈これのMailオブジェクトです。

##Lambda
1. SNSを受け取って起動
2. 送信者が知っている人か？を判定
3. 宛先のアドレスによって、処理方法を分岐
という感じです。

```javascript: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登録とかもできますな。