Slack, 스프레드시트 및 Hubot에서 비엔지니어를 위한 운영 도구로 사용해 보기

비 엔지니어 운영자를위한 관리 화면을 만드는 것이 번거롭고,
Slack + Google 스프레드 시트로 데이터를 업데이트하는 Hubot을 만들면 상당히 좋았습니다.

예를 들어, 이런 느낌의 순위 모듈이있었습니다.



시스템이나 운용의 사정으로 자동화하지 않고, 비엔지니어의 사람이 수동으로 매주 갱신한다고 하는 사양입니다.

업데이트 흐름



1. 데이터를 Google 스프레드시트에 기입합니다.





표시하려는 콘텐츠에 해당하는 ID를 입력하십시오.

2. Slack에서 Hubot으로 업데이트합니다.





Hubot에게 멘션을 보내면

3. 끝



오퍼레이터의 작업은 이것만
평소 사용하는 도구이므로 익숙해지기 쉽습니다.

메커니즘



Slack의 멘션을 Hubot에서 받아들이고, GAS에서 스프레드시트의 내용으로부터 JSON을 생성, 그 JSON을 Static 서버에 업로드해, 그 데이터를 서비스측의 서버로부터 취득하는 흐름이 됩니다.

문자로 설명하면 모르기 때문에 아래 그림


1. 슬랙의 멘션을 받다



hubot-slack 라이브러리 로드

package.json
{
  "dependencies": {
    "hubot-slack": "^3.4.2",
    "hubot-slack-attachment": "^1.0.0",
  }
}

Slack 토큰 설정
$ HUBOT_SLACK_TOKEN="xxxxxxxxxxx"

슬랙에서 멘션을 받으려면

update.coffee
module.exports = (robot) ->
  robot.respond /ランキングデータ更新/i, (msg) ->
    console.log "更新依頼受付"

이제 ランキングデータ更新 문자열이 포함될 때 실행됩니다.

2. GAS에서 스프레드시트 데이터를 검색하는 API 만들기



이런 종류의 구성 시트가 ​​있다고 가정합니다.


monthly
weekly


11111
66666

22222
77777

33333
88888

44444
99999

55555
12345


취득 생성 코드

getRanking.gas
function doGet(e) {
  var url = "https://docs.google.com/spreadsheets/d/xxxxxx/edit#gid=0"; // 取得ファイルのURL
  var sheetName = "sheet1"; // 取得するシート名

  var book = SpreadsheetApp.openByUrl(url);
  var sheet = book.getSheetByName(sheetName);

  var json = getData(sheet);
  var res = ContentService.createTextOutput(JSON.stringify(json));

  return res.setMimeType(ContentService.MimeType.JSON);
}

function getData(sheet) {
  var monthly = [];
  var weekly = [];

  var lastRow = sheet.getLastRow();
  for(var rowIndex=2; rowIndex<=lastRow; rowIndex++) {
    var month = sheet.getRange(rowIndex, 1);
    var week  = sheet.getRange(rowIndex, 2);

    if (month.getValue()) {
      monthly.push(month.getValue());
    }
    if (week.getValue()) {
      weekly.push(week.getValue());
    }
  }

  return {"monthy":monthly, "weekly":weekly};
}

공개 → 웹 애플리케이션으로 도입 에서 API화




Hubot으로부터의 액세스가 번거롭기 때문에 우선, 全員(匿名ユーザー含む) 로 합니다.

완성 된 API를 두드리면 이러한 JSON이 반환되어야합니다.
{
  "monthy": [
    11111,
    22222,
    33333,
    44444,
    55555
  ],
  "weekly": [
    66666,
    77777,
    88888,
    99999,
    12345
  ]
}

3. Hubot에서 GAS API를 가져와 파일 저장



npm request , fs 불러오기

update.coffee
request = require 'request'
fs = require('fs')

취득 저장 코드

update.coffee
sheetApi = "https://script.google.com/macros/s/xxxxx-/exec" # GASで生成したAPI
tmpFile = "/tmp/ranking_" + new Date().getTime() + ".json" # 仮保存用ファイルのパス

request {
  url: sheetApi
}, (err, response, body) ->
  if err
    console.error err
    return

  # json形式が正しいかチェック
  JSON.parse(body)

  # ファイルとして保存
  fs.writeFileSync(tmpFile, body)

4. Hubot에서 SCP로 정적 서버로 업로드



Nginx에서 Static 서버를 준비하고 만약 Google 측에서 무언가 있었다고 해도 흡수할 수 있는 구조로 합니다.

npm scp2 로드

update.coffee
client = require("scp2")

업로드하고 성공하면 Slack에 성공 알림

update.coffee
client.scp(
  tmpFile,
  {
    host: "127.0.0.1",
    username: "username",
    password: "password",
    path: "/var/www/nginx/public/ranking.json"
  },
  (err) ->
    if err
      console.error err
      return

    data = {
      text: "ランキングデータを更新いたしました!"
      channel: "test" #通知するチャンネル名
    }
    robot.emit "slack.attachment", data
)

이 부분은 Git+capistrano라든가 하면 더 좋은 느낌이 될까 생각합니다.

5. 서비스 측에서 Static 서버의 ranking.json 얻기



평소와 마찬가지로 API를 얻는 느낌으로 쓰고 클라이언트에 표시



Slack을 인터페이스로 사용하면 사용법을 가르치기 쉽고 이해하기 쉽습니다.
오퍼레이터 업무가 Slack 위에 흐르기 때문에 갱신된 타이밍이 남는 것도 좋았습니다.
단지 포맷이 어긋나면 에러가 되거나 하기 때문에(위의 예라면 ID의 수치가 아니고, 캐릭터 라인이 들어 버린 등), 에러 체크등의 오퍼레이션 미스를 막는 구조는 무엇인가 필요합니다.

순서는 많습니다만, 로테크의 모임이므로 만드는 것은 상당히 간단합니다.
어느 쪽도 Hubot도 GAS도 ECMAScript 사양이므로 기억해야 할 것은 적습니다.
무엇보다, 이 기능을 위해서 관리 화면의 UI나 DB를 준비하지 않아도 좋은 것이 편하다.

좋은 웹페이지 즐겨찾기