Azure Functions の HTTP トリガー

HTTP トリガーでは、HTTP 要求で関数を呼び出すことができます。 HTTP トリガーを使用して、サーバーなしの API を構築し、Webhook に応答することができます。

HTTP によってトリガーされる関数の既定の戻り値は次のとおりです。

  • Functions 2.x 以降は、本文が空の HTTP 204 No Content
  • Functions 1.x は、本文が空の HTTP 200 OK

HTTP 応答を変更するには、出力バインドを構成します。

HTTP バインドの詳細については、概要出力バインドのリファレンスに関するページを参照してください。

ヒント

HTTP または Webhook のバインディングを使用する予定がある場合は、不適切な HttpClient のインスタンス化によって生じるおそれのあるポートの枯渇を防止してください。 詳細については、「How to manage connections in Azure Functions」(Azure Functions で接続を管理する方法) を参照してください。

重要

この記事では、タブを使用して、Node.js プログラミング モデルの複数のバージョンに対応しています。 v4 モデルは一般提供されており、JavaScript と TypeScript の開発者にとって、より柔軟で直感的なエクスペリエンスが得られるように設計されています。 v4 モデルの動作の詳細については、Azure Functions Node.js 開発者ガイドを参照してください。 v3 と v4 の違いの詳細については、移行ガイドを参照してください。

Azure Functions では、Python の 2 つのプログラミング モデルがサポートされています。 バインドを定義する方法は、選択したプログラミング モデルによって異なります。

Python v2 プログラミング モデルでは、Python 関数コードでデコレーターを使用してバインドを直接定義できます。 詳細については、「Python 開発者ガイド」を参照してください。

この記事は、両方のプログラミング モデルをサポートしています。

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

  • 分離されたワーカー モデル: ランタイムから分離されたワーカー プロセスで実行されるコンパイル済みの C# 関数。 分離ワーカー プロセスは、LTS および 非 LTS バージョンの .NET および .NET Framework で実行されている C# 関数をサポートするために必要です。 分離ワーカー プロセス関数の拡張機能では、Microsoft.Azure.Functions.Worker.Extensions.* 名前空間が使用されます。
  • インプロセス モデル: Functions ランタイムと同じプロセスで実行されるコンパイル済みの C# 関数。 このモデルの一部では、主に C# ポータルの編集のためにサポートされている C# スクリプトを使用して Functions を実行できます。 インプロセス関数の拡張機能では、Microsoft.Azure.WebJobs.Extensions.* 名前空間が使用されます。

この記事のコードは既定の .NET Core 構文です。これは、Functions バージョン 2.x 以降で使用されます。 1\.x 構文については、1.x 関数テンプレートを参照してください。

次の例は、.NET Isolated での ASP.NET Core 統合を使用して、IActionResult として "hello, world" 応答を返す HTTP トリガーを示しています。

[Function("HttpFunction")]
public IActionResult Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req)
{
    return new OkObjectResult($"Welcome to Azure Functions, {req.Query["name"]}!");
}

次の例は、HttpResponseData オブジェクトとして "hello world" 応答を返す HTTP トリガーを示しています。

[Function(nameof(HttpFunction))]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestData req,
    FunctionContext executionContext)
{
    var logger = executionContext.GetLogger(nameof(HttpFunction));
    logger.LogInformation("message logged");

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    response.WriteString("Welcome to .NET isolated worker !!");

    return response;
}

このセクションには、次の例が含まれています。

次の例は、HTTP トリガー バインドを示しています。

クエリ文字列からのパラメーターの読み取り

この例では、クエリ文字列から id という名前のパラメーターを読み取り、そのパラメーターを使用して、コンテンツ タイプ application/json でクライアントに返される JSON ドキュメントを作成します。

@FunctionName("TriggerStringGet")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", 
            methods = {HttpMethod.GET}, 
            authLevel = AuthorizationLevel.ANONYMOUS)
        HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {

    // Item list
    context.getLogger().info("GET parameters are: " + request.getQueryParameters());

    // Get named parameter
    String id = request.getQueryParameters().getOrDefault("id", "");

    // Convert and display
    if (id.isEmpty()) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                        .body("Document not found.")
                        .build();
    } 
    else {
        // return JSON from to the client
        // Generate document
        final String name = "fake_name";
        final String jsonDocument = "{\"id\":\"" + id + "\", " + 
                                        "\"description\": \"" + name + "\"}";
        return request.createResponseBuilder(HttpStatus.OK)
                        .header("Content-Type", "application/json")
                        .body(jsonDocument)
                        .build();
    }
}

