Azure Functions の HTTP トリガーAzure Functions HTTP trigger

HTTP トリガーでは、HTTP 要求で関数を呼び出すことができます。The HTTP trigger lets you invoke a function with an HTTP request. HTTP トリガーを使用して、サーバーなしの API を構築し、webhook に応答することができます。You can use an HTTP trigger to build serverless APIs and respond to webhooks.

HTTP によってトリガーされる関数の既定の戻り値は次のとおりです。The default return value for an HTTP-triggered function is:

  • Functions 2.x 以降は、本文が空の HTTP 204 No ContentHTTP 204 No Content with an empty body in Functions 2.x and higher
  • Functions 1.x は、本文が空の HTTP 200 OKHTTP 200 OK with an empty body in Functions 1.x

HTTP 応答を変更するには、出力バインドを構成します。To modify the HTTP response, configure an output binding.

HTTP バインドの詳細については、概要出力バインドのリファレンスに関するページを参照してください。For more information about HTTP bindings, see the overview and output binding reference.

ヒント

HTTP または webhook のバインディングを使用する予定がある場合は、不適切な HttpClient のインスタンス化によって生じるおそれのあるポートの枯渇を防止してください。If you plan to use the HTTP or WebHook bindings, plan to avoid port exhaustion that can be caused by improper instantiation of HttpClient. 詳細については、「How to manage connections in Azure Functions」(Azure Functions で接続を管理する方法) を参照してください。For more information, see How to manage connections in Azure Functions.

Example

次の例は、クエリ文字列または HTTP 要求の本文で nameパラメーターを探す C# 関数を示しています。The following example shows a C# function that looks for a name parameter either in the query string or the body of the HTTP request. 戻り値は出力バインドの使われますが、戻り値の属性は必要ないことに注意してください。Notice that the return value is used for the output binding, but a return value attribute isn't required.

[FunctionName("HttpTriggerCSharp")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] 
    HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

属性と注釈Attributes and annotations

C# クラス ライブラリと Java では、HttpTrigger 属性を使用して関数を構成できます。In C# class libraries and Java, the HttpTrigger attribute is available to configure the function.

属性のコンストラクターのパラメーター、Webhook の種類、ルートのテンプレートに承認レベルと許容される HTTP メソッドを設定できます。You can set the authorization level and allowable HTTP methods in attribute constructor parameters, webhook type, and a route template. これらの設定の詳細については、「構成」のセクションを参照してください。For more information about these settings, see configuration.

この例では、HttpTrigger 属性の使用方法を示します。This example demonstrates how to use the HttpTrigger attribute.

[FunctionName("HttpTriggerCSharp")]
public static Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req)
{
    ...
}

完全な例については、トリガーの例を参照してください。For a complete example, see the trigger example.

構成Configuration

次の表は、function.json ファイルと HttpTrigger 属性で設定したバインド構成のプロパティを説明しています。The following table explains the binding configuration properties that you set in the function.json file and the HttpTrigger attribute.

function.json のプロパティfunction.json property 属性のプロパティAttribute property 説明Description
typetype 該当なしn/a 必須 - httpTrigger に設定する必要があります。Required - must be set to httpTrigger.
directiondirection 該当なしn/a 必須 - in に設定する必要があります。Required - must be set to in.
namename 該当なしn/a 必須 - 要求または要求本文の関数コードで使用される変数名。Required - the variable name used in function code for the request or request body.
authLevelauthLevel AuthLevelAuthLevel 関数を呼び出すために、要求にどのキーが存在する必要があるかを決定します。Determines what keys, if any, need to be present on the request in order to invoke the function. 承認レベルは、次のいずれかの値になります。The authorization level can be one of the following values:
  • anonymous—API キーは必要ありません。anonymous—No API key is required.
  • function—関数固有の API キーが必要です。function—A function-specific API key is required. 何も指定されなかった場合は、これが既定値になります。This is the default value if none is provided.
  • admin—マスター キーが必要です。admin—The master key is required.
