課題
Webフォームからの問い合わせを受け付ける場合、多くが氏名、電話番号、住所、メールアドレスを記載していただくことになります。
そして、その問い合わせは多くはメールとして受信して、その内容を社内の営業システムに記録して対応をしていくことになるのが一般的です。
ただ、この部分問い合わせを受け付けるチャンネルが複数あるとシステム連携が難しくなるものですよね。
これってなんとかメールから分析して個人情報を抽出して営業システムに入れられないものかと考えました。
アーキテクチャの検討
弊社内ではGmailで問い合わせメールを受け取っており、社内のやりとりはSlackを中心に行なっていたので、Zapierを使ってSlackに問い合わせメール内容を転送していました。
そのため、以下のような方法でAPI Gatewayを呼び出し、Lambdaで処理してDBに書き込むことを検討しました。
GmailからGAS経由でLambdaを呼び出す
メール内容をGASからAPI Gatewayを呼び出す方法です。
Gmailから直接DBに流し込むのでシンプルなフローになります。
ただし、GASはメール受信をトリガーに処理を呼び出すことができないため、ポーリングをし続ける必要があります。
ZapierからLambdaを呼び出す
Zapierの連携先としてAWS Lambdaを指定することができます。
GUI上で設定ができるのでとても構築がしやすい方法です。
この場合ZapierPremium(有料)の契約が必要になります。
ZapierからカスタムWebhook経由でAPI Gatewayを呼び出す
Zapierの連携先として自身で構築したREST APIを呼び出す方法です。
こちらもZapierPremiumの契約が必要になります。
SlackからWebhook経由でAPI Gatewayを呼び出す
Slackで独自アプリを作成してAPI Gatewayを呼び出す方法です。
Gmail→Zapier→Slack→API Gateway→Lambda→DBとフローが長くなってしまうのが難点ですが、AWSサービス以外は基本無料で構築できるのがメリットです。
SlackからAPI Gatewayを呼び出す方法が費用もかからずいいかなと思ったのですが、今回の案件とは別の事業部でSlackではなくGoogleChatを使っていたこともあり、チャットツールへの依存は排除する必要がありました。
そのため、今回はZapierからAPI Gatewayを呼び出す方法を選択しました。
Lambdaでのメール解析処理の構築
まずはLambdaでのメール解析処理の構築です。
API GatewayおよびLambdaの作成はAmplifyを使いました。
メールの改行、記号などを元に氏名、メールアドレスなどを機械的に抽出するロジックにしています。
言語はTypescriptを利用、単体テストはjestで行なっています。
Lambda関数をTypescript+Amplifyで作ろうと思うと一手間必要になります。
こちらを参考にさせていただきました。
DBへの接続
Prismaを利用したかったのですが、LambdaでPrismaを利用しようと思うとLambdaLayerの構築が必要になります。
今回はスピードを重視したので、mysql2を利用してSQLを直接投げる形にしました。
API GatewayとLambda関数の作成
API GatewayとLambda関数の作成はAmplifyを使いました。
ZapierとAPI Gatewayの連携
ZapierのWebhooksアプリからはJsonでメールデータを送る必要があります。
Payload Typeの部分がデフォルトでformになっているのでjsonに変更します。
またAPI Gatewayは受け取ったデータをJSON文字列で受け取ってしまうため、Lambda内でparseする必要があります。
これについては以下の記事が参考になります。
E2Eテスト
マネジメントコンソールでのLambda関数単体のテストをしたのち、API Gateway→Lambdaの接続テストを実施。その後Zapier上からテストリクエストを送る形で、Zapier→API Gateway→Lambda→DBのE2Eテストを実施しました。
Lambda関数内でconsole.logを駆使してCloudWatchでログを確認しながらデバッグを行っています。
以上を経て、無事に問い合わせメールと営業システムの連携が完成しました🙌 🙌 🙌
今後の検討事項
- 今回は営業システム(SuiteCRM)のDBに直接書き込んでいますが、SuiteCRMのAPI機能を使う方がよりスマート
- メールを解析するロジックの精度を上げていきたい
- DBへの書き込みにprismaを使えないか検討したい