ZendeskのチケットデータをAmazon Elasticsearch Serviceへ自動的にアップロードする

はじめに

前回のブログでPythonを使用してZendeskのチケット内容を取得することができました。

PythonでZendeskのチケットを取得する

今回は取得したデータをAmazon Elasticsearch Serviceへ自動的にアップロードする方法をご紹介します。

前提

  • Amazon Elasticsearch ServiceはAmazon VPCプライベートサブネットに作成
  • Amazon API Gateway経由でAWS Lambdaを実行させる
  • Zendeskの自動化とwebhookでAmazon Elasticsearch Serviceへデータを入れるまでを自動化する
  • Amazon Elasticsearch Serviceへ入れるデータスキーマ
{
    "ticket_id": 12345,
    "url": "https://subdomain.zendesk.com/agent/tickets/12345",
    "subject": "subject",
    "create_date": "2017-10-16T00:55:22Z",
    "updated_date": "2017-10-21T18:02:34Z",
    "nested_comments": [
                {
                  "comment_id": 22222,
                  "public": True,
                  "body": コメント
                },
                {
                  "comment_id": 33333,
                  "public": False,
                  "body": コメント
                }
              ]
}
  • Amazon Elasticsearch Serviceで類似チケットを検索する

やってみた

ZendeskのチケットがクローズになったタイミングでAWS Lambdaを実行させる設定をします。

Amazon API Gateway

ZendeskのチケットIDをPOSTするだけですので、Amazon API GatewayはPOSTメソッドで作成しました。

AWS Lambda

AWS Lambdaのコードはgithubへアップしましたのでご参照ください。

Zendeskでwebhookを作成する

HTTPターゲットを使用したwebhookの作成

設定 → 拡張機能 → ターゲットを追加 → HTTPターゲット からwebhookを作成します。

画像

※urlはAmazon API Gatewayのurlを指定します。

Zendeskで自動化を作成する

時間ベースのイベントと自動化を使用したワークフローの効率化

サイドバーにある管理アイコンから自動化を選択し作成します。
ここでは解決済みのチケットを数時間後にクローズへステータスを変更した時に、ターゲットに通知するように設定しています。

通知:ターゲットに通知を選び、先ほど作成したwebhookを選択します。
JSONボディは以下のようにticketのidだけ送るようにしました。

画像

これで、自動でZendeskのチケットがクローズになったらAmazon Elasticsearch Serviceへデータを入れることができます。

過去データを手動で入れる

自動化の設定は完了しましたが、過去のデータは手動で入れる必要があります。
Amazon Elasticsearch Serviceはプライベートでサブネットに作成しているので同じVPC内からデータを入れるため パブリックサブネットにEC2インスタンス(Amazon Linux)を作成して以下のようなPythonプログラムを実行し過去のデータを入れました。

サンプルコード

コードはgithubへアップしましたのでご参照ください。

これでクローズ済みのチケットが全てAmazon Elasticsearch Serviceへデータを入れることができました。

検索してみる

以下の例ではcomment.bodyELB 5xxが含まれるチケットを検索しています。

curl -s -H "Content-Type: application/json" -XGET "[Endpoint]/[IndexName]/TypeName]/_search" -d'
{
  "query": {
    "match": {
      "comment.body": "ELB 5xx"
    }
  },
  "_source":[
"subject",
"url"
]
}' | python -c 'import sys,json;print(json.dumps(json.loads(sys.stdin.read()),indent=4,ensure_ascii=False))'
{
    "took": 9,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1056,
        "max_score": 11.866644,
        "hits": [
            {
                "_index": "IndexName",
                "_type": "TypeName",
                "_id": "id",
                "_score": 11.866644,
                "_source": {
                    "subject": "5xxが....",
                    "url": "https://subdomain.zendesk.com/agent/tickets/ticket_id"
                }
            },
            {
                "_index": "IndexName",
                "_type": "TypeName",
                "_id": "11988",
                "_score": 11.810463,
                "_source": {
                    "subject": "ELBアラート...",
                    "url": "https://subdomain.zendesk.com/agent/tickets/ticket_id"
                }
            },
[...]

まとめ

Amazon Elasticsearch Serviceを使うことで検索をカスタマイズすることが可能になります。
今回はZendeskのデータをAmazon Elasticsearch Serviceへデータを自動でアップロードする方法をご紹介しました。

ではまた。

参考URL