かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Azure Functions でキューをきっかけに処理を走らせよう

Queue をきっかけに動く処理

Azure Functions は、いろんなものをトリガーにして動かすことが出来ます。 トリガーのリストについては、以下のドキュメントに記載があります。

Azure Functions でのトリガーとバインドの概念

とりあえず、上記ページにあるようなキューにメッセージが追加されたらテーブルに出力するものを VSCode + node.js の環境で作ってみようと思います。

作業するにあたって、Queue Storageテーブル ストレージのリファレンスページを開いてみておくとスムーズかもしれません。

関数を作成

では、node.js用の関数を作るために func new をターミナルで打ち込みます。言語は JavaScript で QueueTrigger を選択して Queue2Table という名前で作成してみました。

これで、入力が Queue Storage に関数が作られるので、これをベースに進めていきます。

とりあえず適当にこんな感じに function.json を編集してみました。

{
  "disabled": false,
  "bindings": [
    {
      "name": "input",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "myqueue-items",
      "connection": "StorageConnection"
    },
    {
      "name": "output",
      "type": "table",
      "direction": "out",
      "connection": "StorageConnection",
      "tableName": "QueueMessage"
    }
  ]
}

connection に設定している StorageConnection は local.settings.json に以下のように設定しておきます。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "Functionが使うストレージの接続文字列",
    "AzureWebJobsDashboard": "Functionが使うストレージの接続文字列",
    "FUNCTIONS_EXTENSION_VERSION": "~1",
    "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "Functionが使うストレージの接続文字列",
    "WEBSITE_CONTENTSHARE": "なんか入ってるはず",
    "WEBSITE_NODE_DEFAULT_VERSION": "6.5.0"
  },
  "ConnectionStrings": {
    "StorageConnection": "ここにストレージの接続文字列"
  }
}

あとは、index.js を書くだけです。とりあえず入力をそのまま出すようにしてみました。

module.exports = function (context) {
    context.bindings.output = {
        PartitionKey: "Queue",
        RowKey: Date.now().toString(),
        Value: context.bindings.input
    };
    context.done();
};

できたので以下のコマンドでテストしてみます。

func run -c 'Hello world'

こんな出力が出ました。

PS C:\Users\kaota\Documents\Visual Studio Code\Projects\funcedu> func run Que
ue2Table -c 'Hello world'

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: Accepted

Storage Explorer を使ってテーブルを見てみるとデータが入っていました。OK。配備してみましょう。

func azure functionapp publish OkazukiNodeJSEdu

ストレージへの接続文字列を追加します。 ポータルで作成した Function App の名前を選んで(今回の場合は OkazukiNodeJSEdu)概要タブの構成済みの機能にあるアプリケーション設定を選びます。

見慣れた App Service のアプリケーション設定の画面が出てくるので、ここの接続文字列に StorageConnection という名前で適当な本番用ストレージへの接続文字列をカスタムで作ります。

Storage Explorer とか適当なツールを使って myqueue-items キューに適当な値を突っ込みます。そうすると、テーブルストレージに行が追加されるはずです。

割と簡単でしたね。