POST 要求からの本文の読み取り

この例では、Post 要求の本文を String として読み取り、その内容を使用して、コンテンツ タイプ application/json でクライアントに返される JSON ドキュメントを作成します。

    @FunctionName("TriggerStringPost")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", 
              methods = {HttpMethod.POST}, 
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Request body is: " + request.getBody().orElse(""));

        // Check request body
        if (!request.getBody().isPresent()) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                          .body("Document not found.")
                          .build();
        } 
        else {
            // return JSON from to the client
            // Generate document
            final String body = request.getBody().get();
            final String jsonDocument = "{\"id\":\"123456\", " + 
                                         "\"description\": \"" + body + "\"}";
            return request.createResponseBuilder(HttpStatus.OK)
                          .header("Content-Type", "application/json")
                          .body(jsonDocument)
                          .build();
        }
    }

ルートからのパラメーターの読み取り

この例では、ルート パスから id という名前の必須パラメーターとオプション パラメーター name を読み取り、それらのパラメーターを使用して、コンテンツ タイプ application/json でクライアントに返される JSON ドキュメントを作成します。

@FunctionName("TriggerStringRoute")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", 
            methods = {HttpMethod.GET}, 
            authLevel = AuthorizationLevel.ANONYMOUS,
            route = "trigger/{id}/{name=EMPTY}") // name is optional and defaults to EMPTY
        HttpRequestMessage<Optional<String>> request,
        @BindingName("id") String id,
        @BindingName("name") String name,
        final ExecutionContext context) {

    // Item list
    context.getLogger().info("Route parameters are: " + id);

    // Convert and display
    if (id == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                        .body("Document not found.")
                        .build();
    } 
    else {
        // return JSON from to the client
        // Generate document
        final String jsonDocument = "{\"id\":\"" + id + "\", " + 
                                        "\"description\": \"" + name + "\"}";
        return request.createResponseBuilder(HttpStatus.OK)
                        .header("Content-Type", "application/json")
                        .body(jsonDocument)
                        .build();
    }
}

POST 要求からの POJO 本文の読み取り

この例で参照されている、 ToDoItem クラスのコードを次に示します。


public class ToDoItem {

  private String id;
  private String description;  

  public ToDoItem(String id, String description) {
    this.id = id;
    this.description = description;
  }

  public String getId() {
    return id;
  }

  public String getDescription() {
    return description;
  }

  @Override
  public String toString() {
    return "ToDoItem={id=" + id + ",description=" + description + "}";
  }
}

この例では、POST 要求の本文を読み取ります。 要求本文を ToDoItem オブジェクトに自動的に逆シリアル化し、コンテンツ タイプ application/json でクライアントに返します。 ToDoItem パラメーターは、HttpMessageResponse.Builder クラスの body プロパティに割り当てられる際に、Functions ランタイムによってシリアル化されます。

@FunctionName("TriggerPojoPost")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", 
            methods = {HttpMethod.POST}, 
            authLevel = AuthorizationLevel.ANONYMOUS)
        HttpRequestMessage<Optional<ToDoItem>> request,
        final ExecutionContext context) {

    // Item list
    context.getLogger().info("Request body is: " + request.getBody().orElse(null));

    // Check request body
    if (!request.getBody().isPresent()) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                        .body("Document not found.")
                        .build();
    } 
    else {
        // return JSON from to the client
        // Generate document
        final ToDoItem body = request.getBody().get();
        return request.createResponseBuilder(HttpStatus.OK)
                        .header("Content-Type", "application/json")
                        .body(body)
                        .build();
    }
}

HTTP トリガーの TypeScript 関数を次の例に示します。 この関数は、クエリ文字列または HTTP 要求の本文で name パラメーターを探します。

