Node.js
AzureFunctions
DurableFunctions

Durable Functions Getting Started - Node.js

Node.js の Durable Functions は、現在プレビューですので、C# のものと比べると、プレビューですので機能制限があることをご了承ください。

前提条件

本チュートリアルでは、下記のツールがインストールされていることを前提としています。

また、Azure Functions 拡張機能をインストールする
のページを参考にして

をインストールしておきましょう。

Azure Functions プロジェクトを作成する

Visual Studio Code で、Azure ロゴを選択して [Azure: Functions] 領域を表示し、[新しいプロジェクトの作成] アイコンを選択します。

azure-functions-window-vscode.png

プロジェクト ワークスペースの場所を選択し、[選択] をクリックします。

create-function-app-project.png

本チュートリアルでは、JavaScript を選択します。

create-function-app-project-language.png

メッセージが表示されたら、Add to workspace を選択します。
Visual Studio Code によって、新しいワークスペースに関数アプリ プロジェクトが作成されます。 このプロジェクトには、host.json および local.settings.json 構成ファイルと、言語固有のプロジェクト ファイルが含まれています。 プロジェクト フォルダーに新しい Git リポジトリも取得します。

Durable Functions 拡張のインストール

選択したプロジェクト ワークスペースのディレクトリで次のコマンドを実行して、Durable Functions 拡張をインストールします。func コマンドは自動的にダウンロードされますが、もし、なければ、Azure Functions Core Tools(v2)をインストールしてから実行してください。

func extensions install -p Microsoft.Azure.WebJobs.Extensions.DurableTask -v 1.6.2

次に NPMパッケージをインストールします。これで準備が環境しました。

npm install durable-functions

local.settings.json

生成されている local.settings.json を変更します。プロジェクトのストレージとして、ストレージエミュレータを使っています。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node"
  }
}

Mac の場合は、ストレージエミュレータがありませんので、次のブログを参照ください。

関数の作成

Durable Functions の各種の関数を作成していきます。関数は、ワークスペースに、関数名のディレクトリと、index.js 及び function.json を作成することで、関数を書くことができます。基本的なワークスペースの構成は次のようになります。

.
│   .gitignore
│   host.json
│   local.settings.json
│   proxies.json
│
├───.vscode
│       extensions.json
│       launch.json
│       settings.json
│       tasks.json
│
├───E1_HelloSequence
│       function.json
│       index.js
│
├───E1_SayHello
│   │   function.json
│   │   index.js
│   │
│   └───.vscode
│           launch.json
│
└───HttpStart
        function.json
        index.js

HelloStart 関数

オーケストレーションを始める窓口として、Http を受け付ける関数を作ります。

mkdir HelloStart
cd HelloStart

このHelloStart ディレクトリの中に index.jsfunctions.js を作成します。

index.js

関数の本体です。context.bindings.startArgs に、FunctionName, Input, InstanceId を引き渡すことで、オーケストレーションを開始します。FunctionName は、オーケストレーション関数の名前です。

const uuidv1 = require("uuid/v1");

module.exports = function (context, req) {
    const id = uuidv1();

    let startArgs = [{
        FunctionName: req.params.functionName,
        Input: req.body,
        InstanceId: id
    }];

    context.bindings.starter = startArgs;

    context.done(null, {status: 202, body: id});
};

function.json

関数の設定ファイルです。HttpTrigger の設定に加えて、orchestrationClient タイプのバインディングスを定義します。この設定により、この関数がオーケストレーション関数を実行可能なクライアントになります。


{
    "bindings": [
      {
        "authLevel": "anonymous",
        "name": "req",
        "type": "httpTrigger",
        "direction": "in",
        "route": "orchestrators/js/{functionName}",
        "methods": ["post"]
      },
      {
        "name": "$return",
        "type": "http",
        "direction": "out"
      },
      {
        "name": "starter",
        "type": "orchestrationClient",
        "direction": "out"
      }
    ],
    "disabled": false
  }

E1_HelloSequence

同様に、E1_HelloSequence 関数を作成します。

cd ..
mkdir E1_HelloSequence
cd E1_HelloSequence

index.js

オーケストレータ関数です。yield context.df.callActivity("関数名", "引数") を実行することで、アクティビティ関数を呼び出します。メソッドの呼び出しに見えますが、背後ではQueue によりメッセージが送信されており、アクティビティ関数が起動します。

const df = require("durable-functions");

module.exports = df.orchestrator(function*(context){
    context.log("Starting chain sample");
    const output = [];
    output.push(yield context.df.callActivity("E1_SayHello", "Tokyo"));
    output.push(yield context.df.callActivity("E1_SayHello", "Seattle"));
    output.push(yield context.df.callActivity("E1_SayHello", "London"));

    return output;
});

function.json

orchestrationTrigger をタイプに設定することで、オーケストレーション関数になります。


{
    "bindings": [
      {
        "name": "context",
        "type": "orchestrationTrigger",
        "direction": "in"
      }
    ],
    "disabled": false
  }

E1_SayHello 関数

アクティビティ関数と呼ばれる関数で通常の Azure Functions と同じです。オケストレーション関数からメッセージを受けて起動します。

cd ..
mkdir E1_SayHello
cd E1_SayHello

index.js

通常の関数とかわりません。引数の context に オーケストレータからもらった引数が格納されます。この関数の戻り値が、オーケストレータ関数に戻されます。これも Queue 経由でメッセージが送信されます。

module.exports = function(context) {
    context.done(null, `Hello ${context.bindings.name}!`);
};

function.json

アクティビティ関数は、activityTrigger をタイプとして設定します。

{
    "bindings": [
      {
        "name": "name",
        "type": "activityTrigger",
        "direction": "in"
      }
    ],
    "disabled": false
  }

これでコーディングは完了です。VSCode から実行してみましょう。

関数実行のデバッグ実行

左側の虫のアイコンのデバッグアイコンをクリックし、Attach to JavaScript をクリックします。Azure Functions が起動し、最後にアクセス先のURLが出てきます。ブレークポイントを設置すればデバッグ実行も可能になります。

Debug.JPG

Postmanなどから、http://localhost:7071/api/orchestrators/js/E1_HelloSequence をPOST リクエストで送信します。

Postman.JPG

VSCode をみると実行されている結果が確認できます。

execute.JPG

実行結果の確認

残念ながら現在のプレビューでは、実施のステータスを見る良い方法はありませんが、Storage Explorerをインストールすると実行結果を見ることができます。プロダクトチームによると近日中に、新しいクライアントがリリースされるので、それを楽しみにまっておきましょう。この手順は 2018/11/7時点での方法です。

storage.JPG

実行が想定と違ったら、ストレージエミュレータのデータを削除してみましょう。Storage Emulator を起動して次のコマンドを実行します。

AzureStorageEmulator.exe clear all

次のステップ

リソース