トリガーとバインディングを作成する
トリガーで関数の呼び出し方法が定義されます。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 要求のコンテンツを読み取るには、dataType を binary に設定します。
{
"dataType": "binary",
"type": "httpTrigger",
"name": "req",
"direction": "in"
}
dataType のその他のオプションは、stream と string です。
バインディング方向
function.json ファイルのすべてのトリガーとバインドには direction プロパティがあります。
- トリガーの場合、方向は常に
inです - 入出力バインドは
inとoutを使用します - 一部のバインドは、特殊な方向の
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を直接編集することは避けてください。コードに変更を加え、再発行します。