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

# 前提情報
### 今回やってみること
- Azure Fuctionsを利用して、時間をトリガーにしてHipchatにメッセージをポストする

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

### 書かないこと
- Azureの詳しい説明
- Azure Functionsの詳しい説明
- HipChat APIの詳しい説明

# 手順

## Hipchatから必要な情報をとってくる
以下を参考に、通知したいHipchat RoomのRoom IDとTokenを取得して下さい。

- https://mackerel.io/ja/docs/entry/howto/alerts/hipchat

## FunctionAppを作成する
[Azure Portal](https://portal.azure.com/) からFunction Appを検索して作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/6e7e00fe-e5c8-a09b-7590-9b39962ed57f.png)

必要な情報を入力し、作成します。
もちろんARMテンプレートを流し込んで作成することも可能なので、得意な方はぜひそちらで。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/693595be-a986-02e3-77f0-ff445d24346b.png)

しばらくすると、できあがりです。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/1adae93b-4ee6-0232-13e3-ce22db6fb071.png)

## Functionを作成する
できあがったFunction Appに関数を作成します。
レフトナビの関数の横にある「＋」アイコンを押し、テンプレートを選択します。
今回はJavascript（Node.js）で、トリガーをTimerにしたいので、「TimerTrigger-JavaScript」を選択し、関数を作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/df6be05d-01f7-7ab1-6d46-5cf834e1c252.png)

もうあとは基本的にはここに実装を書いていけばOKです。この画面で関数を実行してログを確認することもできるので、気軽にコードが書けてしまいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/55e2a63b-57a8-a36a-4b61-d81ae177b7c7.png)

## Node.jsのRequestモジュールをインストールする
今回HTTP Requestを送りたいので、Requestモジュールをインストールします。
Azure Functionの裏側は実はAzure WebAppと変わらないので、ちょちょいとkuduから入れてしまいます。
先程のFunctionAppの画面上にあるURLを見つけます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/2cfaa9c8-86e3-fb74-6117-18b877bf9cb9.png)

そのURLのFunctionAppNameの後ろに「.scm」をつけてKuduにアクセスします。
https://${FunctionAppName}**.scm**.azurewebsites.net/
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/d86eea29-7c34-fed7-87af-0412bd27a03c.png)

上部のタブの「Debug Console > CMD」をタップする。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/7c1babe8-ef42-9c32-aafe-b13fc4ea9173.png)

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

```
# 異動
$ 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](https://www.hipchat.com/docs/apiv2/method/send_room_notification) を参考にして下さい。

コードを実行するとログも表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/296a0bda-f2a4-fb6d-f9f7-a6fe094be9df.png)

たったこれだけで、実際にHipchatに通知ができました!!
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/4d46a397-8451-98c8-c0c7-cb10305e2961.png)

## Timerのトリガーを調整する
レフトナビの統合からスケジュールを設定できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/43421/df814f06-a901-5eb2-6bf2-dee62a0dbaa5.png)

詳しくは [こちら](https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer) を参考にして下さい。

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

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

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

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

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