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;
}
|