import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || (await request.text()) || 'world';

    return { body: `Hello, ${name}!` };
}

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    handler: httpTrigger1,
});

HTTP トリガーの JavaScript 関数を次の例に示します。 この関数は、クエリ文字列または HTTP 要求の本文で name パラメーターを探します。

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

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    handler: async (request, context) => {
        context.log(`Http function processed request for url "${request.url}"`);

        const name = request.query.get('name') || (await request.text()) || 'world';

        return { body: `Hello, ${name}!` };
    },
});

次の例は、function.json ファイルのトリガー バインドと、PowerShell 関数を示しています。 この関数は、クエリ文字列または HTTP 要求の本文で name パラメーターを探します。

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    }
  ]
}
using namespace System.Net

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

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

$body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."

if ($name) {
    $body = "Hello, $name. This HTTP triggered function executed successfully."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body       = $body
})

この例では、 HTTP ストリーム を使用してチャンクされた応答データを返します。

import time

import azure.functions as func
from azurefunctions.extensions.http.fastapi import Request, StreamingResponse

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)


def generate_sensor_data():
    """Generate real-time sensor data."""
    for i in range(10):
        # Simulate temperature and humidity readings
        temperature = 20 + i
        humidity = 50 + i
        yield f"data: {{'temperature': {temperature}, 'humidity': {humidity}}}\n\n"
        time.sleep(1)


@app.route(route="stream", methods=[func.HttpMethod.GET])
async def stream_sensor_data(req: Request) -> StreamingResponse:
    """Endpoint to stream real-time sensor data."""
    return StreamingResponse(generate_sensor_data(), media_type="text/event-stream")

プロジェクトで HTTP ストリームを有効にする方法など、詳細については、 HTTP ストリームを参照してください。

この例では、トリガー バインドと、そのバインドを使用する Python 関数を示します。 この関数は、クエリ文字列または HTTP 要求の本文で name パラメーターを探します。

