かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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 キューに適当な値を突っ込みます。そうすると、テーブルストレージに行が追加されるはずです。

割と簡単でしたね。