Azure Functions の Dapr Invoke 出力バインド

Dapr Invoke 出力バインドを使用すると、関数の実行中に別の Dapr アプリケーションを呼び出すことができます。

Dapr 拡張機能のセットアップと構成の詳細については、「Dapr 拡張機能の概要」を参照してください。

A C# 関数は、次の C# モードのいずれかを使用して作成できます。

実行モデル 説明
分離ワーカー モデル 関数コードは、別の .NET ワーカー プロセスで実行されます。 .NET と .NET Framework のサポートされているバージョンで使います。 詳細については、.NET 分離ワーカー プロセス関数の開発に関する記事を参照してください。
インプロセス モデル 関数コードは、Functions ホスト プロセスと同じプロセスで実行されます。 .NET の長期サポート (LTS) バージョンのみをサポートします。 詳細については、.NET クラス ライブラリ関数の開発に関する記事を参照してください。

次の例では、Dapr 呼び出し出力バインドを使用して、別の Dapr を使用しているアプリケーションでホストされている Dapr サービス呼び出し操作を実行する方法を示します。 この例では、関数はプロキシのように機能します。

[FunctionName("InvokeOutputBinding")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "invoke/{appId}/{methodName}")] HttpRequest req,
    [DaprInvoke(AppId = "{appId}", MethodName = "{methodName}", HttpVerb = "post")] IAsyncCollector<InvokeMethodParameters> output,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

    var outputContent = new InvokeMethodParameters
    {
        Body = requestBody
    };

    await output.AddAsync(outputContent);

    return new OkResult();
}

次の例では、HttpTrigger を持つ DaprInvokeOutput バインドを使用して "InvokeOutputBinding" 関数を作成しています。

@FunctionName("InvokeOutputBinding")
public String run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET, HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS,
            route = "invoke/{appId}/{methodName}")
            HttpRequestMessage<Optional<String>> request,
        @DaprInvokeOutput(
            appId = "{appId}", 
            methodName = "{methodName}", 
            httpVerb = "post")
        OutputBinding<String> payload,
        final ExecutionContext context)

次の例では、Dapr 呼び出し出力バインドは、app オブジェクトによって登録される HTTP トリガーとペアになっています。

const { app, trigger } = require('@azure/functions');

app.generic('InvokeOutputBinding', {
    trigger: trigger.generic({
        type: 'httpTrigger',
        authLevel: 'anonymous',
        methods: ['POST'],
        route: "invoke/{appId}/{methodName}",
        name: "req"
    }),
    return: daprInvokeOutput,
    handler: async (request, context) => {
        context.log("Node HTTP trigger function processed a request.");

        const payload = await request.text();
        context.log(JSON.stringify(payload));

        return { body: payload };
    }
});

次の例は、function.json ファイル内の Dapr トリガーと、それらのバインドを使用する PowerShell コードを示しています。

daprInvokefunction.json ファイルを次に示します。

{
  "bindings":
    {
      "type": "daprInvoke",
      "direction": "out",
      "appId": "{appId}",
      "methodName": "{methodName}",
      "httpVerb": "post",
      "name": "payload"
    }
}

function.json ファイルのプロパティについて詳しくは、「構成」セクションをご覧ください。

コード内で以下のように指定します。

using namespace System.Net

# Input bindings are passed in via param block.
param($req, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "Powershell InvokeOutputBinding processed a request."

$req_body = $req.Body

$invoke_output_binding_req_body = @{
    "body" = $req_body
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name payload -Value $invoke_output_binding_req_body

Push-OutputBinding -Name res -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $req_body
})

次の例は、v2 Python プログラミング モデルを使用する Dapr 呼び出し出力バインドを示しています。 Python 関数アプリ コードで daprInvoke を使用するには、次の手順を実行してください。

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="InvokeOutputBinding")
@app.route(route="invoke/{appId}/{methodName}", auth_level=dapp.auth_level.ANONYMOUS)
@app.dapr_invoke_output(arg_name = "payload", app_id = "{appId}", method_name = "{methodName}", http_verb = "post")
def main(req: func.HttpRequest, payload: func.Out[str] ) -> str:
    # request body must be passed this way "{\"body\":{\"value\":{\"key\":\"some value\"}}}" to use the InvokeOutputBinding, all the data must be enclosed in body property.
    logging.info('Python function processed a InvokeOutputBinding request from the Dapr Runtime.')

    body = req.get_body()
    logging.info(body)
    if body is not None:
        payload.set(body)
    else:
        logging.info('req body is none')
    return 'ok'

属性

インプロセス モデルでは、DaprInvoke 属性を使用して、次のパラメーターをサポートする Dapr 呼び出し出力バインドを定義します。

パラメーター 説明 Attribute を使って送信できる RequestBody 経由で送信可能
AppId 呼び出す Dapr アプリ ID。 ✔️ ✔️
MethodName 呼び出すアプリのメソッド名。 ✔️ ✔️
HttpVerb 省略可能。 呼び出すアプリで使用する HTTP 動詞。 既定値は POST です。 ✔️ ✔️
本文 必須。 要求の本文。 ✔️

注釈

DaprInvokeOutput 注釈を使用すると、関数を呼び出して出力バインドをリッスンできます。

要素 説明 Attribute を使って送信できる RequestBody 経由で送信可能
appId 呼び出しバインドに関係するアプリケーションのアプリ ID。 ✔️ ✔️
methodName メソッド変数の名前。 ✔️ ✔️
httpVerb Post または Get。 ✔️ ✔️
body 必須。 要求の本文。 ✔️

構成

次の表では、コードで設定するバインド構成プロパティについて説明します。

プロパティ 説明 Attribute を使って送信できる RequestBody 経由で送信可能
appId 呼び出しバインドに関係するアプリケーションのアプリ ID。 ✔️ ✔️
methods Post または Get。 ✔️ ✔️
body 必須。 要求の本文。 ✔️

次の表は、function.json ファイルで設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 説明 Attribute を使って送信できる RequestBody 経由で送信可能
appId 呼び出しバインドに関係するアプリケーションのアプリ ID。 ✔️ ✔️
methodName メソッド変数の名前。 ✔️ ✔️
httpVerb Post または Get。 ✔️ ✔️
body 必須。 要求の本文。 ✔️

次の表は、Python コードで設定する @dapp.dapr_invoke_output のバインド構成プロパティについて説明しています。

プロパティ 説明 Attribute を使って送信できる RequestBody 経由で送信可能
app_id 呼び出しバインドに関係するアプリケーションのアプリ ID。 ✔️ ✔️
method_name メソッド変数の名前。 ✔️ ✔️
http_verb post または get に設定します。 ✔️ ✔️
body 必須。 要求の本文。 ✔️

プロパティが Attributes と RequestBody の両方で定義されている場合は、RequestBody で指定されているデータが優先されます。

完全な例については、セクションの例を参照してください。

使用法

Dapr サービス呼び出し出力バインドを使用するための詳細については、「Dapr の公式ドキュメントの Dapr サービス呼び出しの使用方法」を参照してください。

Python v2 で daprInvoke を使用するには、正しい依存関係でプロジェクトを設定します。

  1. 仮想環境を作成してアクティブにする

  2. requirements.text ファイルに、次の行を追加します。

    azure-functions==1.18.0b3
    
  3. ターミナルで、Python ライブラリをインストールします。

    pip install -r .\requirements.txt
    
  4. 次の構成で local.setting.json ファイルを変更します。

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

次のステップ

Dapr サービス呼び出しの詳細。