import azure.functions as func
import logging

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
def test_function(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')
    return func.HttpResponse(
        "This HTTP triggered function executed successfully.",
        status_code=200
        )

属性

isolated worker モデルin-process モデルの両方HttpTriggerAttributeを使用してトリガー バインドを定義します。 C# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

isolated worker モデル関数アプリでは、HttpTriggerAttributeは次のパラメーターをサポートしています。

パラメーター 説明
AuthLevel 関数を呼び出すために、要求にどのキーが存在する必要があるかを決定します。 サポートされる値については、「認可レベル」を参照してください。
メソッド 関数が応答する HTTP メソッドの配列。 指定しない場合、関数はすべての HTTP メソッドに応答します。 「HTTP エンドポイントのカスタマイズ」をご覧ください。
Route 関数がどの要求 URL に応答するかを制御するルート テンプレートを定義します。 何も指定しなかった場合の既定値は <functionname> です。 詳しくは、「HTTP エンドポイントのカスタマイズ」をご覧ください。

デコレータ

"Python v2 プログラミング モデルにのみ適用されます。"

デコレーターを使用して定義された Python v2 関数の場合、トリガーの次のプロパティが route デコレーターで定義され、HttpTrigger と HttpOutput バインドが追加されます。

プロパティ 説明
route HTTP エンドポイントのルート。 None の場合、関数名 (存在する場合) またはユーザー定義の Python 関数名に設定されます。
trigger_arg_name HttpRequest の引数名。 既定値は "req" です
binding_arg_name HttpResponse の引数名。 既定値は "$return" です
methods 関数が応答する HTTP メソッドのタプル。
auth_level 関数を呼び出すために、要求にどのキーが存在する必要があるかを決定します。

function.json を使用して定義された Python 関数については、「構成」セクションを参照してください。

注釈

Java 関数ランタイム ライブラリでは、HttpTrigger 注釈を使用します。この注釈は次の設定をサポートしています。

構成

"Python v1 プログラミング モデルにのみ適用されます。"

次の表では、app.http() メソッドに渡される options オブジェクトに対して設定できるプロパティについて説明します。

プロパティ 説明
authLevel 関数を呼び出すために、要求にどのキーが存在する必要があるかを決定します。 サポートされる値については、「認可レベル」を参照してください。
methods 関数が応答する HTTP メソッドの配列。 指定しない場合、関数はすべての HTTP メソッドに応答します。 「HTTP エンドポイントのカスタマイズ」をご覧ください。
route 関数がどの要求 URL に応答するかを制御するルート テンプレートを定義します。 何も指定しなかった場合の既定値は <functionname> です。 詳しくは、「HTTP エンドポイントのカスタマイズ」をご覧ください。

次の表は、function.json ファイルで設定するトリガー構成のプロパティを説明しています。これらは、ランタイムのバージョンによって異なります。

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

function.json のプロパティ 説明
type 必須 - httpTrigger に設定する必要があります。
direction 必須 - in に設定する必要があります。
name 必須 - 要求または要求本文の関数コードで使用される変数名。
authLevel 関数を呼び出すために、要求にどのキーが存在する必要があるかを決定します。 サポートされる値については、「認可レベル」を参照してください。
methods 関数が応答する HTTP メソッドの配列。 指定しない場合、関数はすべての HTTP メソッドに応答します。 「HTTP エンドポイントのカスタマイズ」をご覧ください。
route 関数がどの要求 URL に応答するかを制御するルート テンプレートを定義します。 何も指定しなかった場合の既定値は <functionname> です。 詳しくは、「HTTP エンドポイントのカスタマイズ」をご覧ください。

使用方法

このセクションでは、HTTP トリガー関数のバインドを構成する方法について詳しく説明します。

HttpTrigger 注釈は、次のいずれかの型のメソッド パラメーターに適用する必要があります。

  • HttpRequestMessage<T>
  • Int、String、byte[] などのネイティブ Java 型。
  • Optional を使用する Null 許容値。
  • plain-old Java オブジェクト (POJO) 型。

ペイロード

トリガーの入力型は、次のいずれかの型として宣言されます。

説明
HttpRequest "この型を使用するには、.NET Isolated の ASP.NET Core統合使用してアプリを構成する必要があります。"
これにより、要求オブジェクトと HttpContext 全体へのフル アクセスが提供されます。
HttpRequestData 要求オブジェクトのプロジェクション。
カスタム型 要求の本文が JSON の場合、ランタイムはそれを解析してオブジェクトのプロパティを設定しようとします。

トリガー パラメーターの型が HttpRequestData または HttpRequest の場合は、 Microsoft.Azure.Functions.Worker.Http.FromBodyAttributeを使用してカスタム型を他のパラメーターにバインドすることもできます。 この属性を使用するには、Microsoft.Azure.Functions.Worker.Extensions.Http バージョン 3.1.0 以降が必要です。 これは、 Microsoft.AspNetCore.Mvcの同様の属性とは異なる型です。 ASP.NET Core 統合を使用する場合は、完全修飾参照または using ステートメントが必要です。 この例では、ASP.NET Core 統合を使用して、完全な HttpRequestに引き続きアクセスしながら、属性を使用して本文の内容のみを取得する方法を示します。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;

namespace AspNetIntegration
{
    public class BodyBindingHttpTrigger
    {
        [Function(nameof(BodyBindingHttpTrigger))]
        public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
            [FromBody] Person person)
        {
            return new OkObjectResult(person);
        }
    }

    public record Person(string Name, int Age);
}

HTTP エンドポイントのカスタマイズ

既定では、HTTP トリガーの関数を作成する際に、次の形式のルートを使用して関数のアドレスを指定できます。

https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>

HTTP トリガーの入力バインドで省略可能な route プロパティを使用すると、このルートをカスタマイズできます。 パラメーターでは任意の Web API ルート制約を使用できます。

次の関数コードは、ルート内の 2 つのパラメーター categoryid を受け取り、両方のパラメーターを使用して応答を書き込みます。

[Function("HttpTrigger1")]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post",
Route = "products/{category:alpha}/{id:int?}")] HttpRequestData req, string category, int? id,
FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("HttpTrigger1");
    logger.LogInformation("C# HTTP trigger function processed a request.");

    var message = String.Format($"Category: {category}, ID: {id}");
    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    response.WriteString(message);

    return response;
}

