演習 - Durable Functions を使用してワークフローを作成する

完了

この演習では、前のユニットのシナリオ例を使用して、Durable Functions を使用して Azure portal で承認ワークフローを作成する方法を学習します。

関数アプリを作成する

  1. サンドボックスのアクティブ化に使用したのと同じアカウントを使用して 、Azure portal にサインインします。

  2. Azure portal メニューまたは ホーム ページの Azure サービスで、[ リソースの作成] を選択します。 [ リソースの作成 ] ウィンドウが表示されます。

  3. 関数アプリを検索して選択します。 [従量課金] を選んでから、[選択] ボタンを選びます。 [ 関数アプリの作成 ] ウィンドウが表示されます。

  4. [ 基本 ] タブで、各設定に次の値を入力します。

    設定 価値 説明
    プロジェクトの詳細
    サブスクリプション コンシェルジェ サブスクリプション この新しい関数アプリを作成するサブスクリプションを指定します。
    リソース グループ ドロップダウン リストから 、[サンドボックス リソース グループ名] を選択します 関数アプリを作成するリソース グループの名前を指定します。 サンドボックスのアクティブ化時に割り当てられたサンドボックス リソース グループ内に関数アプリを作成します。つまり、[ サンドボックス リソース グループ名]
    インスタンスの詳細
    関数アプリ名 [グローバルに一意の名前] 新しい関数アプリを識別する名前を指定します。 有効な文字は、a-z0-9、および - です。
    公開する "コード" 関数がコンテナーの代わりにコードを使用することを指定します。
    ランタイム スタック Node.js このモジュールのサンプル コードを JavaScript で記述することを指定します。
    バージョン 20 LTS ランタイム スタックのバージョンを指定します。
    リージョン [このセクションの後の一覧から選択] 自分に最も近いリージョンを選択します。これは、後に続く許可される サンドボックス リージョン の 1 つでもあります。
    オペレーティング システム
    オペレーティング システム ウィンドウズ 関数アプリをホストするオペレーティング システムを指定します。
    計画

    無料のサンドボックスを使用すると、Azure グローバル リージョンのサブセットにリソースを作成できます。 リソースを作成するときは、次のリストからリージョンを選択します。

    • 米国西部 2
    • 米国中南部
    • 米国中部
    • 米国東部
    • 西ヨーロッパ
    • 東南アジア
    • 東日本
    • ブラジル南部
    • オーストラリア南東部
    • インド中部
  5. [次へ: ストレージ] を選択します。

  6. [ ストレージ ] タブで、設定ごとに次の値を入力します。

    設定 価値 説明
    貯蔵
    ストレージ アカウント [グローバルに一意の名前] 関数アプリで使用される新しいストレージ アカウントの名前を指定します (関数に指定したグローバルに一意の名前と一致する必要はありません)。 ストレージ アカウント名の長さは 3 ~ 24 文字で、数字と小文字のみを使用できます。 このダイアログでは、動的に生成される一意の名前がフィールドに自動的に設定されます。 ただし、別の名前または既存のアカウントを自由に使用できます。
  7. [次へ: ネットワーク] を選択します。 既定値を受け入れます。

  8. [ 次へ: 監視] を選択します。

  9. [ 監視 ] タブで、設定に次の値を入力します。

    設定 価値 説明
    Application Insights
    Application Insights を有効にする いいえ このモジュールで Application Insights が無効になっていることを指定します。
  10. [ 確認と作成 ] を選択し、構成したオプションを確認します。 オプションに問題がなければ、[ 作成 ] を選択して関数アプリをプロビジョニングしてデプロイします。

デプロイが完了するまで待ってから次に進みます。 デプロイには数分かかる場合があります。

durable-functions npm パッケージをインストールする