詳しくは、承認キーに関するセクションをご覧ください。For more information, see the section about authorization keys.
methodsmethods メソッドMethods 関数が応答する HTTP メソッドの配列。An array of the HTTP methods to which the function responds. 指定しない場合、関数はすべての HTTP メソッドに応答します。If not specified, the function responds to all HTTP methods. HTTP エンドポイントのカスタマイズ」をご覧ください。See customize the HTTP endpoint.
routeroute RouteRoute 関数がどの要求 URL に応答するかを制御するルート テンプレートを定義します。Defines the route template, controlling to which request URLs your function responds. 何も指定しなかった場合の既定値は <functionname> です。The default value if none is provided is <functionname>. 詳しくは、「HTTP エンドポイントのカスタマイズ」をご覧ください。For more information, see customize the HTTP endpoint.
webHookTypewebHookType WebHookTypeWebHookType バージョン 1.x ランタイムでのみサポートされます。Supported only for the version 1.x runtime.

指定したプロバイダーの webhook レシーバーとして機能する HTTP トリガーを構成します。Configures the HTTP trigger to act as a webhook receiver for the specified provider. このプロパティを設定する場合は、methods プロパティを設定しないでください。Don't set the methods property if you set this property. webhook の種類は、次のいずれかの値になります。The webhook type can be one of the following values:
  • genericJson—特定のプロバイダー用のロジックを持たない汎用 webhook エンドポイントです。genericJson—A general-purpose webhook endpoint without logic for a specific provider. この設定では、要求が、HTTP POST を使用していてコンテンツの種類が application/json であるものだけに制限されます。This setting restricts requests to only those using HTTP POST and with the application/json content type.
  • github—関数は GitHub webhook に応答します。github—The function responds to GitHub webhooks. GitHub webhook に対して authLevel プロパティを使用しないでください。Do not use the authLevel property with GitHub webhooks. 詳しくは、この記事で後述する「GitHub webhook」セクションをご覧ください。For more information, see the GitHub webhooks section later in this article.
  • slack—関数は Slack webhook に応答します。slack—The function responds to Slack webhooks. Slack webhook に対して authLevel プロパティを使用しないでください。Do not use the authLevel property with Slack webhooks. 詳しくは、この記事で後述する「Slack webhook」セクションをご覧ください。For more information, see the Slack webhooks section later in this article.

ペイロードPayload

トリガーの入力型は、HttpRequest またはカスタム型のいずれかとして宣言されています。The trigger input type is declared as either HttpRequest or a custom type. HttpRequest を選択した場合は、要求オブジェクトへのフル アクセスが取得されます。If you choose HttpRequest, you get full access to the request object. カスタム型 の場合、ランタイムは JSON 要求本文を解析して、オブジェクトのプロパティを設定しようとします。For a custom type, the runtime tries to parse the JSON request body to set the object properties.

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

既定では、HTTP トリガーの関数を作成する際に、次の形式のルートを使用して関数のアドレスを指定できます。By default when you create a function for an HTTP trigger, the function is addressable with a route of the form:

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

HTTP トリガーの入力バインドで省略可能な route プロパティを使用すると、このルートをカスタマイズできます。You can customize this route using the optional route property on the HTTP trigger's input binding. たとえば、次の function.json ファイルでは HTTP トリガーの route プロパティを定義します。As an example, the following function.json file defines a route property for an HTTP trigger:

{
    "bindings": [
    {
        "type": "httpTrigger",
        "name": "req",
        "direction": "in",
        "methods": [ "get" ],
        "route": "products/{category:alpha}/{id:int?}"
    },
    {
        "type": "http",
        "name": "res",
        "direction": "out"
    }
    ]
}

この構成を使用すると、元のルートではなく、次のルートを使用して関数のアドレスを指定できるようになります。Using this configuration, the function is now addressable with the following route instead of the original route.

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

この構成により、関数コードではアドレスに categoryid の 2 つのパラメーターをサポートできます。This configuration allows the function code to support two parameters in the address, category and id.

