概要
自分用にLambdaで便利な関数を作った
がしかし
それを起動するために、何か良いサービスがないかと探してみたが今ひとつしっくりこない。。
- SlackCommandだとめんどくさい
- Amazon Dashボタンだと1アクションしかできない
- どこからでも使いたいので簡単な認証は欲しい
- かといってそこまでサービス追加するかわからないのでサーバ立てたくないし
考えた挙句、古から伝わる 空メール という技法を使うことにした。
これがなかなか意外とメリットが多かった
- AWS SESを使えばメールボックス使わなくても良い
- あくまでも起動のためのキッカケなので、ウィルスとか心配しなくても良い
- スパムが来ようが無視するので容量とか気にしなくても良い
- イベント発生側はメール送信ができれば良い
必要なもの
- ドメインを持っていてDNSサーバとしてRoute53を利用している→フリードメインでも良い
- AWSアカウントを持っている
- ググれる
- DNS設定:メールがSESに到着するようにする
- SES設定:受信したメールをLambdaに流し入れる
- Lambda:受け取ってから何かする
##受信メールを受け付ける設定
このあたりを参考に。
SESの設定をすると、Route53レコードも登録してくれるみたいです。
まず、ドメイン所有者であることを確認します。
Route53で管理しているドメインを入力すると
TXTレコードとMXレコードを作るよ。と言っています。
USE Route53ボタンを押すと、Route53にレコードが作成され、ドメイン所有者であることを証明されます。
ルールセットを作成
どのメールアドレスに着信したら、どんなアクションをするかを登録するものです。
↓ここから
↓ここに着信用のメールアドレスを入れます
次のページで、着信したらどうするかを設定します
##受信したメールをさばく
上図のように、SESは東京リージョンにはないので、オレゴンあたりから東京リージョンに持っていく必要があります。
下記テスト結果
❌オレゴンSES→東京Lambda
❌オレゴンSES→東京SNS
⭕️オレゴンSES→オレゴンSNS→東京Lambda
これでLambdaにメールが届きます。
SNSで到着するので、形式はJSONです!
Amazon SES の Amazon SNS 通知のコンテンツ 👈これのMailオブジェクトです。
##Lambda
- 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登録とかもできますな。