ルートパラメーターは、HttpTrigger 注釈の route 設定を使用して定義されます。 次の関数コードは、ルート内の 2 つのパラメーター categoryid を受け取り、両方のパラメーターを使用して応答を書き込みます。

package com.function;

import java.util.*;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;

public class HttpTriggerJava {
    public HttpResponseMessage<String> HttpTrigger(
            @HttpTrigger(name = "req",
                         methods = {"get"},
                         authLevel = AuthorizationLevel.FUNCTION,
                         route = "products/{category:alpha}/{id:int}") HttpRequestMessage<String> request,
            @BindingName("category") String category,
            @BindingName("id") int id,
            final ExecutionContext context) {

        String message = String.format("Category  %s, ID: %d", category, id);
        return request.createResponseBuilder(HttpStatus.OK).body(message).build();
    }
}

たとえば、次の TypeScript コードは、2 つのパラメーター categoryid を使用して HTTP トリガーの route プロパティを定義しています。 この例は、要求からパラメーターを読み取り、応答でその値を返します。

import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    const category = request.params.category;
    const id = request.params.id;

    return { body: `Category: ${category}, ID: ${id}` };
}

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    route: 'products/{category:alpha}/{id:int?}',
    handler: httpTrigger1,
});

たとえば、次の JavaScript コードは、2 つのパラメーター categoryid を使用して HTTP トリガーの route プロパティを定義しています。 この例は、要求からパラメーターを読み取り、応答でその値を返します。

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

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    route: 'products/{category:alpha}/{id:int?}',
    handler: async (request, context) => {
        const category = request.params.category;
        const id = request.params.id;

        return { body: `Category: ${category}, ID: ${id}` };
    },
});

たとえば、次のコードでは、2 つのパラメーター categoryid を使用して HTTP トリガーの route プロパティを定義しています。

@app.function_name(name="httpTrigger")
@app.route(route="products/{category:alpha}/{id:int?}")

function.json ファイルで宣言されたルート パラメーターは、$Request.Params オブジェクトのプロパティとしてアクセスできます。

$Category = $Request.Params.category
$Id = $Request.Params.id

$Message = "Category:" + $Category + ", ID: " + $Id

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

関数の実行コンテキストは、func.HttpRequest として宣言されたパラメーターを介して公開されます。 このインスタンスを使用すると、関数で、データ ルート パラメーター、クエリ文字列の値、HTTP 応答を返すことができるメソッドにアクセスできます。

定義したら、route_params メソッドを呼び出すことによって、ルート パラメーターを関数に使用できます。

import logging

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:

    category = req.route_params.get('category')
    id = req.route_params.get('id')
    message = f"Category: {category}, ID: {id}"

    return func.HttpResponse(message)

この構成を使用すると、元のルートではなく、次のルートを使用して関数のアドレスを指定できるようになります。

https://<APP_NAME>.azurewebsites.net/api/products/electronics/357

この構成により、関数コードはアドレス内の 2 つのパラメーター ( カテゴリID をサポートできます。 URL でルート パラメーターをトークン化する方法の詳細については、「ASP.NET Core のルーティング」を参照してください。

既定では、すべての関数ルートの前に api が付けられます。 host.json ファイルで extensions.http.routePrefix プロパティを使用すると、このプレフィックスをカスタマイズまたは削除できます。 次の例では、host.json ファイル内のプレフィックスに空の文字列を使用して、api ルート プレフィックスを削除します。

{
    "extensions": {
        "http": {
            "routePrefix": ""
        }
    }
}

ルート パラメーターの使用

関数の route パターンを定義したルート パラメーターは、各バインドで使用できます。 たとえば、ルートが "route": "products/{id}" として定義されている場合、テーブル ストレージ バインドでは、バインド構成の {id} パラメーターの値を使用できます。

次の構成は、{id} パラメーターをバインドの rowKey に渡す方法を示しています。

@app.table_input(arg_name="product", table_name="products", 
                 row_key="{id}", partition_key="products",
                 connection="AzureWebJobsStorage")
import { app, HttpRequest, HttpResponseInit, input, InvocationContext } from '@azure/functions';

const tableInput = input.table({
    connection: 'MyStorageConnectionAppSetting',
    partitionKey: 'products',
    tableName: 'products',
    rowKey: '{id}',
});

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    return { jsonBody: context.extraInputs.get(tableInput) };
}

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    route: 'products/{id}',
    extraInputs: [tableInput],
    handler: httpTrigger1,
});
const { app, input } = require('@azure/functions');