パラメーターでは任意の Web API ルート制約を使用できます。You can use any Web API Route Constraint with your parameters. 次の C# 関数コードは両方のパラメーターを使用します。The following C# function code makes use of both parameters.

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;

public static IActionResult Run(HttpRequest req, string category, int? id, ILogger log)
{
    var message = String.Format($"Category: {category}, ID: {id}");
    return (ActionResult)new OkObjectResult(message);
}

既定では、すべての関数のルートには api というプレフィックスが付きます。By default, all function routes are prefixed with api. host.json ファイルで extensions.http.routePrefix プロパティを使用すると、このプレフィックスをカスタマイズまたは削除できます。You can also customize or remove the prefix using the extensions.http.routePrefix property in your host.json file. 次の例では、host.json ファイル内でプレフィックスに空の文字列を使用することで、api ルート プレフィックスを削除します。The following example removes the api route prefix by using an empty string for the prefix in the host.json file.

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

ルート パラメーターの使用Using route parameters

関数の route パターンを定義したルート パラメーターは、各バインドで使用できます。Route parameters that defined a function's route pattern are available to each binding. たとえば、ルートが "route": "products/{id}" として定義されている場合、テーブル ストレージ バインドでは、バインド構成の {id} パラメーターの値を使用できます。For example, if you have a route defined as "route": "products/{id}" then a table storage binding can use the value of the {id} parameter in the binding configuration.

次の構成は、{id} パラメーターをバインドの rowKey に渡す方法を示しています。The following configuration shows how the {id} parameter is passed to the binding's rowKey.

{
    "type": "table",
    "direction": "in",
    "name": "product",
    "partitionKey": "products",
    "tableName": "products",
    "rowKey": "{id}"
}

クライアント ID の操作Working with client identities

関数アプリが App Service の認証と承認を使用している場合は、コードから認証されたクライアントに関する情報を確認することができます。If your function app is using App Service Authentication / Authorization, you can view information about authenticated clients from your code. この情報は、プラットフォームによって挿入された要求ヘッダーとして使用できます。This information is available as request headers injected by the platform.

また、この情報はバインディング データから参照することもできます。You can also read this information from binding data. この機能は、Functions 2.x 以降の Functions ランタイムのみで使用可能です。This capability is only available to the Functions runtime in 2.x and higher. また、現在のところ .NET 言語でのみ使用可能です。It is also currently only available for .NET languages.

認証されたクライアントに関する情報は、ClaimsPrincipal として使用できます。Information regarding authenticated clients is available as a ClaimsPrincipal. ClaimsPrincipal は、次の例に示すように、要求コンテキストの一部として使用可能です。The ClaimsPrincipal is available as part of the request context as shown in the following example:

using System.Net;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

public static IActionResult Run(HttpRequest req, ILogger log)
{
    ClaimsPrincipal identities = req.HttpContext.User;
    // ...
    return new OkObjectResult();
}

また、ClaimsPrincipal を単に追加のパラメーターとして関数シグネチャに含めることもできます。Alternatively, the ClaimsPrincipal can simply be included as an additional parameter in the function signature:

using System.Net;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
using Newtonsoft.Json.Linq;

public static void Run(JObject input, ClaimsPrincipal principal, ILogger log)
{
    // ...
    return;
}

関数のアクセス キーFunction access keys

関数を使用すると、開発中に HTTP 関数のエンドポイントにアクセスするのをより困難にするようにキーを使用できます。Functions lets you use keys to make it harder to access your HTTP function endpoints during development. HTTP によってトリガーされる関数で HTTP アクセス レベルが anonymous に設定されている場合を除き、要求には API アクセス キーが含まれている必要があります。Unless the HTTP access level on an HTTP triggered function is set to anonymous, requests must include an API access key in the request.

