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

完了

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

関数アプリを作成する

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

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

  3. 関数アプリを検索して選択します。 [関数アプリの作成] ウィンドウが表示されます。

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

    設定 説明
    プロジェクトの詳細
    サブスクリプション コンシェルジェ サブスクリプション この新しい関数アプリが作成されるサブスクリプションを指定します。
    リソース グループ ドロップダウン リストから、[サンドボックス リソース グループ名] を選択します。 関数アプリを作成するリソース グループの名前を指定します。 サンドボックス、つまり "[サンドボックス リソース グループ名]" をアクティブ化したときに割り当てられたサンドボックス リソース グループに、関数アプリを作成します。
    インスタンスの詳細
    関数アプリ名 "[グローバルに一意の名前]" 新しい関数アプリを識別する名前を指定します。 有効な文字は、a-z0-9、および - です。
    発行 コード 関数でコンテナーではなくコードを使用することを指定します。
    ランタイム スタック Node.js このモジュールのサンプル コードが JavaScript で記述されることを指定します。
    バージョン 20 LTS ランタイム スタックのバージョンを指定します。
    リージョン [このセクションの次の一覧から選択] この後に示される、許可されているサンドボックス リージョンの中から、お客様に最も近いリージョンを選択します。
    オペレーティング システム
    オペレーティング システム Windows 関数アプリをホストするオペレーティング システムを指定します。
    プラン
    プランの種類 "従量課金 (サーバーレス)" 関数アプリにどのようにリソースが割り当てられるかを定義するホスティング プランを指定します。 既定の [従量課金] プランでは、リソースはご利用の関数の必要に応じて動的に追加されます。 このサーバーレス ホスティング モデルでは、ご利用の関数が実行された時間にのみ課金されます。

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

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

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

    設定 説明
    Storage
    ストレージ アカウント "[グローバルに一意の名前]" 関数アプリで使用される新しいストレージ アカウントの名前を指定します (関数に指定したグローバルに一意の名前と一致する必要はありません)。 ストレージ アカウント名の長さは 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 Editor (プレビュー)][エディターを開く] の順に選択します。 [App Service Editor] クイック スタート ペインが新しいブラウザー ウィンドウに表示されます。

  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 スターター」と入力し、そのテンプレートを一覧から選択してください。 このテンプレートで、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"
        }
      ]
    }
    

    Note

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

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

  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 という名前のアクティビティ関数を呼び出します。 オーケストレーター関数のコードは、Approval 関数を 2 回呼び出します。 1 回目は提案の受け入れをシミュレートし、2 回目は提案の拒否ロジックをテストします。

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

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

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

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

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

  3. [関数] メニュー バーで [作成] を選びます。 [関数の作成] ペインが表示されます。

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

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

  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. 上部のメニュー バーで [保存] を選択して、新しい関数を保存します。

永続関数ワークフローが開始されることを確認する

  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 回実行することを思い出してください。 1 回目の実行では、アクティビティ関数はプロジェクト提案が受け入れられたことを示します。 2 回目では、提案は拒否されます。 オーケストレーション関数は、両方の関数呼び出しからのメッセージを結合し、クライアント関数に返します。