const tableInput = input.table({
    connection: 'MyStorageConnectionAppSetting',
    partitionKey: 'products',
    tableName: 'products',
    rowKey: '{id}',
});

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    route: 'products/{id}',
    extraInputs: [tableInput],
    handler: async (request, context) => {
        return { jsonBody: context.extraInputs.get(tableInput) };
    },
});
{
    "type": "table",
    "direction": "in",
    "name": "product",
    "partitionKey": "products",
    "tableName": "products",
    "rowKey": "{id}"
}

ルート パラメーターを使用すると、関数に対して invoke_URL_template が自動的に作成されます。 クライアントは、URL を使って関数を呼び出すときにその URL に渡す必要があるパラメーターについて、URL テンプレートを使用して理解することができます。 Azure portal で HTTP によってトリガーされる関数のいずれかに移動し、 [関数の URL の取得] を選択します。

List 関数または Get 関数に対して Azure Resource Manager API を使用して、invoke_URL_template にプログラムでアクセスすることができます。

HTTP ストリーム

v4 関数アプリで HTTP エンドポイントに対する要求と応答Node.jsストリーミングできるようになりました。 詳細については、「 HTTP ストリーム」を参照してください。

HTTP ストリーム

Python での HTTP ストリームのサポートにより、関数で有効になっている FastAPI 要求 API と応答 API を使用して、HTTP エンドポイントからデータを受け入れて返すことができます。 これらの API を使用すると、ホストはメッセージ全体をメモリに読み込む必要なく、HTTP メッセージ内のデータをチャンクとして処理できます。 詳細については、Python での HTTP ストリームに関するページを参照してください。

重要

Python の HTTP ストリームのサポートは現在プレビュー段階であり、Python v2 プログラミング モデルでのみサポートされています。

クライアント ID の操作

関数アプリが App Service の認証と認可を使用している場合は、コードから認証されたクライアントに関する情報を確認することができます。 この情報は、プラットフォームによって挿入された要求ヘッダーとして使用できます。

また、この情報はバインディング データから参照することもできます。

Note

認証されたクライアント情報へのアクセスは、現在、.NET 言語でのみ使用できます。 また、Functions ランタイムのバージョン 1.x ではサポートされていません。

認証されたクライアントに関する情報は、次の例に示すように、要求コンテキストの一部として使用できる ClaimsPrincipal として入手できます。

認証されたユーザーは、HTTP ヘッダー経由で使用できます。

認証されたユーザーは、HTTP ヘッダー経由で使用できます。

承認レベル

認可レベルは、関数エンドポイントにアクセスするために必要な 認可キー の種類を示す文字列値です。 HTTP によってトリガーされる関数の場合、認可レベルは次のいずれかの値になります。

レベル値 説明
anonymous アクセス キーは必要ありません。
function エンドポイントにアクセスするには、関数固有のキーが必要です。
admin エンドポイントにアクセスするには、マスター キーが必要です。

レベルが明示的に設定されていない場合、承認は既定で function レベルになります。

レベルが明示的に設定されていない場合、既定の承認はNode.js モデルのバージョンによって異なります。

承認の既定値は、 anonymous レベルです。

関数のアクセス キー

Functions を使用すると、アクセス キーを使用して、関数エンドポイントへのアクセスを困難にすることができます。 HTTP によってトリガーされる関数の承認レベルが anonymous に設定されていない限り、要求にはアクセス キーを要求に含める必要があります。 詳細については、「 Work with access keys in Azure Functions」を参照してください。

アクセス キーの承認

ほとんどの HTTP トリガー テンプレートでは、要求にアクセス キーが必要です。 そのため、HTTP 要求は、通常は次の URL のようになります。

https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?code=<API_KEY>

前に説明したように、キーは code という名前のクエリ文字列変数に含めることができます。 x-functions-keyHTTP ヘッダーに含めることもできます。 キーの値には、関数のために定義されている任意の関数キーまたは任意のホスト キーを指定できます。

