トリガーとバインディングを作成する

完了

トリガーで関数の呼び出し方法が定義されます。1 つの関数には正確に 1 つのトリガーを含める必要があります。 トリガーにはデータが関連付けられていて、多くの場合、関数のペイロードとして提供されます。

関数へのバインディングは、別のリソースを関数に宣言して接続する方法です。バインディングは、"入力バインディング"、"出力バインディング"、またはその両方として接続できます。 バインドからのデータは、パラメーターとして関数に提供されます。

ニーズに合わせて、さまざまなバインドを組み合わせることができます。 バインドは省略可能であり、関数には 1 つまたは複数の入力または出力バインドがある場合があります。

トリガーとバインドによって、他のサービスへのアクセスのハードコーディングを回避することができます。 関数は、関数パラメーターでデータ (キュー メッセージの内容など) を受信します。 関数の戻り値を使用して、(たとえば、キュー メッセージを作成するために) データを送信します。

関数をローカルで開発する場合は、トリガーとバインドの動作を考慮する必要があります。 HTTP トリガーの場合は、 http://localhost/を使用して、ローカル コンピューターで HTTP エンドポイントを呼び出すことができます。 HTTP 以外のトリガー関数の場合、ローカルで実行するためのオプションがいくつかあります。

  • ローカル開発時にバインディングをテストする最も簡単な方法は、ライブ Azure サービスを対象とする接続文字列を使用することです。 local.settings.json ファイルの Values 配列に適切な接続文字列設定を追加することで、ライブ サービスをターゲットにすることができます。 これを行うと、テスト中のローカル実行でライブ サービス データが使用されます。 このため、開発とテスト中に使用する個別のサービスを設定し、運用環境では異なるサービスに切り替える方法をご検討ください。
  • ストレージ ベースのトリガーの場合は、Azure Storage バインド (Queue Storage、Blob Storage、Table Storage) を使用して関数をテストするときに、リモート ストレージ サービスに接続しなくても、ローカル Azurite エミュレーター を使用できます。
  • 特別な管理者エンドポイントを使用して、HTTP 以外のトリガー関数を手動で実行できます。 詳細については、「HTTP によってトリガーされない関数を手動で実行する」を参照してください。

トリガーとバインドの定義

トリガーとバインドは、開発言語とランタイム モデルによって異なる方法で定義されます。

Language トリガーとバインディングを設定する方法は...
C# クラス ライブラリ C# 属性を使用したメソッドとパラメーターの修飾 (インプロセスまたは分離ワーカー)
Java Java 注釈でのメソッドとパラメーターの修飾
JavaScript/TypeScript v4 プログラミング モデル: @azure/functionsを使用してコードで入力/出力を定義する。v3: 関数ごとの function.json で構成する
Python v2 プログラミング モデル: デコレーターを使用して入力/出力を定義します。v1: function.json で構成する
PowerShell function.json で構成する

最新のモデル (Node.js v4 と Python v2) では、コードでトリガーとバインドの構成を作成し、ランタイムによって対応する function.jsonが生成されます。 古いモデル (Node.js v3、Python v1、PowerShell) では、 function.json を直接使用します。 同じ関数アプリ内でプログラミング モデルを混在することはできません。

function.json に依存する言語 (Node.js v3、Python v1、PowerShell など) の場合、ポータルには、[統合] タブでバインドを追加するための UI が用意されています。また、関数の [コード + テスト] タブで、ポータルで直接ファイルを編集することもできます。 Node.js v4 や Python v2 などのコード優先モデルの場合は、ローカル プロジェクトのコードでバインドを構成します。ポータルには構成が反映されますが、直接編集がサポートされていない可能性があります。

.NET および Java では、パラメーター型で入力データのデータ型が定義されます。 たとえば、キュー トリガーのテキストにバインドするには string を、バイナリとして読み取るにはバイト配列を、オブジェクトを逆シリアル化するにはカスタム型を使用します。 .NET クラス ライブラリ関数と Java 関数ではバインドの定義に function.json は使用されないため、これらをポータルで作成したり編集したりすることはできません。 C# ポータルの編集は、属性の代わりに function.json を使用する C# スクリプトに基づいています。

JavaScript (v3 モデルを使用) や PowerShell など、動的に型指定される言語の場合は、dataType ファイルで プロパティを使用します。 たとえば、バイナリ形式で HTTP 要求のコンテンツを読み取るには、dataTypebinary に設定します。