キーからは既定のセキュリティ メカニズムが与えられますが、運用環境で HTTP エンドポイントをセキュリティで保護する追加オプションの検討もお勧めします。While keys provide a default security mechanism, you may want to consider additional options to secure an HTTP endpoint in production. たとえば、パブリック アプリで共有シークレットを配布することは通常、良い習慣ではありません。For example, it's generally not a good practice to distribute shared secret in public apps. 関数がパブリック クライアントから呼び出される場合、別のセキュリティ メカニズムの実装を検討することをお勧めします。If your function is being called from a public client, you may want to consider implementing another secrity mechanism. 詳細については、運用環境で HTTP エンドポイントを保護するを参照してください。To learn more, see Secure an HTTP endpoint in production.

関数キー値を更新したら、関数が呼び出されるすべてのクライアントに更新後のキー値を手動で再配布する必要があります。When you renew your function key values, you must manually redistribute the updated key values to all clients that call your function.

承認スコープ (関数レベル)Authorization scopes (function-level)

関数レベルのキーには、2 つのアクセス スコープがあります。There are two access scopes for function-level keys:

  • 関数:これらのキーは、それらが定義されている特定の関数にのみ適用されます。Function: These keys apply only to the specific functions under which they are defined. API キーとして使用した場合は、その関数だけがアクセスできます。When used as an API key, these only allow access to that function.

  • [Host](ホスト) : ホスト スコープのキーは、関数アプリ内のすべての関数にアクセスするために使用できます。Host: Keys with a host scope can be used to access all functions within the function app. API キーとして使用した場合は、関数アプリ内のすべての関数がアクセスできます。When used as an API key, these allow access to any function within the function app.

各キーには、参照用に名前が付けられており、関数レベルおよびホスト レベルで "default" という名前の既定のキーがあります。Each key is named for reference, and there is a default key (named "default") at the function and host level. 関数キーが、ホスト キーよりも優先されます。Function keys take precedence over host keys. 2 つのキーが同じ名前で定義されている場合は、関数キーが使用されます。When two keys are defined with the same name, the function key is always used.

マスターキー (管理レベル)Master key (admin-level)

各関数アプリには、_masterという管理レベルのホスト キーもあります。Each function app also has an admin-level host key named _master. マスター キーは、アプリ内のすべての関数へのホスト レベルのアクセスを提供するだけでなく、ランタイム REST API への管理アクセスも提供します。In addition to providing host-level access to all functions in the app, the master key also provides administrative access to the runtime REST APIs. このキーを取り消すことはできません。This key cannot be revoked. アクセス レベルを admin に設定すると、要求でマスター キーを使用する必要があります。その他のキーを使用するとアクセス エラーになります。When you set an access level of admin, requests must use the master key; any other key results in access failure.

注意事項

マスター キーによって付与された関数 app の権限が昇格しているため、このキーを第三者と共有したり、ネイティブ クライアント アプリケーションに配布したりしないでください。Due to the elevated permissions in your function app granted by the master key, you should not share this key with third parties or distribute it in native client applications. 管理者アクセス レベルを選択する場合は注意が必要です。Use caution when choosing the admin access level.

キーを入手するObtaining keys

キーは関数アプリの一部として Azure に格納され、保存中は暗号化されます。Keys are stored as part of your function app in Azure and are encrypted at rest. キーを表示には、新しい値を作成したり、新しい値にキーをロールしたり、Azure ポータルで HTTP トリガー機能に移動して、管理を選択します。To view your keys, create new ones, or roll keys to new values, navigate to one of your HTTP-triggered functions in the Azure portal and select Manage.

ポータルでのファンクション キーを管理します。

Key Management API を使用して、関数キーをプログラムで取得することができます。You may obtain function keys programmatically by using Key management APIs.

API キーの承認API key authorization

ほとんどの HTTP トリガー テンプレートには、要求内の API キーが必要です。Most HTTP trigger templates require an API key in the request. そのため、HTTP 要求は、通常は次の URL のようになります。So your HTTP request normally looks like the following URL:

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

上記のように、キーはcodeというクエリ文字列変数に含めることができます。The key can be included in a query string variable named code, as above. x-functions-keyHTTP ヘッダーに含めることもできます。It can also be included in an x-functions-key HTTP header. キーの値には、関数のために定義されている任意の関数キーまたは任意のホスト キーを指定できます。The value of the key can be any function key defined for the function, or any host key.

