Azure Functions Queueトリガーを使う

#はじめに
[Azure Functionsをローカル環境でデバッグ](http://qiita.com/tworks55/items/281beeea5fd6c105b0b1)の記事の続きです。今回はAzure StorageのQueueにメッセージが入ったらFunctionが起動するというのを試します。

#動作確認環境
OS: Window 10
Node.js: v4.4.7 
npm:3.10.6
Visual Studio Code: 1.7.2

#1. QueueTrigger-JavaScriptテンプレートでfunctionを作成
`func new`で以下のようにfunctionを作成します。

```
c:\dev\azure\AzureFunctionsDemo>func new

     _-----_
    |       |    ╭──────────────────────────╮
    |--(o)--|    │   Welcome to the Azure   │
   `---------´   │   Functions generator!   │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? Select an option... List templates by language
There are 8 languages available
? Select a language... JavaScript
There are 16 templates available
? Select from one of the available templates... QueueTrigger-JavaScript
? Enter a name for your function... QueueTriggerJS
Creating your function QueueTriggerJS...
Location for your function...
c:\dev\azure\AzureFunctionsDemo\QueueTriggerJS
```

#2. appsettings.jsonとfunction.jsonの設定
Storage Emulatorを使いローカル環境で試す設定をします。

```appsettings.json
{
    "IsEncrypted": false,
    "Values": {
        "LocalStorage": "UseDevelopmentStorage=true"
    }
}
```

QueueTriggerJSフォルダにあるfunction.jsonの"connection"に"LocalStorage"を設定します。

```
{
    "disabled": false,
    "bindings": [
        {
            "name": "myQueueItem",
            "type": "queueTrigger",
            "direction": "in",
            "queueName": "js-queue-items",
            "connection":"LocalStorage"
        }
    ]
}
```

#3. QueueTriggerJS functionの実行

`func run`コマンドに-cパラメーターで疑似メッセージを送信します。
*オプションの詳細は[こちら](https://www.npmjs.com/package/azurefunctions)を参照。

```
c:\dev\azure\AzureFunctionsDemo>func run .\QueueTriggerJS\ -c "I love this CLI!"

We need to launch a server that will host and run your functions.
The server will auto load any changes you make to the function.
Do you want to always display this warning before launching a new server [yes/no]? [yes]

Response Status Code: OK
```

Function実行Windowでは以下のように「I love this CLI!」が表示されます。

```
Listening on http://localhost:7071/
Hit CTRL-C to exit...
Reading host configuration file 'c:\dev\azure\AzureFunctionsDemo\host.json'
Generating 2 job function(s)
Starting Host (HostId=143dd58f1aa24ce08c93c3ee016963ae, Version=1.0.0.0, ProcessId=10608, Debug=True)
Found the following functions:
Host.Functions.HttpTrigger-JS
Host.Functions.QueueTriggerJS

Job host started
Http Function HttpTrigger-JS: http://localhost:7071/api/HttpTrigger-JS
Executing: 'Functions.QueueTriggerJS' - Reason: 'This function was programmatically called via the host APIs.'
Function started (Id=74280a2b-6a45-4016-9bd2-f791fb06eb72)
Debugger listening on [::]:5858
JavaScript queue trigger function processed work item I love this CLI!
Function completed (Success, Id=74280a2b-6a45-4016-9bd2-f791fb06eb72)
Executed: 'Functions.QueueTriggerJS' (Succeeded)
```

#4. ローカル環境でQueueの作成とメッセージの登録
Azure Storage Explorerを起動し、function.jsonに記載されているQueue(js-queue-items)を作成します。
*Azure Storage Explorerの使い方は[こちら](http://qiita.com/tworks55/items/4f4dadfd890232e162d3)を参照。

作成したQueue(js-queue-items)を選択し、+Addボタンをクリックしてメッセージを登録します。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/1651d18c-2691-436d-dbae-10648ddfbfb3.png)

メッセージ入力ダイアログで適当なメッセージを入力しOKをクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/c4d4cec5-d3ff-56a9-f4e4-40b35cee6c79.png)

メッセージ登録後はこのようになりますが、QueueTriggerJS functionを起動していれば、Queueから直ぐにメッセージが取り出されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/5a938386-08a6-8244-ce15-5a65cd2174e6.png)

メッセージを取り出すと以下のような情報がFunction実行中Windowに表示されます。

```
Function started (Id=44c1ccdb-e30c-464a-8f0b-80234b2e9fd3)
JavaScript queue trigger function processed work item Hello World!
Function completed (Success, Id=44c1ccdb-e30c-464a-8f0b-80234b2e9fd3)
Executed: 'Functions.QueueTriggerJS' (Succeeded)
```

*Queueからメッセージを取り出すサイクルが遅い場合は、host.jsonに以下の設定を追加すると良いようです。

```
{
     "queues": {
        "maxPollingInterval": 2000
     }
}
```

#5. Azure環境でQueueの作成とメッセージの登録
Azure環境でQueueを作成する場合もAzure Storage Explorerを使用します。
*Azure Storage Explorerの使い方は[こちら](http://qiita.com/tworks55/items/4f4dadfd890232e162d3)を参照。

Queueを作成したらストレージアカウントを選択しConnection Stringの情報を取得します。
![image](https://qiita-image-store.s3.amazonaws.com/0/131481/192856be-83c4-0ea2-4cbd-c17aecf3a046.png)

それをappsettings.jsonに"AzureWebJobsStorage"として追記し、function.jsonの"connection"も変更します。

```appsettings.json
{
    "IsEncrypted": false,
    "Values": {
        "LocalStorage": "UseDevelopmentStorage=true",
        "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=functionxxxxxxxxxxxx;AccountKey=yyyyyyyyyyy+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    }
}
```

```function.json
{
    "disabled": false,
    "bindings": [
        {
            "name": "myQueueItem",
            "type": "queueTrigger",
            "direction": "in",
            "queueName": "js-queue-items",
//            "connection":"LocalStorage"
            "connection":"AzureWebJobsStorage"
        }
    ]
}
```

AzureのQueue(js-queue-items)にメッセージを登録すると、QueueTriggerJS functionを起動していれば、ローカル環境で実行した際と同様にQueueから直ぐにメッセージが取り出されます。

#続編
~~次回はFunctionをAzureにデプロイするところまでやってみます。~~ 
[Azure Functionsをローカル環境からAzure環境にデプロイ](http://qiita.com/tworks55/items/18b816a21a1125e9022a)

#参考URL
[Running Azure Functions Locally with the CLI and VS Code](https://blogs.msdn.microsoft.com/appserviceteam/2016/12/01/running-azure-functions-locally-with-the-cli/)
[Azure Functions における Azure Storage のトリガーとバインド](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage)
[Azure Storage の接続文字列を構成する](https://docs.microsoft.com/ja-jp/azure/storage/storage-configure-connection-string)