JavaScript Durable Functions を作成しているため、 durable-functions npm パッケージをインストールする必要があります。 これを行うには、次の手順を実行します。

  1. [ リソースに移動] を 選択して、関数アプリを選択します。 関数アプリのウィンドウが表示されます。

  2. 左側のメニュー ウィンドウの [ 開発ツール] で、[ App Service エディター (プレビュー)] を選択し、[ エディターを開く] を選択します。 App Service エディターのクイック スタート ウィンドウが新しいブラウザー ウィンドウに表示されます。

  3. 左側のメニュー ウィンドウで、 WWWROOT フォルダーを強調表示します。

  4. 左側のツール バー メニューで、[ コンソールを開く ] アイコンを選択します。

    この操作により、コンソールが起動します。 このコンソールを使用して、関数をホストする Web サーバーにアクセスし、関数のコードを記述できます。

  5. 新しい package.jsonファイルを 作成します。

    • コンソールで次のコマンドを実行して、新しい JSON ファイルを作成し、エディターで開きます。

      touch package.json
      open package.json
      
    • 次のコードを追加します。

      {
        "name": "example",
        "version": "1.0.0"
      }
      

      exampleをパッケージの名前に置き換えます。 たとえば、前に関数に指定したグローバルに一意の名前を使用できます。

  6. Ctrl + S キーを押してファイルを保存し、Ctrl + Q キーを押してドキュメントを閉じます。

  7. Azure portal に戻ります。

  8. 左側のメニュー バーの [ 開発ツール] で、[ コンソール] を選択します。 関数アプリの コンソール ウィンドウが表示されます。

  9. 次のコマンドを実行します。

    npm install durable-functions
    

    このコマンドは、 durable-functions パッケージと必要な依存関係をインストールするようにノード パッケージ マネージャーに指示します。 インストールが完了するまでに数分かかる場合があり、ノード パッケージ マネージャーに警告が表示されることがありますが、これは無視してかまいません。

    新しいバージョンの npm をインストールするように求められた場合は、エラーで指定されたコマンドを使用して新しいバージョンをインストールし、新しいバージョンがインストールされたら、 durable-functions パッケージをインストールします。

    すべてのパッケージのインストールが完了するまで待ちます。

  10. 左側のメニュー ウィンドウで、上にスクロールして [概要] を選択し、上部のメニュー バーで [再起動] を選択し、 再起動を求められたら [はい ] を選択します。

    再起動が完了するまで待ってから次に進みます。

デザイン提案を送信するためのクライアント関数を作成する

  1. Azure portal のメニューまたは ホーム ページの [ 最近使用したリソース] で、[ すべて表示] を選択し、関数アプリを選択します。 関数アプリのウィンドウが表示されます。

  2. [概要] ページで、画面の中央にある [ 関数 ] タブを選択します。

  3. [ Azure portal で作成 ] ボタンを選択します。 [ 関数の作成 ] ウィンドウが表示されます。

  4. [ テンプレートの選択] の [ フィルター ] ボックスに「 Durable Functions HTTP starter 」と入力し、一覧からそのテンプレートを選択します。 このテンプレートは、HTTP 要求に応答して実行される永続的な関数を作成します。

  5. [ テンプレートの詳細] の [ 新しい関数 ] フィールドに、関数の名前として 「HttpStart」 と入力し、[ 承認レベル ] フィールドで [ 関数] を選択し、[ 作成] を選択します。 関数の HttpStart ペインが表示されます。

  6. 左側のメニュー ウィンドウの [ 開発者] で、[ コード + テスト] を選択します。 関数の [コード + テスト ] ウィンドウが表示されます。

    index.js ファイルのコードがエディターに表示されます。 ファイルは次の例のようになります。

    const df = require("durable-functions");
    
    module.exports = async function (context, req) {
        const client = df.getClient(context);
        const instanceId = await client.startNew(req.params.functionName, undefined, req.body);
    
        context.log(`Started orchestration with ID = '${instanceId}'.`);
    
        return client.createCheckStatusResponse(context.bindingData.req, instanceId);
    };
    
  7. 関数内のファイルのドロップダウン リストで、 function.json を選択して、新しい関数に関連付けられているバインドを表示します。 この情報は、関数をトリガーできる HTTP メソッドと共に、認証要件を指定します。 このファイルは、関数がオーケストレーション プロセスを開始するクライアントであることを指定します。 ファイルは次の例のようになります。

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

    バインディングは、リソースやその他の項目をトリガーに関連付けます。 これは宣言型のメカニズムであり、コード内の他のサービスや関数への参照をハードコーディングする必要がなくなります。

