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

2018.01.10

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

はじめに

前回のブログで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