Zendeskチケットの添付ファイルを取得して、S3に保存してみた

2022.05.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、サービスグロースチームの筧です。

最近、Zendeskのチケットから添付ファイルを取得して、特定S3バケットに保存するPoCを作成しました。今回はこちらの内容について、ブログ向けに汎化してご紹介します。

構成図

デプロイ方法

devステージにデプロイする想定で進めます。

S3バケットの準備

添付ファイルの保存先のS3バケットを作成します。S3バケットは誤って削除したくないので、今回は手動で作成します。Amazon S3 マネージドキー (SSE-S3)を使ってサーバー側の暗号化を有効化にして、後はデフォルトで作成しました。

Zendesk APIの準備

APIリクエストを実行するには、認証済みのZendeskユーザーであることが必要です。APIリクエストは、メールアドレスとパスワード、メールアドレスとAPIトークン、またはOAuthアクセストークンでBasic認証を使用して認証します。

APIリクエストを認証するにはどうすればよいですか? | Zendesk

チケットを参照して、添付ファイルを取得するために、Zendesk APIの準備をします。今回はメールアドレスとAPIトークンで認証します。まずは認証済みのZendeskユーザーのメールアドレスを用意します。続いてAPIトークンを生成します。生成方法は以下を参照ください。

APIトークンの生成 | Zendesk

Zendeskサブドメイン情報も後で必要になるので確認します。確認方法は以下を参照ください。

Zendeskのサブドメインはどこで確認できますか? | Zendesk

Secrets Managerの準備

Secrets Managerにクレデンシャル情報や環境変数などを保存します。

  • シークレットのタイプ:その他のシークレットのタイプ
  • キー/値のペア
    • token:{{APIトークン}}
    • email: {{認証済みのZendeskユーザーのメールアドレス}}
    • subdomain: {{Zendeskサブドメイン}}
    • bucket: {{添付ファイルの保存先のS3バケット}}
  • シークレットの名前: dev/blog-zendesk-fetch-attachments

その他AWSリソースのデプロイ

以下のリポジトリを利用して、その他のAWSリソースをデプロイします。デプロイにはServeless Frameworkを利用します。デプロイ方法はリポジトリのREADMEを参照ください。

blog-zendesk-fetch-attachments | GitHub

以下の階層構造で書いています。

  • handlers層: エントリポイントを定義
  • use_cases層: ビジネスロジックを定義
  • services層: AWSサービスやZendeskなどのサービスを定義

コードの流れは以下です。

  1. state-machines.ymlに定義したAPI Gatewayのエンドポイントでリクエストを受け取り
  2. state-machines.ymlに定義したステートマシンが起動
  3. エントリポイントのsrc/handlers/fetch.handlerを呼び出し
  4. src/use_cases/fetch.execを呼び出し
  5. src/use_cases/fetch._init_use_caseを呼び出し
  6. src/use_cases/fetch._init_use_case内で、クレデンシャル情報や環境変数を取得
  7. src/use_cases/fetch._init_use_case内で、services層で定義したクラスのインスタンスを作成
  8. src/use_cases/fetch._init_use_caseで取得した情報をインプットに、use_cases層で定義しているクラス(FetchAttachmentsUseCase)のインスタンスを作成
  9. FetchAttachmentsUseCaseのインスタンスで、execメソッドを呼び出し
  10. チケットの最新コメントから添付ファイルを取得
  11. 添付ファイルをLambdaのtmpディレクトリに一時保存
  12. S3バケットにアップロード
  13. Lambdaのtmpディレクトリをクリア

ZendeskのWebhookとトリガーの設定

Webhookの設定

以下の通り設定します。

  • 名前: dev/blog-zendesk-fetch-attachments
  • エンドポイントURL: {{API Gatewayのエンドポイント}}
  • リクエスト方法: POST
  • リクエスト形式: JSON
  • 認証: なし

トリガーの設定

トリガーの条件は環境にあわせて指定ください。トリガーのアクションには先程設定したWebhookへの通知を設定します。

{
  "zendesk_id": "{{ticket.id}}"
}

トリガーの条件は環境に合わせて設定ください。

動かしてみる

Zendeskチケットの作成

トリガーの条件に合致するZendeskチケットを作成します。今回は適当なスクリーンショットを添付してみました。

ステートマシンの確認

ステートマシンが起動して、実行ステータスが成功になっていればOKです。参考までに実行入力例は以下のようになっています。

{
  "zendesk_id": "5125"
}

グラフインスペクターでは以下のように表示されます。

S3バケットの確認

/バケット名/ZendeskチケットID//アタッチメントID

上記パスに対象のオブジェクトが作成されています。マネジメントコンソール上でオブジェクトをダウンロードして、Zendeskチケット作成時に添付したファイルであればOKです!

あとがき

最後まで読んでいただきありがとうございます。今回はPoCである都合上、カスタムドメインの設定やエンドポイントの認証などは割愛している点はご容赦ください。申請関連の処理で、チケットに申請書を添付いただくような場合に、当該サービスを活用することで、後続処理の自動化が期待できそうです!

それではまた!