匿名要求を許可できます。この要求ではキーが不要です。You can allow anonymous requests, which do not require keys. マスター キーを使用するように要求することもできます。You can also require that the master key is used. 既定の承認レベルを変更するには、バインド JSON の authLevel プロパティを使用します。You change the default authorization level by using the authLevel property in the binding JSON. 詳しくは、「トリガー - 構成」をご覧ください。For more information, see Trigger - configuration.

注意

機能をローカルで実行する場合、指定された承認レベルの設定に関係なく、許可は無効になります。When running functions locally, authorization is disabled regardless of the specified authorization level setting. Azure に発行した後、トリガーのauthLevel設定が適用されます。After publishing to Azure, the authLevel setting in your trigger is enforced. コンテナーをローカルで実行する場合もキーが必要です。Keys are still required when running locally in a container.

運用環境で HTTP エンドポイントを保護します。Secure an HTTP endpoint in production

運用環境で、関数エンドポイントを完全に保護するには、次の関数アプリレベルのセキュリティ オプションのいずれかの実装を検討してください。To fully secure your function endpoints in production, you should consider implementing one of the following function app-level security options. これらの関数アプリレベル セキュリティ メソッドのいずれかを使用する場合は、HTTP トリガー関数の承認レベルを anonymous に設定する必要があります。When using one of these function app-level security methods, you should set the HTTP-triggered function authorization level to anonymous.

App Service の認証/承認の有効化Enable App Service Authentication/Authorization

App Service プラットフォームでは、Azure Active Directory (AAD) といくつかのサード パーティの ID プロバイダーを使用してクライアントを認証することができます。The App Service platform lets you use Azure Active Directory (AAD) and several third-party identity providers to authenticate clients. この方法を使用して、関数のカスタム認可ルールを実装し、関数コードのユーザー情報を操作できます。You can use this strategy to implement custom authorization rules for your functions, and you can work with user information from your function code. 詳細については、「Azure App Service での認証および認可」および「クライアント ID の操作」を参照してください。To learn more, see Authentication and authorization in Azure App Service and Working with client identities.

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

APIM では、受信要求用のさまざまな API のセキュリティ オプションを提供します。APIM provides a variety of API security options for incoming requests. 詳細については、 API Management の認証ポリシーを参照してください。To learn more, see API Management authentication policies. APIM を適切に配置すると、APIM インスタンスの IP アドレスからの要求のみを受け入れるように関数アプリを設定できます。With APIM in place, you can configure your function app to accept requests only from the IP address of your APIM instance. 詳細については、IP アドレス制限を参照してください。To learn more, see IP address restrictions.

関数アプリを分離してデプロイするDeploy your function app in isolation

Azure App Service Environment (ASE) では、関数を実行するための専用のホスティング環境を提供します。Azure App Service Environment (ASE) provides a dedicated hosting environment in which to run your functions. ASE では、すべての着信要求の認証に使用できる 1 つのフロント エンド ゲートウェイを構成できます。ASE lets you configure a single front-end gateway that you can use to authenticate all incoming requests. 詳細情報については、App Service 環境の Web アプリケーション ファイアウォール (WAF) を構成するを参照してください。For more information, see Configuring a Web Application Firewall (WAF) for App Service Environment.

WebhooksWebhooks

注意

Webhook モードは、関数ランタイムのバージョン 1.x でのみ使用できます。Webhook mode is only available for version 1.x of the Functions runtime. この変更は、バージョン 2.x 以降での HTTP トリガーのパフォーマンスを向上させるために行われました。This change was made to improve the performance of HTTP triggers in version 2.x and higher.

バージョン 1.x では、Webhook テンプレートで Webhook ペイロードの追加検証が提供されます。In version 1.x, webhook templates provide additional validation for webhook payloads. バージョン 2.x 以降では、基本 HTTP トリガーは引き続き機能し、Webhook の推奨アプローチです。In version 2.x and higher, the base HTTP trigger still works and is the recommended approach for webhooks.