オーケストレーター関数を作成する

  1. Azure portal のメニューまたは ホーム ページの [ 最近使用したリソース] で、[ すべて表示] を選択し、関数アプリを選択します。 [関数アプリ] ウィンドウが表示されます。

  2. [ 概要 ] ページで、画面の中央にある [ 関数 ] タブを選択します。

  3. [関数] メニュー バーで、[作成] を選択します。 [ 関数の作成 ] ウィンドウが表示されます。

  4. [ テンプレートの選択] の [ フィルター ] ボックスに「 Durable Functions オーケストレーター 」と入力し、一覧からそのテンプレートを選択します。 このテンプレートは、関数の実行を調整する永続的な関数を作成します。

  5. [ テンプレートの詳細] の [ 新しい関数 ] フィールドに、関数の名前として 「OrchFunction 」と入力し、[ 作成] を選択します。 OrchFunction 関数ウィンドウが表示されます。

  6. 左側のメニュー ウィンドウの [ 開発者] で、[ コード + テスト] を選択します。 関数の [コード + テスト ] ウィンドウが表示されます。

    index.js ファイルのコードがエディターに表示されます。

  7. 既存のコードを次のコードに置き換えます。

    const df = require("durable-functions");
    
    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
    
        /*
        * We will call the approval activity with a reject and an approved to simulate both
        */
    
        outputs.push(yield context.df.callActivity("Approval", "Approved"));
        outputs.push(yield context.df.callActivity("Approval", "Rejected"));
    
        return outputs;
    });
    

    このコードは、すぐに作成する Approval という名前の Activity 関数を呼び出します。 オーケストレーター関数のコードは 、Approval 関数を 2 回呼び出します。 1 回目は提案の受け入れをシミュレートし、2 回目は提案拒否ロジックをテストします。

    各呼び出しで返される値が結合され、クライアント関数に返されます。 運用環境では、オーケストレーション関数は、受け入れ/拒否の決定を行い、これらのアクティビティの結果を返す一連のアクティビティ関数を呼び出します。

  8. 上部のメニュー バーで、[ 保存] を選択して新しい関数を保存します。

アクティビティ関数を作成する

  1. Azure portal のメニューまたは ホーム ページの [ 最近使用したリソース] で、[ すべて表示] を選択し、関数アプリを選択します。 [関数アプリ] ウィンドウが表示されます。

  2. [ 概要 ] ページで、画面の中央にある [ 関数 ] タブを選択します。

  3. [関数] メニュー バーで、[作成] を選択します。 [ 関数の作成 ] ウィンドウが表示されます。

  4. [ テンプレートの選択] の [ フィルター ] ボックスに「 Durable Functions アクティビティ 」と入力し、一覧からそのテンプレートを選択します。 このテンプレートを使用すると、オーケストレーター関数によってアクティビティが呼び出されたときに実行される永続関数が作成されます。

  5. [ テンプレートの詳細] の [ 新しい関数 ] フィールドに、関数の名前に 「承認 」と入力し、[ 作成] を選択します。 関数アプリの [承認 ] ウィンドウが表示されます。

  6. 左側のメニュー ウィンドウの [ 開発者] で、[ コード + テスト] を選択します。 関数の [コード + テスト ] ウィンドウが表示されます。

    index.js ファイルのコードがエディターに表示されます。

  7. 既存のコードを次のコードに置き換えます。

    module.exports = async function (context) {
        return `Your project design proposal has been -  ${context.bindings.name}!`;
    };
    

    この関数は、提案の状態を示すメッセージを返します。 context.bindings.name式は、オーケストレーターから関数に渡されるパラメーターに応じて、AcceptedまたはRejectedです。 実際のシナリオでは、この関数の受け入れ操作または拒否操作を処理するロジックを追加します。

  8. 上部のメニュー バーで、[ 保存] を選択して新しい関数を保存します。

Durable Functions ワークフローが開始されることを確認する

  1. Azure portal のメニューまたは ホーム ページの [ 最近使用したリソース] で、[ すべて表示] を選択し、関数アプリを選択します。 [関数アプリ] ウィンドウが表示されます。

  2. ページの中央にある [ 関数 ] タブを選択します。

  3. HttpStart 関数を選択します。 関数の HttpStart ペインが表示されます。

  4. 上部のメニュー バーで、[ 関数 URL の取得 ] を選択し、URL をコピーします。 URL は次の例のようになります。

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    この URL を使用して関数を実行します。

  5. 新しいブラウザー ウィンドウを開き、コピーした URL に移動します。 URL で、 {functionName} プレースホルダーを OrchFunction に置き換えます。これは次の例のようになります。

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    応答メッセージには、実行を監視および管理するために使用できる、一連の URI エンドポイントが含まれます。次の例のようになります。

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  6. statusQueryGetUri の値をコピーし、Web ブラウザーを使用してこの URL に移動します。 次の例のような応答メッセージが表示されます。

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Completed",
      "input": null,
      "customStatus": null,
      "output": [
        "Your project design proposal has been -  Approved!",
        "Your project design proposal has been -  Rejected!"
      ],
      "createdTime": "2019-04-16T15:23:03Z",
      "lastUpdatedTime": "2019-04-16T15:23:35Z"
    }
    

    オーケストレーション関数はアクティビティ関数を 2 回実行することを思い出してください。 最初に、アクティビティ関数は、プロジェクト提案が受け入れられることを示します。 2 回目は、提案が却下されます。 オーケストレーション関数は、両方の関数呼び出しからのメッセージを結合し、クライアント関数に返します。