読者です 読者をやめる 読者になる 読者になる

アラートメールにSlackで返事をする w/ SES + S3 + Lambda + API Gateway 〜Outgoing篇〜

10日目です。9日目が当日中にできなかったのでネタを2分割して2日分しています。すみません、すみません。

9日目にメールからSlack通知をするシステムを作りましたので、今日はSlackポストから通知されたメールに返信する部分を作成しましょう。

f:id:matetsu:20151211015200p:plain

Lambda + API Gatewayの設定

SlackのOutgoing webhooksからのリクエストを受けるためのAPI Gatewayと実際の処理を行うLambda Functionの設定を行います。

Lambdaの設定

今回はAPI Gatewayと連携してmicro serviceのEndpointとして動くことを想定しているので、選択するBlueprintはmicroservice-http-endpointになります。

f:id:matetsu:20151211005447p:plain

Lambda Functionは最初から作ってしまいましょう。RoleはIncomingのときと同じものを使います。

コードは大雑把に書くとこんな感じ。S3に格納されている元メールへの返信となるように、Subjectに「Re: 」をつけたり、元のMessage-IDだったものを「In-Reply-To」や「Resources」に設定するようにもしています。

Slackユーザとメールアドレスを紐付けることは面倒なので、no-replyからの送信にしたうえで本文に誰からの返信かを書くようにしました。


Slack -> (API Gateway -> ) Lambda -> SES (Reply Em ...

slackポストのパースは簡易的に正規表現で「@alert_bot reply 返信対象メールのS3_KEY 本文」となっていることを期待しています。また、今回はAPI Gatewayでの認証を設定しないので、outgoing webhooksで設定されているTokeがEventにセットされていない場合は処理をしないようにもしています。

API Gatewayの設定

Lambda Functionの設定の流れでAPI Gatewayの設定も出てきます。先ほど書いたとおり、今回は認証をしないでPOSTを受け付ける設定です。

f:id:matetsu:20151211011430p:plain

Lambda Functionの作成が完了すると「API Endpoint」タブが表示されているので、「Method」のPOSTのリンクをクリックしてAPI Gatewayの設定を更に進めます。

個々の設定はこちらのQiita記事が参考になるので、ご参照ください。特にMapping Templateの設定が重要ですのでお忘れなく。

qiita.com

こrでAPI Gatewayの設定も完了し、Endpoint URLが決定します。(設定時と同じくLambdaのAPI Endpointタブに表示されています)

SlackのOutgoing Webhooksの設定

裏側の設定が完了したので、次はSlack側の設定です。発言に対して処理をするにはOutgoing webhookを利用します。

設定は以下のようにします。URL欄はAPI GatewayAPI Endpoint URLを設定します。またhookのTriggerはBotへのメンションとしています。

f:id:matetsu:20151211001259p:plain

それでは、対象チャンネルで発言をしてみましょう。

f:id:matetsu:20151211014600p:plain

そしてメーラを確認すると、9日目のネタで送信したメールへの返信としてメールが来ています。

f:id:matetsu:20151211014927p:plain

うまくいきましたね。

おわりに

ニーズがあるかわかりませんが、メールへの返信を疎かにしないでSlackだけで完結できる仕組みができました。これで、ますますメール離れができますね!

返信が面倒なんで、Slackで返信が簡単にできるような仕組みがあるといいんですけどね。

そして、動かしてみて気付きましたが、Lambda Functionの返り値をincoming webhookの形式にし忘れたので、発言に対してSlackは何の反応もしません。。。これだと、ちょっと不安かもしれませんね。(今日は直さないけど)

しめ

10日目も無事書き終わりました。本当に無理くり感が半端なくなってきています。それではまた明日。