GitHub webhookGitHub webhooks

GitHub webhook に応答するには、まず、HTTP トリガーで関数を作成し、webHookType プロパティを github に設定します。To respond to GitHub webhooks, first create your function with an HTTP Trigger, and set the webHookType property to github. 次に、その URL と API キーを GitHub リポジトリの [webhook の追加] ページにコピーします。Then copy its URL and API key into the Add webhook page of your GitHub repository.

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

Slack webhookSlack webhooks

Slack webhook では、指定しなくてもトークンが自動的に生成されます。そのため、Slack によって生成されたトークンで、関数固有のキーを構成する必要があります。The Slack webhook generates a token for you instead of letting you specify it, so you must configure a function-specific key with the token from Slack. 承認キー」をご覧ください。See Authorization keys.

Webhook とキーWebhooks and keys

webhook の承認は、HTTP トリガーの一部である webhook レシーバー コンポーネントによって処理されますが、そのメカニズムは webhook の種類によって異なります。Webhook authorization is handled by the webhook receiver component, part of the HTTP trigger, and the mechanism varies based on the webhook type. ただし、各メカニズムはキーに依存します。Each mechanism does rely on a key. 既定では、"default" という名前の関数キーが使用されます。By default, the function key named "default" is used. 別のキーを使用するには、次のいずれかの方法で、要求と共にキー名を送信するように webhook プロバイダーを構成します。To use a different key, configure the webhook provider to send the key name with the request in one of the following ways:

  • クエリ文字列:プロバイダーにより、clientid クエリ文字列パラメーターでキー名 (https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?clientid=<KEY_NAME> など) が渡されます。Query string: The provider passes the key name in the clientid query string parameter, such as https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?clientid=<KEY_NAME>.
  • 要求ヘッダー:プロバイダーにより、x-functions-clientid ヘッダーでキー名が渡されます。Request header: The provider passes the key name in the x-functions-clientid header.

コンテンツの種類Content types

バイナリ データとフォームデータを C# 以外の関数に渡すには、適切な Content-Type ヘッダーを使用する必要があります。Passing binary and form data to a non-C# function requires that you use the appropriate content-type header. サポートされるコンテンツの種類としては、バイナリ データ用の octet-stream と、マルチパート型が含まれます。Supported content types include octet-stream for binary data and multipart types.

既知の問題Known issues

C# 以外の関数では、Content-Type image/jpeg を使用して要求を送信すると、string 値が関数に渡されます。In non-C# functions, requests sent with the content-type image/jpeg results in a string value passed to the function. このような場合は、string 値を手動でバイト配列に変換することで、生のバイナリ データにアクセスすることができます。In cases like these, you can manually convert the string value to a byte array to access the raw binary data.

制限Limits

HTTP 要求の長さは 100 MB (104,857,600 バイト) に、URL の長さは 4 KB (4,096 バイト) バイトに制限されています。The HTTP request length is limited to 100 MB (104,857,600 bytes), and the URL length is limited to 4 KB (4,096 bytes). これらの制限は、ランタイムの Web.config ファイルhttpRuntime 要素で指定されています。These limits are specified by the httpRuntime element of the runtime's Web.config file.

HTTP トリガーを使用する関数が 230 秒以内に完了しない場合、Azure Load Balancer でタイムアウトが発生し、HTTP 502 エラーが返されます。If a function that uses the HTTP trigger doesn't complete within 230 seconds, the Azure Load Balancer will time out and return an HTTP 502 error. この関数は実行を継続しますが、HTTP 応答を返すことはできません。The function will continue running but will be unable to return an HTTP response. 実行時間が長い関数の場合は、非同期パターンに従い、要求の状態について ping で確認できる場所を返すことをお勧めします。For long-running functions, we recommend that you follow async patterns and return a location where you can ping the status of the request. 関数を実行できる時間については、スケールとホスティングに関するページの「従量課金プラン」を参照してください。For information about how long a function can run, see Scale and hosting - Consumption plan.

次のステップNext steps