Lambda+Zendeskで問い合わせチケットの添付ファイルをS3に安全に移動する

KyashでCRE(Customer Reliability Engineering)をしているkuroiwaです。
KyashのCREは主に以下の2つの業務を行っています。

  • プロダクト改善による問い合わせ削減
  • 業務ツールの改良による業務効率化

今回はあまり表にでることのない後者の業務効率化施策のなかで、最近導入したカスタマーサポートの問い合わせ対応業務を効率化するための仕組みの一つを紹介します。

社外プラットフォームを利用した際のお客様対応における課題

Kyashではお客様対応を実施するにあたりZendeskというカスタマーサービスプラットフォームを利用しています。
お客様対応で利用するプラットフォームですので、ときにはお客様に関わるセンシティブな情報がやりとりされる場合があります。

しかしながら、社外のプラットフォームにお客様に関わる情報を保管しておくのはリスクが伴うため好ましくありません。したがって、そのような情報は適宜削除*1するオペレーションを実施しています。

とはいえ、お客様からご提供いただいた画像や書類データのなかで、保管すべきファイルも存在します。
そのため、そのような画像や書類データを社内の限られた従業員しか閲覧することができないセキュアな環境に移動し、Zendeskからは削除するというオペレーションが必要になります。作業自体は難しいことではありませんが、うまく環境を整備できないと業務が煩雑になりますし、手動でデータを移動する際に従業員のローカル環境に一時保存されては意味がありません。

Zendesk上の添付ファイルをS3に保管し、Zendeskから削除する業務を自動化する

前述した課題を解決するため、Zendeskのトリガ機能 / Zendesk API / AWS API Gateway / AWS Lambdaを利用して、Zendesk上の添付ファイルをS3に保存し、Zendeskから削除するという一連の流れを自動化してみました。

今回の施策は以下のような構成で実施しました。AWSのマネージドサービスについての説明は割愛します。

構成図

ZendeskからAPI Gatewayへのリクエス

Zendeskにはトリガと呼ばれる、Zendesk上の各イベントごとに予め設定したアクションを実行させる機能があります。
アクションの中には「ターゲットに通知」という、ターゲットと呼ばれる拡張機能に通知を送ることができるものがあり、ターゲットの中の一つである「HTTPターゲット」を利用することで様々なWebサービスと連携させることが可能です。

今回は、カスタマーサポートがお客様からのお問い合わせのチケットに対して特定のタグを付与した際に、そのチケットのIDと共にAPI Gatewayへリクエストが実行されるように設定しました。

Lambda Function

添付ファイルを取得し、社内環境に保存する処理を実行する本体です。API Gatewayへのリクエストで起動します。Zendesk APIにアクセスし、添付ファイルの取得に必要な操作を実行します*2

  1. チケットの状態を変更する処理が含まれるので、重複実行を避けるために処理済みを示すチケットタグを付与します

    • Tags - Zendesk Developers Docs
    • トリガの設定で処理済みを示すチケットタグが付与されている場合は実行されないようにしています
  2. トリガからリクエストを実行する際にpayloadに含めたZendeskのチケットIDを使って、チケット内の添付ファイルのメタデータを全て取得します

  3. 各添付ファイルのS3上のkeyを決定します。拡張子がついていないこともあるので、その場合は拡張子を判定して付与します

  4. 添付ファイルのメタデータから添付ファイル本体をダウンロードします

  5. ダウンロードしたファイルをS3にアップロードします。アップロードに成功した場合はattachment_idを記録します

  6. 全てのファイルのアップロード処理が完了したらアップロードに成功したattachment_idのみを墨消しします

  7. Zapier Webhookを使って結果をSlackに通知します。SlackのIncoming Webhookでもよいのですが、Zapierにしておくことで通知先や通知内容に変更があった際にコードの変更無しでカスタマイズできるメリットがあります

実際の動き

  1. 以下のように実行する処理を表すタグをチケットに付与します チケットにタグ付け

  2. 処理が完了するとSlackに通知が流れます 処理完了時のSlack通知

おわりに

今回は、カスタマーサポート業務を効率化する仕組みの一部を紹介しました。

簡単なスクリプトで構成されていますが、カスタマーサポートの業務負担の軽減とセキュアな情報管理を効率的に実現できているのではないでしょうか。今日も元気にたくさんのファイルを移動してくれています(エラーなども教えてくれます)。 Slack通知の様子

今回は諸事情により利用を見送ったのですが、ZendeskはAWS EventBridgeとも連携が可能なので、機会があればこちらを利用したツールも作ってみたいですね。

KyashではCREエンジニアをはじめ、さまざまな職種で採用を進めています。興味のある方はぜひ以下のリンクをご参照ください。

herp.careers

herp.careers

*1:Zendeskには墨消し(Redact)という機能があり、文章の一部や添付ファイルなどを永続的に削除することが可能です

*2:今回はトリガから実行される処理内で、チケットにタグを付けたり墨消しを実施したりしていますが、Zendeskからは推奨されていません。トリガは操作元に関わらずチケットが更新されるタイミングで実行されるため、チケット更新時に他のトリガが走ってしまい予期しない結果となる可能性や、処理がループする可能性があるためです。したがって、競合に注意した実装が必要です。 トリガとターゲットを使用してチケットを更新することはできますか? - Zendeskヘルプ