LANG SELRCT

コードを書く場所

2019年10月24日木曜日

GASからLambdaにzendesk_idを渡してzendesk APIのGETで情報取得したい


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()を実行すると
  1. API Gatewayを通ってLambdaにhost, path, zendesk_id, zendesk_api_token_base64が渡される
  2. Lambda側のコードでzendeskのAPIのGETが実行される
  3. 指定したzendesk_idの情報が返ってくる
  4. GAS側のログに出力される


コード.gs
var 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.js
var 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;
}