この記事は公開されてから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で行ないたいという展望はあるのですが、さしあたって簡単なところから攻めてみました。
次回以降で復旧や更新を確認していきたいと思います。
それではー。