{
    "dataType": "binary",
    "type": "httpTrigger",
    "name": "req",
    "direction": "in"
}

dataType のその他のオプションは、streamstring です。

バインディング方向

function.json ファイルのすべてのトリガーとバインドには direction プロパティがあります。

  • トリガーの場合、方向は常に in です
  • 入出力バインドは inout を使用します
  • 一部のバインドは、特殊な方向の inout をサポートしています。 inout を使用する場合、ポータルの 統合 タブからはAdvanced editorのみが利用可能です。

クラス ライブラリの属性を使用してトリガーとバインドを構成した場合、その方向は属性コンストラクターで提供されるか、またはパラメーター型から推論されます。

Azure Functions のトリガーとバインドの例

HTTP 要求を受信するたびに、Azure Queue Storage にメッセージを書き込むとします。 これは、HTTP トリガーとストレージ キュー出力バインドを使用して実装できます。 構成方法は、言語とプログラミング モデルによって異なります。

このシナリオのレガシ function.json ファイルを次に示します (Node.js v3、Python v1、または PowerShell に適用されます)。

{
    "disabled": false,
    "bindings": [
        {
            "type": "httpTrigger",
            "direction": "in",
            "name": "req",
            "authLevel": "function",
            "methods": ["get","post"]
        },
                {
                    "type": "queue",
                    "direction": "out",
                    "name": "outqueue",
                    "queueName": "outqueue",
                    "connection": "AzureWebJobsStorage"
                }
  ]
}

bindings配列の最初の要素は HTTP トリガーです。 type および direction プロパティは、トリガーを識別します。 name プロパティは、HTTP 要求を受け取る関数パラメーターを識別し、サポートされている HTTP 動詞methods一覧表示します。

bindings配列の 2 番目の要素は、ストレージ キューの出力バインドです。 type および direction プロパティは、バインドを識別します。 name プロパティは、関数が新しいキュー メッセージを提供する方法、queueNameがキューを識別する方法、およびストレージ接続文字列を保持するアプリ設定を参照connectionを指定します。

function.jsonの disabled プロパティを使用 して関数を無効にすることは、従来の動作です。 アプリ設定 AzureWebJobs.<FunctionName>.Disabled=trueを使用することをお選び下。

C# (分離ワーカー) の例

この例では、属性によって定義された出力バインドを使用してストレージ キューにメッセージを書き込む HTTP によってトリガーされる関数を示します。 詳細については、 C# 分離ワーカー ガイドを参照してください。

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

public static class HttpToQueue
{
    [Function("HttpToQueue")]
    public static MultiResponse Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
    {
        var message = "Processed request";
        return new MultiResponse
        {
            Messages = new[] { message },
            HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.OK)
        };
    }
}

public class MultiResponse
{
    [QueueOutput("outqueue", Connection = "AzureWebJobsStorage")]
    public string[] Messages { get; set; }
    public HttpResponseData HttpResponse { get; set; }
}

Node.js (v4 プログラミング モデル) の例

v4 Node.js プログラミング モデルでは、 @azure/functionsを使用してコード内の入力と出力を構成します。 詳細については、 Node.js 開発者ガイド (v4) を参照してください。

import { app, output } from "@azure/functions";

const queueOutput = output.storageQueue({
  queueName: "outqueue",
  connection: "AzureWebJobsStorage"
});

app.http("HttpToQueue", {
  methods: ["GET", "POST"],
  authLevel: "function",
  extraOutputs: [queueOutput],
  handler: async (request, context) => {
    const body = await request.text();
    context.extraOutputs.set(queueOutput, body || "Processed request");
    return { status: 200, body: "Queued" };
  }
});

Python (v2 プログラミング モデル) の例

v2 Python プログラミング モデルでは、デコレーターを使用してバインディングを定義します。 ランタイムによって function.json が生成されます。 詳細については、 Python 開発者ガイド を参照してください。

import azure.functions as func

app = func.FunctionApp()

@app.route(route="HttpToQueue", auth_level=func.AuthLevel.FUNCTION)
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpToQueue(req: func.HttpRequest, msg: func.Out[str]) -> func.HttpResponse:
    body = req.get_body().decode("utf-8") if req.get_body() else "Processed request"
    msg.set(body)
    return func.HttpResponse("Queued", status_code=200)

Node.js v4 と Python v2 では、ランタイムによってコードから function.json が生成されます。 これらの モデルのポータル でfunction.jsonを直接編集することは避けてください。コードに変更を加え、再発行します。