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.* 名前空間が使用されます。

重要

インプロセス モデルのサポートは 2026 年 11 月 10 日に終了します。 完全なサポートのために、アプリを分離ワーカー モデルに移行することを強くお勧めします

この記事のコードは既定の .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
})

次の例は、トリガー バインドと、そのバインドが使用される Python 関数を示しています。 この関数は、クエリ文字列または HTTP 要求の本文で name パラメーターを探します。 この例は、v1 と v2 のどちらの Python プログラミング モデルを使用するかによって異なります。

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
        )

属性

インプロセス分離ワーカー プロセスの C# ライブラリはどちらも、HttpTriggerAttribute を使用してトリガー バインディングを定義します。 C# スクリプトでは、C# スクリプト ガイドで説明されているように、代わりに function.json 構成ファイルを使用します。

分離ワーカー プロセス関数アプリでは、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 の場合、ランタイムはそれを解析してオブジェクトのプロパティを設定しようとします。

トリガー パラメーターが HttpRequestHttpRequestData のときは、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

この構成により、関数コードはアドレス、カテゴリID の 2 つのパラメーターをサポートできます。 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 ストリームを参照してください

クライアント ID の操作

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

また、この情報はバインディング データから参照することもできます。 この機能は、Functions 2.x 以降の Functions ランタイムのみで使用可能です。 また、現在のところ .NET 言語でのみ使用可能です。

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

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

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

承認レベル

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

レベル値 説明
anonymous API キーは必要ありません。 これは、レベルが明示的に設定されていない場合の既定値です。
function 関数固有の API キーが必要です。
admin マスター キーが必要です。
レベル値 説明
anonymous API キーは必要ありません。
function 関数固有の API キーが必要です。 これは、レベルが明示的に設定されていない場合の既定値です。
admin マスター キーが必要です。

関数のアクセス キー

関数を使用すると、開発中に HTTP 関数のエンドポイントにアクセスするのをより困難にするようにキーを使用できます。 HTTP によってトリガーされる関数で HTTP アクセス レベルが anonymous に設定されている場合を除き、要求には API アクセス キーが含まれている必要があります。

キーにより既定のセキュリティ メカニズムが実現しますが、運用環境では HTTP エンドポイントをセキュリティで保護する追加オプションを検討することをお勧めします。 たとえば、パブリック アプリで共有シークレットを配布することは、良い慣例ではありません。 関数がパブリック クライアントから呼び出される場合、別のセキュリティ メカニズムの実装を検討することをお勧めします。 詳細については、運用環境で HTTP エンドポイントを保護するを参照してください。

関数キー値を更新したら、関数が呼び出されるすべてのクライアントに更新後のキー値を手動で再配布する必要があります。

承認スコープ (関数レベル)

関数レベルのキーには、2 つのアクセス スコープがあります。

  • 関数: これらのキーは、それらが定義されている特定の関数にのみ適用されます。 API キーとして使用した場合は、その関数だけがアクセスできます。

  • ホスト: ホスト スコープのキーは、関数アプリ内のすべての関数にアクセスするために使用できます。 API キーとして使用した場合は、関数アプリ内のすべての関数がアクセスできます。

各キーには、参照用に名前が付けられており、関数レベルおよびホスト レベルで "default" という名前の既定のキーがあります。 関数キーが、ホスト キーよりも優先されます。 2 つのキーが同じ名前で定義されている場合は、関数キーが使用されます。

マスターキー (管理レベル)

各関数アプリには、_masterという管理レベルのホスト キーもあります。 マスター キーは、アプリ内のすべての関数へのホスト レベルのアクセスを提供するだけでなく、ランタイム REST API への管理アクセスも提供します。 このキーを取り消すことはできません。 アクセス レベルを admin に設定すると、要求でマスター キーを使用する必要があります。その他のキーを使用するとアクセス エラーになります。

注意事項

マスター キーによって関数アプリの昇格権限が付与されるため、このキーを第三者と共有したり、ネイティブ クライアント アプリケーションで配布したりしないでください。 管理者アクセス レベルを選択する場合は注意が必要です。

キーを入手する

キーは関数アプリの一部として Azure に格納され、保存中は暗号化されます。 キーを表示したり、新しいものを作成したり、新しい値にキーをロールしたりするには、Azure portal で HTTP によってトリガーされる関数のいずれかに移動して、 [関数キー] を選択します。

ホスト キーを管理することもできます。 Azure portal で関数アプリに移動し、[アプリ キー] を選択します。

関数およびホスト キーは、Azure Resource Manager API を使用してプログラムで取得できます。 List 関数キーList ホスト キーへの API があります。デプロイ スロットを使用する場合の同等の API は、List 関数キー スロットList ホスト キー スロットです。

また、関数シークレットの作成または更新関数シークレット スロットの作成または更新ホスト シークレットの作成または更新およびホスト シークレット スロットの作成または更新 API を使用して、プログラムで新しい関数およびホスト キーを作成することもできます。

関数およびホスト キーは、関数シークレットの削除関数シークレット スロットの削除ホスト シークレットの削除、およびホスト シークレット スロットの削除 API を使用して、プログラムで削除できます。

従来のキー管理 API を使用して関数キーを取得することもできますが、代わりに Azure Resource Manager API を使用することをお勧めします。

API キーの認可

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

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

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

匿名要求を許可できます。この要求ではキーが不要です。 マスター キーを使用するように要求することもできます。 既定の認可レベルを変更するには、バインド JSON の authLevel プロパティを使用します。 詳しくは、「トリガー - 構成」をご覧ください。

Note

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

運用環境で HTTP エンドポイントを保護する

運用環境で、関数エンドポイントを完全に保護するには、次の関数アプリレベルのセキュリティ オプションのいずれかの実装を検討してください。 これらの関数アプリレベル セキュリティ メソッドのいずれかを使用する場合は、HTTP トリガー関数の認可レベルを anonymous に設定する必要があります。

App Service の認証/承認の有効化

App Service プラットフォームでは、Microsoft Entra ID といくつかのサードパーティ ID プロバイダーを使用してクライアントを認証することができます。 この方法を使用して、関数のカスタム承認ルールを実装し、関数コードのユーザー情報を操作できます。 詳細については、「Azure App Service での認証および承認」および「クライアント ID の操作」を参照してください。

Azure API Management (APIM) を使用して要求を認証する

APIM では、受信要求用のさまざまな API のセキュリティ オプションを提供します。 詳細については、 「Azure Functions で接続を管理する方法」を参照してください。 APIM を適切に配置すると、APIM インスタンスの IP アドレスからの要求のみを受け入れるように関数アプリを設定できます。 詳細については、IP アドレス制限を参照してください。

関数アプリを分離してデプロイする

Azure App Service Environment (ASE) では、関数を実行するための専用のホスティング環境を提供します。 ASE では、すべての着信要求の認証に使用できる 1 つのフロント エンド ゲートウェイを構成できます。 詳細情報については、App Service 環境の Web アプリケーション ファイアウォール (WAF) を構成するを参照してください。

Webhooks

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 で確認できる場所を返すことをお勧めします。 関数を実行できる時間については、スケールとホスティングに関するページの「従量課金プラン」を参照してください。

次のステップ