Zendesk トリガーのバックアップをLambdaのイベント起動でS3保管してみました

2017.02.07

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

ベルリンの半瀬です。久々の投稿です。

はじめに

変わらずZendeskの話題です。
チケットを特定の条件によって判別し、様々なアクションを実行させるZendeskの「トリガー」は、「お問い合わせ難易度に応じた担当者の割り当て」や「緊急度の判定」などを自動で行うことができ、クラスメソッド オペレーションチームに欠かせない機能となっています。
しかしその重要度に反し、設定ミスなどに備えたバックアップができていない状況でした。

というわけで、ひとまずlambdaで回して直近の設定を保管することにしました。
以下を参考。

やってみます

事前設定

curlを確認に利用しますので、こちらを参考に環境を準備します。
また、Zendesk APIキーも必要です。 こちらを見て準備しておきます。

APIの確認

既存トリガーの出力をしてみます。/api/v2/triggers.jsonを叩きます。
すると、以下のようにJSON形式の出力でつらつらと並びます。

# curl https://{subdomain}.zendesk.com/api/v2/triggers.json -v -u {email_address}/token:{api_token} | jq . 
...
{
  "triggers": [
    {
      "url": "https://{subdomain}.zendesk.com/api/v2/triggers/{trigger_id}.json",
      "id": {trigger_id},
      "title": "XXXXXX",
      "active": true,
      "updated_at": "2017-01-31T18:11:07Z",
      "created_at": "2017-01-16T12:41:27Z",
      "actions": [
        {
          "field": "assignee_id",
          "value": "current_user"
        }
      ],
      "conditions": {
        "all": [
          {
            "field": "update_type",
            "operator": "is",
            "value": "Change"
          },
          {
            "field": "current_via_id",
            "operator": "is",
            "value": "email"
          },
          {
            "field": "assignee_id",
            "operator": "is",
            "value": ""
          },
          {
            "field": "role",
            "operator": "is_not",
            "value": "end_user"
          }
        ],
        "any": []
      },
      "position": {positon},
      "raw_title": "XXXXXX"
    }
  ],
  "next_page": null,
  "previous_page": null,
  "count": 18
}

その他: アクティブなもののみを出力するなど

active.jsonをたたくと、アクティブなもののみ出力ができます。

# curl https://{subdomain}.zendesk.com/api/v2/triggers/active.json -v -u {email_address}/token:{api_token} | jq .
...
(出力は割愛します)

また、トリガー同様に「自動化」に関しても、以下のAPIで得られます。

# curl https://{subdomain}.zendesk.com/api/v2/automations.json -v -u {email_address}/token:{api_token} | jq .
# curl https://{subdomain}.zendesk.com/api/v2/automations/active.json -v -u {email_address}/token:{api_token} | jq .

Lambda設定

上記のAPI出力結果をS3に保管します。以下のようなpythonスクリプトを用意します。

from __future__ import print_function

import datetime
import boto3
import os
import requests
from requests.auth import HTTPBasicAuth

s3 = boto3.client('s3')

# Zendesk
ZEN_SUBDOMAIN = '<<Zendeskサブドメイン>>'
ZEN_API_PATH = 'api/v2/triggers.json'
ZEN_AUTHUSER = '<<API発行元管理者メールアドレス>>/token'
ZEN_AUTHPASS = '<<APIトークン>>'

# S3
S3_BUCKET = 'test-zendesk-export'

def lambda_handler(event, context):
   now = datetime.datetime.now()

   URL = 'https://' + ZEN_SUBDOMAIN + '.zendesk.com/' + ZEN_API_PATH
   S3_KEY = now.strftime('%Y%m') + '/' + now.strftime('%d') + '/' + now.strftime('%Y%m%d%H%M%S') + '_triggers.json'
   
   response = requests.get(URL, auth=HTTPBasicAuth(ZEN_AUTHUSER, ZEN_AUTHPASS))
   put = s3.put_object(
      Body=response.text,
      Bucket=S3_BUCKET,
      Key=S3_KEY
   )

S3バケット「test-zendesk-export(任意)」とS3アップロードのためのRoleを用意し、Lambdaを配置したらCloudwatch Events ルールで定期的に実行しておきます。 このスクリプトでは、出力はバケット配下に「年月/日/ファイル名.json」というような並びとなります。
また、必要に応じてS3ライフサイクルを決めておくと良いかと思います。

最後に

これで最低限のバックアップは用意できました。
管理更新をすべてjsonで行ないたいという展望はあるのですが、さしあたって簡単なところから攻めてみました。

次回以降で復旧や更新を確認していきたいと思います。

それではー。