Azure FunctionsでサーバレスにさくっとHipchat通知してみる


前提情報

今回やってみること

  • Azure Fuctionsを利用して、時間をトリガーにしてHipchatにメッセージをポストする

ユースケース

  • Azure Functionsを試しに使ってみたい
  • Chat Toolに時間になったらメッセージを通知したい
    • 今回はHipChatを対象にしていますが、Slack等に置き換えるのもそんなに難しくないです

書かないこと

  • Azureの詳しい説明
  • Azure Functionsの詳しい説明
  • HipChat APIの詳しい説明

手順

Hipchatから必要な情報をとってくる

以下を参考に、通知したいHipchat RoomのRoom IDとTokenを取得して下さい。

FunctionAppを作成する

Azure Portal からFunction Appを検索して作成します。

必要な情報を入力し、作成します。
もちろんARMテンプレートを流し込んで作成することも可能なので、得意な方はぜひそちらで。

しばらくすると、できあがりです。

Functionを作成する

できあがったFunction Appに関数を作成します。
レフトナビの関数の横にある「+」アイコンを押し、テンプレートを選択します。
今回はJavascript(Node.js)で、トリガーをTimerにしたいので、「TimerTrigger-JavaScript」を選択し、関数を作成します。

もうあとは基本的にはここに実装を書いていけばOKです。この画面で関数を実行してログを確認することもできるので、気軽にコードが書けてしまいます。

Node.jsのRequestモジュールをインストールする

今回HTTP Requestを送りたいので、Requestモジュールをインストールします。
Azure Functionの裏側は実はAzure WebAppと変わらないので、ちょちょいとkuduから入れてしまいます。
先程のFunctionAppの画面上にあるURLを見つけます。

そのURLのFunctionAppNameの後ろに「.scm」をつけてKuduにアクセスします。
https://${FunctionAppName}.scm.azurewebsites.net/

上部のタブの「Debug Console > CMD」をタップする。

コンソール上で以下を実行し、モジュールをインストールします。

# 異動
$ cd site/wwwroot

# モジュールインストール
$ npm init
$ npm install request --save

コードを書いて実行する

これで準備はできたので、先程の関数ページでコードを書きます。

module.exports = function(context,myTimer) {   
  if (myTimer.isPastDue) {
    context.log('JavaScript is running late!');
  }
  var request = require('request');
  var options = {
    url:     'https://api.hipchat.com/v2/room/**RoomId**/notification?auth_token=**token**'
   ,method:  'POST'
   ,headers: 'Content-type: application/json'
   ,json: {
      "from":           "Test Bot"
     ,"message":        "I love AKB48!!"     // メッセージ本文
     ,"color":          "purple"
     ,"notify":         "true"
     ,"message_format": "text"
    }
  };
  request.post(options, function (error, response, body) {
    context.log("Response Code : "+response.statusCode);
  })
  context.done();
}

今回使ったAPIについては Send room notification API Reference を参考にして下さい。

コードを実行するとログも表示されます。

たったこれだけで、実際にHipchatに通知ができました!!

Timerのトリガーを調整する

レフトナビの統合からスケジュールを設定できます。

詳しくは こちら を参考にして下さい。

感想

Preview時代にAzure Functionで遊んだことがありますが、GAされてとても使いやすくなったように感じました。
今回は時間をトリガーにしましたが、

  • Azure Blob
  • Azure Queue
  • Service Bus
  • Github
  • WebHook
  • HTTPリクエスト

などをトリガーにできるので、

  • キューをトリガーにして任意の処理を非同期で実行する
  • Blobに画像がアップロードされたらサムネイルを作成する
  • GithubへPushされたらBlobにコンテンツを配置する

などなどいろんな用途で利用できそうですね。
まわりのことはAzure Functionsがよろしくやってくれるのでメイン処理のコードに集中できそうです。