zendeskにIP制限がかかっているとGASからは zendesk APIにアクセスできない。
Lambdaを利用するとIP固定ができるので
GAS→Lambda→zendesk API という順番でやってみたときの備忘録です。
GAS側のコード
hostとendPointは各々の設定
- hostは利用しているzendeskのURL
- endPointはAPI GatewayのURL
- zendesk_idは取得したいチケットのid
getZendeskInfo()を実行すると
- API Gatewayを通ってLambdaにhost, path, zendesk_id, zendesk_api_token_base64が渡される
- Lambda側のコードでzendeskのAPIのGETが実行される
- 指定したzendesk_idの情報が返ってくる
- GAS側のログに出力される
コード.gsvar host = 'SITENAME.zendesk.com'; var endPoint = 'https://API_ID.execute-api.us-east-1.amazonaws.com/default/FUNCTION_NAME'; function getZendeskInfo() { var zendesk_id = 2; var response = run(zendesk_id); Logger.log(response); } function run(zendesk_id) { var path = '/api/v2/tickets/' + zendesk_id + '.json';// zendesk_idを指定して取得したい場合 //var path = '/api/v2/search.json?page=1&query=created%3E2019-01-01%20type:ticket'; // queryで取得したい場合 var payload = { 'data':{ 'host': host, 'path': path, 'zendesk_id': zendesk_id, 'zendesk_api_token_base64': getProp('zendesk_api_token_base64') } } var options = { 'method': 'post', 'headers': get_headers(), 'contentType': 'application/json', 'payload': JSON.stringify(payload) } Logger.log(options) var response = UrlFetchApp.fetch(endPoint, options); console.log(response); return response; } function get_headers() { var headers = { "x-api-key": getProp('x_api_key') } return headers; } function getProp(key) { return PropertiesService.getScriptProperties().getProperty(key); } |
Lambda側のコード
index.jsvar https = require('https'); var zendesk_id; var zendesk_api_token_base64; var host; var path; exports.handler = async function(event) { console.log(event); /****** pyloadで受け取る場合 ******/ var body = event['body']; var jobj = JSON.parse(body); host = jobj['data']['host'] path = jobj['data']['path'] zendesk_id = jobj['data']['zendesk_id'] zendesk_api_token_base64 = jobj['data']['zendesk_api_token_base64'] console.log([zendesk_id]); var results = await getData(zendesk_id); //getData()の処理が終わってから次の処理を実行する var json = returnJson(results); return json; } //Promise function getData() { return new Promise(resolveFunc); } //Promise resolved function resolveFunc(arg) { https.get(getOptions(), function(res) { var body = ''; //res.setEncoding('utf8'); res.on('data', function(chunk) { body += chunk; }); res.on('end', function(chunk) { arg(body); }); res.on('error', function(e) { console.log(e.message); arg(e.message); }); }); //ここまでの処理をPromiseでやりたい } function getOptions() { var options = { "method": 'GET', "host": host, "path": path, "headers": { "Content-type": "application/json", "Authorization": " Basic " + zendesk_api_token_base64// Lambda側に設定して読む場合はprocess.env. zendesk_api_token_base64 } }; return options; } //JSONを返す function returnJson(results) { const response = { //body: JSON.stringify(result), body: results, }; return response; } |