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

Preview:

Citation preview

1

メール受信もAPI Gateway と Lambda

で!〜サービス連携で PaaS を拡張〜JAWS-UG アーキテクチャ専門支部

CDP 議論会 #12015/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 を使うとユーザ側の待機リソー

スが不要になる。

Recommended