キーを必要としない匿名要求を許可できます。 マスター キーを使用するように要求することもできます。 既定の認可レベルを変更するには、バインド JSON の authLevel プロパティを使用します。

Note

機能をローカルで実行する場合、指定された認可レベルの設定に関係なく、許可は無効になります。 Azure に発行した後、トリガーのauthLevel設定が適用されます。 コンテナーをローカルで実行する場合もキーが必要です。

ウェブフックs

Note

Webhook モードは、Functions Runtime のバージョン 1.x でのみ使用できます。 この変更は、バージョン 2.x 以降での HTTP トリガーのパフォーマンスを向上させるために行われました。

バージョン 1.x では、webhook テンプレートは webhook ペイロードに対して別の検証を提供します。 バージョン 2.x 以降では、基本 HTTP トリガーは引き続き機能し、Webhook の推奨アプローチです。

Webhook の種類

webHookType バインディング プロパティは、Webhook が関数によってサポートされている場合に型を示し、それによって、サポートされるペイロードも決まります。 Webhook の種類は、次のいずれかの値になります。

種類の値 説明
genericJson 特定のプロバイダー用のロジックを持たない汎用の Webhook エンドポイントです。 この設定では、要求が、HTTP POST を使用していてコンテンツの種類が application/json であるものだけに制限されます。
github 関数は GitHub Webhook に対応します。 GitHub Webhook では authLevel プロパティを使用しないでください。
slack 関数は Slack Webhook に対応します。 Slack Webhook では authLevel プロパティを使用しないでください。

webHookType プロパティを設定するときには、バインディングに対して methods プロパティも設定しないでください。

GitHub Webhook

GitHub Webhook に応答するには、まず、HTTP トリガーで関数を作成し、webHookType プロパティを github に設定します。 次に、その URL と API キーを GitHub リポジトリの [Webhook の追加] ページにコピーします。

関数の Webhook の追加方法を示すスクリーンショット。

Slack Webhook

Slack Webhook では、指定しなくてもトークンが自動的に生成されます。そのため、Slack によって生成されたトークンで、関数固有のキーを構成する必要があります。 「認可キー」をご覧ください。

Webhook とキー

Webhook の認可は、HTTP トリガーの一部である Webhook レシーバー コンポーネントによって処理されますが、そのメカニズムは Webhook の種類によって異なります。 ただし、各メカニズムはキーに依存します。 既定では、"default" という名前の関数キーが使用されます。 別のキーを使用するには、次のいずれかの方法で、要求と共にキー名を送信するように Webhook プロバイダーを構成します。

  • クエリ文字列:プロバイダーにより、clientid クエリ文字列パラメーターでキー名 (https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?clientid=<KEY_NAME> など) が渡されます。
  • 要求ヘッダー:プロバイダーにより、x-functions-clientid ヘッダーでキー名が渡されます。

コンテンツの種類

バイナリ データとフォームデータを C# 以外の関数に渡すには、適切な Content-Type ヘッダーを使用する必要があります。 サポートされるコンテンツの種類としては、バイナリ データ用の octet-stream と、マルチパート型が含まれます。

既知の問題

C# 以外の関数では、Content-Type image/jpeg を使用して要求を送信すると、string 値が関数に渡されます。 このような場合は、string 値を手動でバイト配列に変換することで、生のバイナリ データにアクセスすることができます。

制限

HTTP 要求の長さは 100 MB (104,857,600 バイト) に、URL の長さは 4 KB (4,096 バイト) バイトに制限されています。 これらの制限は、ランタイムの Web.config ファイルhttpRuntime 要素で指定されています。

HTTP トリガーを使用する関数が 230 秒以内に完了しない場合、Azure Load Balancer でタイムアウトが発生し、HTTP 502 エラーが返されます。 この関数は実行を継続しますが、HTTP 応答を返すことはできません。 実行時間が長い関数の場合は、非同期パターンに従い、要求の状態について ping で確認できる場所を返すことをお勧めします。 関数を実行できる時間については、スケールとホスティングに関するページの「従量課金プラン」を参照してください。

次のステップ