1
メール受信も
API GatewayとLambdaで!
〜サービス連携でPaaSを拡張〜
JAWS-UG アーキテクチャ専門支部
CDP議論会 #1
2015/9/17 大栗 宗
2
お前だれよ?
• 大栗 宗(@maroon1st)
• 秋葉原でブログ書いてます
• シガー、パイプ、ウィスキー
• 好きなAWSサービス:
RDS、SSM、IAM
• 好きなCDP:
Complex Searcherパターン(Incubator)
3
メール受信もAPI Gateway?
httpsしか使えないでしょ?
4
AWSがダメなら外部サービスを
使えばいいじゃない!
SendGridなら受信も可能
Inbound Parse Webhook がある!
5
SendGrid
• 言わずと知れたクラウドベースのメール
インフラストラクチャ。
• 世界中のメールの3%(月間130億通)を配
信する大規模サービス。
• 日本国内では構造計画研究所が代理店を
行っている。
6
Inbound Parse Webhook
• SendGridには2種類のWebhook(イベン
ト通知とメール受信)がある。
• Inbound Parse WebhookはSendGridが
代わりにメールを受信してくれて、
Webhookとして通知してくれる。
• なおFreeプランでも使用可能(Bronzeプ
ランはダメ)
7
こんな感じで実装
8
SendGridからAPI Gateway
9
SendGridからAPI Gateway
• Webhookでは、メールの生データを
multipartにしてPOSTしてくる。
• 後ろにLambdaがあるためJSON形式で
データを渡す必要がある。
• Integration RequestでPOSTデータを変
換する必要がある。
10
SendGridからAPI Gateway
• Content-Typeがmultipart/form-dataで
Mapping templateを作る。
• データ内にダブルクオートがあるため
BASE64エンコードしてJSON化する。
#set($inputParams = $util.base64Encode($input.path('$')))
{
"body": "$inputParams"
}
11
API GatewayからLambda
12
API GatewayからLambda
• Node.js力さえあれば、後は簡単。
• event.bodyをBASE64デコードして中身
を処理。
• Node.jsのSendGridライブラリがある。
(https://github.com/sendgrid/sendgrid-nodejs)
var postDoby = new Buffer(event.body, 'base64').toString();
13
API GatewayからLambda
• 後は好きな処理をして、バックエンドへ。
• データが大きい場合は、処理に時間がか
かるので、Lambdaのメモリサイズの調整
や添付ファイルを処理しないなどの対応
が必要かも。
14
メール受信からAWSへの連携
15
そういえば、これ
16
で出来るよ
17
Zapierの対応サービス
• なんでも出来そうな勢い
18
外部サービスを
上手く使おう
19
今回のアーキテクチャ提案で
重要なこと2つ
20
1. プロトコル変換
21
プロトコル変換
• API Gatewayで自分が使いやすい形式に
変換。
• VTL(Velocity Template Language)で
データフォーマットを変えられる。
22
2. リアクティブシステム
23
リアクティブシステム
• The Reactive
Manifesto( http://www.reactivemanifesto.org/
)で提唱されている、即応性
(Responsive)、耐障害性 (Resilient)、弾
力性 (Elastic)、メッセージ駆動
(Message Driven)を兼ね備えたシステム。
• 代表的な例としてLambdaがある。
24
まとめ
• 外部サービスを使えばhttps以外もAPI
Gateway+Lambdaで処理可能。
• API Gatewayはプロトコル変換ができる。
• Lambdaを使うとユーザ側の待機リソース
が不要になる。

メール受信も API Gateway と Lambda で!〜サービス連携でPaaSを拡張〜