13
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

SendGridでメールを受信してAWSのAPIGateway/Lambdaに渡す

はじめに

最近SendGridを使い始めました。

任意のアドレスでSendGridがメールを受信して、外部のWebサービスを呼び出すという Inbound Parse Webhookという機能から、Amazon APIGateway/Lambdaを呼び出すというところを試してみます。

前提

  • SendGridのアカウントがある
  • AWSのアカウントがある
  • Amazon Route 53 で管理しているHosted Zoneがある(注)

(注)この記事の前提というだけで、Route53じゃなければWebhookが使えないという意味ではありません。

ゴール

Route53で"example.com"というHostedZoneを管理している状況で、
monamu@sub1.sub2.example.com という宛先にメールを送信するとLambda Functionが呼び出される。

AWSの準備

Lambda Functionの作成

以下の内容のLambda Functionを作成します。

  • FunctionName : 任意
  • Runtime : Node.js 4.3
  • Role : Policyに"AWSLambdaBasicExecutionRole"が含まれたRole(結果をCloudWatch Logsで確認します)
  • Code : 以下の通り
exports.handler = (event, context, callback) => {
    console.log(JSON.stringify(event));
    console.log(event.body);
    callback(null, {
        statusCode: 200,
        body: JSON.stringify({message:'OK'})
    });
};

APIGatewayでREST APIの作成

以下の内容でREST APIを作成します。

  • API name : 任意

image

作成したら、デプロイします。ここではStage Nameを"v1"としました。

image

Invoke URL を後ほど使用します。

SendGridとRoute53を設定する

SendGridがRoute53で管理されたドメインのメールを受信して、REST APIを呼び出すためには、

  • SendGridでDomain Whitelabelの設定
  • Route53でexample.comへのメールはSendGridに行くようにレコード登録
  • SendGridで、example.comドメインのメールを受けたらREST APIを呼び出すように設定

という作業が必要になります。

SendGridでDomain Whitelabelを設定

詳しい手順 → ユーザマニュアル

  1. SendGridのDashboardにログインし、左のメニューからSettings / Whitelabels / Domainsを選択し、右側のAdd Whitelabelをクリックします。
  2. 以下のように入力してSaveします。 image ここで、Subdomainに"em"と設定していますが、これは受信するメールアドレスとは関係なく"em"と設定してください。

Domain Whitelabelを設定するドメインの前に、サブドメインを付けます。他で使用していない好きな名前を付けられますが、とくに希望がなければ「em」や「em1」といったサブドメイン名を推奨します。
ユーザマニュアル より

Whitelabelの登録が完了すると、以下のような表示になります。

image

”VALID”の列がすべて:x:になっています。
下に表示されている3つのCNAMEレコードをRoute53に登録すると、このステータスが変わります。

Route53にレコード追加

SendGridで指示された3行を追加します。TypeをCNAMEで作ることを忘れずに。

image

SendGridで確認

少し時間をおいてから、SendGridのWhitelabelのページのValidate Recordeをクリックすると、VALIDの列が:heavy_check_mark:に変わります。

これでWhitelabelの設定は完了です。

Route53でexample.comへのメールはSendGridに行くようにレコード登録

詳しい手順 → Documentation(英語) の(3)

Route53で以下のレコードを追加します。

  • Type : MX
  • Name : sub1.sub2.example.com. (入力は"sub1.sub2")
  • Value : 10 mx.sendgrid.net. (10の後ろのスペースと末尾の . を忘れずに)

これで、monamu@sub1.sub2.example.comへのメールはSendGridへ行くようになりました。

SendGridで、example.comドメインのメールを受けたらREST APIを呼び出すように設定

詳しい手順 → Documentation(英語)

  1. SendGridのDashboardの左からSettings / Inbound Parseを選択し、右側のAdd HOST & URLをクリックします。
  2. 以下のように入力してAddをクリックします。 image
    • Subdomain : sub1.sub2
    • Domain : example.com (リストから選択)
    • Destination URL : API Gatewayで作成したREST APIのInvoke URL

以上ですべての設定が完了です。

確認

メールを送信してみます。

image

SendGridのDashboardからActivityを表示すると、以下のように受信してParseが実行されたことが記録されています。

image

続いて、CloudWatchLogで、LambdaFunctionのログを確認します。

image

メールの内容が取得できていました。あとは取得した内容に応じて、Lambdaでいろいろ処理を実装していけそうです。

Lambdaがエラーを返したらどうなる?

SendGridはエラーを受信すると、自動的にリトライするそうです。

有効な 2xx HTTP レスポンスを 受け取らなかった 場合、SendGridのサーバは、メッセージの送信に失敗したと考え、送信をし続けます。3日経っても送信できなかったメッセージはドロップされます
APIリファレンス

まとめ

メール受信をトリガーにしたシステムのベースが、30分くらいでできてしまいました。
この後は、エラーハンドリングやREST APIの保護の方法について検討したいと思います。

では!

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
13
Help us understand the problem. What are the problem?