ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

サーバー不要! タイマー+スクリプトで定期処理を自動化

こんにちは。ニフティクラウドでエンジニアをしている竹内です。

先日、10月25日(火) にリリースされた新機能「ニフティクラウド スクリプト」を利用し、タイマーと組み合わせることによって定期処理を実現してみたのでご紹介します!

仕組み

ニフティクラウド スクリプトでは、任意のnode.jsコードを保存しておき、実行させることができます。さらにニフティクラウド タイマーを組み合わせれば、その作成したスクリプト定期的に実行させることが可能です。

これにより、定期的に外部APIからなんらかの情報を取得し、加工した上で別の外部APIを呼び出すという仕組みを自前でサーバーを運用することなく実現することができます。

今回は、身近な素材として「定期的にSlackのチャンネル一覧を取得し、チャンネルメンバーが多い順に並び替え、Slackにランキングをポストする」という処理を実現してみました。

金曜の夜に指定したチャンネルへスクリーンショットのような投稿が行われるようになるイメージです(そこまで実用的な例ではありませんが、利用の雰囲気は伝わるのではないかと思います)。

設定の仕方

まず、スクリプト側で下記の内容でスクリプトを作成します(スクリプトの作成方法については、ユーザーガイド スクリプト:スクリプトの作成をご参照ください)。名前はchannel-ranking.jsとしておきます。

channel-ranking.js:

// ニフクラタイマーで週 1 実行
const request = require("superagent")
const _ = require("lodash")
const BANNER = ":crown: Slack チャンネル メンバー数ランキング"
const ENDPOINT = "YOUR SLACK ENDPOINT"
const TOKEN = "YOUR TOKEN"
const INCOMING_URL = "YOUR INCOMING URL"

module.exports = (req, res)=> {
  getChannels().then((channels)=> {
    return postMessage(makeRankingText(channels));
  }).then(()=> {
    res.send("ok");
  }).catch((err)=> {
    res.send("ng");
  });
};

const getChannels = ()=> {
  return new Promise((resolve, reject) => {
    request.get(ENDPOINT + "channels.list?token=" + TOKEN).end((err, res)=> {
      if(err) return reject(err);
      return resolve(res.body.channels);
    })
  });
};

const makeRankingText = (channels)=> {
  let lines = [BANNER]
  _.sortBy(channels, (o)=> { return -o.num_members })
  .slice(0, 10)
  .forEach((channel, i)=> {
    lines.push(`* ${i+1}: ${channel.name} (${channel.num_members})`)
  });
  return lines.join(String.fromCharCode(10));
};

const postMessage = (text)=> {
  return new Promise((resolve, reject) => {
    request.post(INCOMING_URL).send({"text": text}).end((err, res)=> {
      if(err) return reject(err);
      return resolve(res);
    });
  });
};

ちなみに、技術仕様 スクリプトを参考に利用可能なライブラリの中から、lodashとsuperagentを使ってみました。

次にタイマー側でスクリプトを定期実行する設定を行います(タイマーの作成方法については、ユーザーガイド タイマー:HTTPリクエストでサーバーを作成するをご確認ください)。ここでは毎週金曜日の18時に実行する設定を行っています。

以上の操作で毎週、Slackチャンネルのメンバー数ランキングが指定したチャンネルへ投稿されるようになります。

まとめ

自前でサーバーを構築・運用することなく、非常に簡単なコンパネの操作だけで、定期処理を実現できることがお分かりいただけたと思います。今回はSlackの操作しか行っていませんが、他にも下記のようにさまざまな活用方法が考えられます。

  • ニフティクラウドの監視系APIをコールした結果を整形し、定期的にmackerelに連携
  • データベース内の情報を集計し、週次でチームのメーリングリストへ売り上げ情報を送信
  • 毎日深夜帯に比較的サイズの小さいデータをバックアップ

イデア次第で今までサーバーで動いていたバッチをタイマー+スクリプトに置き換えたり、新たな定期処理を追加して仕事を効率化できそうですね。 ぜひ、タイマー+スクリプトの連携をお試しください!