XplentyでZendeskのデータをRedshiftにロードする

一寸先はXplenty
2020.01.27

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

大阪オフィスの玉井です。

今日はxplentyというツールでZendeskのデータをRedshiftに入れてみたいと思います。Xplentyにはいくつかサンプルのジョブがあるのですが、その中に「Zendesk to Redshift」というものがあるので、それを使います。

環境

  • Xplenty
  • Amazon Redshift
  • Windows 10 pro
    • Google Chrome 79.0.3945.130

Connectionの登録

まずデータ取得元であるZendeskとデータ格納先であるRedshiftの接続情報を、それぞれXplentyに登録します。

Zendesk

見出しまで書いておいてアレですが、このタイミングではまだ設定しません(ジョブの実行時に設定する)。

Redshift

Redshiftの登録については下記エントリをご覧ください。

Xplentyからのアクセスを許可する

Redshift側に必要な設定として、Xplenty側のIPを許可してあげる必要があります。そのリストは下記にあるので、チェックしておきましょう。

Jobの作成(テンプレートを使用)

テンプレから作成する

ZendeskとRedshiftをそれぞれConnectionとして登録した後は、テンプレのジョブを呼び起こします。Package画面から「New Package」を選びます。

ジョブの名前とかは何でもいいんですけど、ここで重要なのはTemplateというところで「Zendesk to Redshift」を選ぶことです。ここでサンプルのテンプレートとして予め作り込まれてあるジョブを生成することができます。

中身の確認

ジョブはこんな感じです。

ユーザー、組織、チケット、そしてそれぞれのカスタムフィールドに関するデータを、それぞれテーブルとしてRedshiftに突っ込むようになっています。それぞれのデータを結合するとかそういう処理はなく、あくまで各々のデータをそのまま入れるようになっています。

もしかしたらお気づきの方もいるかもしれませんが、このジョブは「通常のREST APIのコンポーネント」を使って、ZendeskのAPIを叩いています。実は、XplentyはZendeskにネイティブ対応しているわけではありません。ですので、普通のAPIコンポーネントを使って地道にZendeskのAPIを叩く処理となっています(1から作ると面倒なので、テンプレとして用意してくれているのだと思いました)。

注意点

REST APIコンポーネントのPaginationをONにする

初回の実行時はZendesk側のデータを全件取得→DBに格納したいことが多いと思います。ただ、APIは基本的に1回で取得できる件数は限られるため、こういう場合、基本的には繰り返しAPIにリクエストする必要があります。XplentyのAPIコンポーネントは、その繰り返し(Pagination)を自動でやってくれるので、コンポーネントの設定でONにしておきましょう。

Redshiftコンポーネント全部にConnectionを設定する

当然ながら、ジョブの最後はどれもRedshiftコンポーネントとなっています。ジョブを見ればわかりますが、Redshiftコンポーネントは複数配置されています。これら全てに先程設定したConnectionを指定してあげる必要があるので注意しましょう(1つ設定すれば全部に自動設定されるとかはありません)。

Jobの実行

上記の設定を一通り終えたら、ジョブを実行しましょう。右上の「Run Job」を押します。

Clusterについては割愛します(他のXplentyエントリをご覧ください)。

今回のJob実行時に注意するべきなのは、3番目のZendeskに関するパラメータです。データを引っ張りたいZendeskの情報はここで入力します。すべて入力を終えたらJobを実行しましょう。

company_id

Zendeskのサブドメインを入力します。文字列はシングルコーテーションで囲んでください。

email

APIを利用するZendeskユーザーのメールアドレスを入力します。CONCAT('YOUR EMAIL','/token')という文字列がデフォルトで入っていますが、この中の「YOUR EMAIL」部分をメールアドレスに置換すればOKです。

token

Zendesk側で発行したAPIトークンを入力します。文字列はシングルコーテーションで囲んでください。

start_date

「いつのデータから取得するか」という項目だと思ってください。デフォルトでは下記の通りとなっています。

ToUnixTime(CASE WHEN $_PACKAGE_LAST_SUCCESSFUL_JOB_SUBMISSION_TIMESTAMP == '' THEN ToDate('2000-01-01T00:00:00.000Z') ELSE ToDate($_PACKAGE_LAST_SUCCESSFUL_JOB_SUBMISSION_TIMESTAMP) END)

ジョブが最後に成功した時間からの差分をとるようになっています(このジョブを何度も実行する前提となっている)。そうではなく、毎回ゼロから取得したい場合等は、任意のものに書き換える必要があります。

データの確認

ジョブが正常に終了すれば、早速Redshiftを確認しましょう。

それぞれテーブルが作成されています。

ちゃんとデータも入っています。ちょっと残念なのはJSONのまんまブッ込まれているカラムがあることですね。ここらへんはxplenty側で処理を作り込んで改善しないといけません。

おわりに

Xplentyは、こういう形である程度テンプレートなジョブを用意しているので、それを利用して効率よくデータ前処理をやりたいところです。

参考資料