すべてのプロダクト
Search
ドキュメントセンター

Function Compute:HTTPトリガーの設定と使用

最終更新日:Sep 09, 2024

Function ComputeはHTTPトリガーをサポートしています。 HTTPリクエストを使用して、HTTPトリガーで設定された関数を呼び出すことができます。 この関数は、HTTPリクエストを受信して呼び出し元に応答を返すwebサーバーに似ています。 このトピックでは、関数のHTTPトリガーを設定し、function ComputeコンソールでHTTPリクエストを使用して関数を呼び出す方法について説明します。

前提条件

サービスが作成されていること。 詳しくは、「サービスの作成」をご参照ください。

ステップ1: トリガーを作成する

説明

HTTPトリガーは、他のタイプのトリガーとは異なります。 HTTP関数を作成すると、システムは関数のHTTPトリガーを自動的に作成します。 他のタイプのトリガーについては、トリガーソースに基づいて手動でトリガーを作成する必要があります。

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。

  3. 関数ページをクリックします。関数の作成.

  4. 関数の作成ページで、組み込みランタイムの使用を選択し、ビジネス要件に基づいて関数を作成するためのパラメーターを設定します。

    次の表に、設定する必要があるパラメーターを示します。 他のパラメーターの既定値を保持します。 詳細については、「関数の作成」をご参照ください。

    パラメーター

    説明

    基本設定

    関数名

    関数の名前を指定します。

    ハンドラタイプ

    [HTTPハンドラ] を選択します。

    (オプション) トリガー設定

    名前

    トリガーの名前を指定します。

    リクエスト方法

    トリガーのトリガーに使用できるHTTPメソッドを指定します。

    インターネットURLの無効化

    デフォルトでは、このパラメーターは [いいえ] に設定され、パブリックドメイン名はトリガーにアクセスできます。

    [はい] を選択した場合、トリガーに使用できるデフォルトのパブリックドメイン名はありません。 この場合、パブリックドメイン名を使用して関数を呼び出すと、関数によってアクセスが拒否されたインターネットURLが無効になるエラーメッセージが返されます。 ただし、カスタムドメイン名を使用する場合、関数は期待どおりに呼び出すことができます。

    認証方法

    HTTPリクエストの認証に使用されるメソッド。 有効な値:

    • 認証なし: Function ComputeはHTTPリクエストを認証せず、関数への匿名アクセスをサポートします。 すべてのユーザーがHTTPリクエストを使用して関数を呼び出すことができます。

    • 署名認証: HTTPリクエストにはID認証が必要です。 署名認証のサンプルコードの詳細については、「署名認証」をご参照ください。

    • JWT認証: HTTPリクエストは、JSON Webトークン (JWT) を使用して認証する必要があります。 詳細については、「HTTPトリガーのJWT認証の設定」をご参照ください。

    ビジネス要件に基づいて、作成されたHTTPトリガーの設定を変更できます。 たとえば、トリガーの [バージョンまたはエイリアス][リクエスト方法][インターネットURLの無効化] 、および [認証方法] のパラメーターを変更できます。

ステップ2: コードの書き込みとデプロイ

HTTPトリガーが作成されたら、関数のコードを記述できます。

関数の詳細ページで、コードタブで、コードエディターに関数コードを入力し、デプロイをクリックします。

サンプルコード:

var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
    // get request info
    getRawBody(request, function (err, data) {
        var params = {
            path: request.path,
            queries: request.queries,
            headers: request.headers,
            method: request.method,
            body: data,
            url: request.url,
            clientIP: request.clientIP,
        }
        // you can deal with your own logic here
        // set response
        var respBody = new Buffer.from(JSON.stringify(params));
        // var respBody = new Buffer( )
        response.setStatusCode(200)
        response.setHeader('content-type', 'application/json')
        response.send(respBody)
    })
};
# -*- coding: utf-8 -*-
import json
HELLO_WORLD = b"Hello world!\n"
def handler(environ, start_response):
    request_uri = environ['fc.request_uri']
    response_body = {
      'uri':environ['fc.request_uri'],
      'method':environ['REQUEST_METHOD']
    }
    # do something here
    status = '200 OK'
    response_headers = [('Content-type', 'text/json')]
    start_response(status, response_headers)
    # Python2
    return [json.dumps(response_body)]
    # Python3 tips: When using Python3, the str and bytes types cannot be mixed.
    # Use str.encode() to go from str to bytes
    # return [json.dumps(response_body).encode()]
<?php
use RingCentral\Psr7\Response;
function handler($request, $context): Response{
    /*
    $body       = $request->getBody()->getContents();
    $queries    = $request->getQueryParams();
    $method     = $request->getMethod();
    $headers    = $request->getHeaders();
    $path       = $request->getAttribute("path");
    $requestURI = $request->getAttribute("requestURI");
    $clientIP   = $request->getAttribute("clientIP");
    */
    return new Response(
        200,
        array(
            "custom_header1" => "v1",
            "custom_header2" => ["v2", "v3"],
        ),
        "hello world"
    );
}
重要

非同期呼び出しの場合は、関数トレースで非同期呼び出しの結果コールバックを設定します。 詳細については、「Result callback」をご参照ください。

ステップ3: 関数のテスト

方法1: function Computeコンソールで関数をテストする

  • 同期呼び出し

    関数の詳細ページで、[コード] タブをクリックし、[関数のテスト] をクリックします。

  • 非同期呼び出し

    関数の詳細ページで、[テスト関数] タブをクリックし、[非同期呼び出し] を選択し、[テスト関数] をクリックします。

方法2: ブラウザを使用して関数をテストする

ブラウザーのアドレスバーにHTTPトリガーのURLを入力します。 関数を実行するには、Enterキーを押します。

トリガーが実行されると、ブラウザは実行結果を返します。

次のいずれかの方法を使用して、HTTPトリガーのURLを取得できます。

  • 新しいHTTPトリガーの場合、Function Computeによって割り当てられたサブドメイン名をHTTPトリガーのURLとして使用することを推奨します。

    サブドメイン形式:

    <subdomain>.<region_id>.fcapp.run/[action?queries] 

    サンプルコード:

    funcname-svcname-khljsjksld.cn-shanghai.fcapp.run/action?hello=world
    説明

    アセンブリルールに基づいて、既存のHTTPトリガーのURLをアセンブルすることもできます。 割り当てられたサブドメインをHTTPトリガーのURLとして使用して関数をテストすると、404エラーや関数コード内のfunction Computeのサービス名の結合を防ぐことができます。 これにより、コードの移植性を向上させることができる。 404エラーを処理する方法の詳細については、「ブラウザまたはcURLツールを使用して関数にアクセスするときに404エラーが発生した場合の対処方法 」をご参照ください。

  • 既存のHTTPトリガーの場合、アセンブリルールに基づいてHTTPトリガーURLを生成できます。

    アセンブリルール:

    <account_id>.<region_id>.fc.aliyuncs.com/<version>/proxy/<serviceName>/<functionName>/[action?queries]            

    サンプルコード:

    164901546557****.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/serviceName/functionName/action?hello=world           

    パラメーターの説明:

    パラメーター

    説明

    account_id

    Alibaba Cloud アカウントの ID です。

    Alibaba CloudアカウントのIDは、Alibaba Cloud管理コンソールの [セキュリティ設定] ページで取得できます。 Resource Access Management (RAM) ユーザーとしてログインしている場合は、コンソールの右上隅にあるプロフィール写真の上にポインターを移動して、Alibaba CloudアカウントのIDを取得します。

    region_id

    Function Computeが存在するリージョンのID。

    バージョン

    Function Compute APIのバージョン。

    serviceName

    サービス名。

    functionName

    関数名。

    アクション

    カスタム要求パス。

    クエリ

    クエリパラメーター。

方法3: cURLを使用して関数をテストする

  • 同期呼び出し

    次のコマンドを実行します。 コマンドの実行後、結果が返されます。

    curl -v https://http-***.cn-shenzhen.fcapp.run/$path
  • 非同期呼び出し

    次のコマンドを実行します。 コマンド出力は、Function Computeが非同期呼び出しリクエストを受信したかどうかを示します。 202ステータスコードが返された場合、非同期呼び出し要求は成功します。 別のステータスコードが返された場合、非同期呼び出し中にエラーが発生します。 ステータスコードの詳細については、「トラブルシューティング」をご参照ください。

    curl -v -H "X-Fc-Invocation-Type: Async" https://http-***.cn-shenzhen.fcapp.run/$path

(オプション) API Gatewayを使用してHTTP関数を保護する

デフォルトでは、Function ComputeはHTTPリクエストを認証せず、HTTP関数への匿名アクセスをサポートします。 誰でもHTTPリクエストを送信してHTTP関数を呼び出すことができます。 匿名アクセスによるリソースの浪費やセキュリティリスクを防ぐために、ID認証を有効にしながらHTTP関数をAPI Gatewayに接続できます。 IPベースのアクセス制御プラグイン、JWT認証プラグイン、またはAPI Gatewayの基本認証プラグインを使用して、HTTP機能を保護できます。

  1. Function Computeコンソールで、管理するHTTP関数を見つけます。 関数の詳細ページで、[トリガー] タブをクリックし、HTTPトリガーを編集します。 表示されるダイアログボックスで、[認証][はい] に設定します。

  2. にログインします。API GatewayコンソールHTTP関数が存在するリージョンに切り替えます。

  3. グループを作成します。 詳細については、「HTTPタイプのバックエンドサービスでAPIを作成する」トピックの [APIグループの作成] セクションをご参照ください。

  4. Canonical name (CNAME) を使用して、API Gatewayが提供する第2レベルのドメイン名にドメイン名を解決します。 詳細については、「CNAMEレコードの追加」をご参照ください。

  5. APIを作成します。

    主なパラメーターの設定方法を次に示します。 ビジネス要件に基づいて、デフォルト値を保持するか、他のパラメーターのカスタム値を設定します。 詳細については、「APIの作成」をご参照ください。

    • セキュリティ認証: [認証なし] を選択します。 その後の操作では、プラグインが認証に使用されます。

    • リクエストパス: ルートディレクトリ /を入力し、[すべてのサブパスに一致] を選択します。

    • HTTPメソッド: [ANY] を選択します。

    • リクエストモード: パススルーを選択します。

    • バックエンドサービスタイプ: [Function Compute] を選択します。

    • 関数タイプ: [HTTP関数] を選択します。

    • トリガーパス: function ComputeでHTTP関数の内部エンドポイントを選択します。

    • ContentType: [パススルークライアントコンテンツタイプヘッダー] を選択します。

  6. APIを公開します。 作成したAPIを見つけ、[操作] 列の [発行] をクリックし、オンライン環境を選択して、[発行] をクリックします。

  7. Backend Signatureタイプのプラグインを作成します。 Alibaba CloudアカウントのAccessKey IDおよびAccessKey secretkeyおよびvalueを設定します。 次に、作成したAPIにプラグインをバインドします。 詳細については、「概要」をご参照ください。

上記の手順を完了すると、独自のドメイン名を使用してHTTP関数にアクセスできます。 次のプラグインを作成してAPIにバインドし、HTTP関数を保護することもできます。

トラブルシューティング

HTTP関数を実行できないのはなぜですか?

関数の実行を終了できないのはなぜですか?

応答の送信に使用する関数が呼び出されているかどうかを確認できます。

  • Node.jsランタイムの場合、response.send() 関数を呼び出す必要があります。

  • Pythonランタイムの場合、return関数を呼び出す必要があります。

  • PHPランタイムの場合、return new Response() 関数を呼び出す必要があります。

  • Javaランタイムの場合、HttpServletResponse関数を呼び出す必要があります。

  • C# ランタイムの場合、return関数を呼び出す必要があります。

  • カスタムランタイムの場合、プログラミング言語に基づいて応答を送信するために使用される関数を呼び出す必要があります。

トラブルシューティング

関数を呼び出すリクエストを送信すると、次のエラーが発生する可能性があります。

  • リクエストエラー: リクエストが特定の要件を満たしていない場合、リクエストエラーが発生します。 この場合、HTTPステータスコード4xxがレスポンスで返されます。

  • 関数エラー: 関数コードが無効な場合、関数エラーが発生します。 この場合、HTTPステータスコード5xxが返されます。

次の表に、リクエストエラーと関数エラーが発生するシナリオを示します。

エラータイプ

X-Fc-エラータイプ

HTTPステータスコード

原因

課金可能

リクエストエラー

FcCommonError

400

リクエストがリクエストの制限を超えています。 詳細については、「概要」をご参照ください。

なし

FcCommonError

400

ID認証が必要な関数のリクエストには、日付または権限情報が含まれていません。

なし

FcCommonError

403

ID認証を必要とする関数のリクエストの署名が無効です。これは、認証情報が無効であることを示します。 日付は署名の計算に使用され、署名は15分間のみ有効です。 アクセス認証が必要なHTTPトリガーを使用する場合、リクエストヘッダーの日付情報が15分間生成された場合、署名は無効になります。

なし

FcCommonError

403

リクエストは、HTTPトリガーで設定されていないメソッドを使用して送信されます。 たとえば、POSTメソッドを使用してHTTPリクエストを送信しても、HTTPトリガーでPOSTメソッドの代わりにGETメソッドが設定されている場合、このエラーが発生します。

なし

FcCommonError

404

HTTPリクエストは、HTTPトリガーが設定されていない関数に送信されます。

なし

ユーザトラフィックスロットリング

FcCommonError

429

あなたのトラフィックは抑制されています。 同時リクエストを減らすか、Function Computeチームに連絡して同時実行性を高めることができます。

なし

関数エラー

UnhandledInvocationError

502

関数のレスポンスがHTTPレスポンスの制限を超えています。 詳細については、「概要」をご参照ください。

あり

UnhandledInvocationError

502

関数のコードには、構文エラーまたは例外が含まれています。

あり

UnhandledInvocationError

502

HTTP要求は、HTTPハンドラを使用しない関数に送信されます。

あり

システムエラーが発生します。

FcCommonError

500

Function Computeでシステムエラーが発生しました。 もう一度お試しください。

なし

システムトラフィックの抑制

FcCommonError

503

Function Computeではシステムスロットリングが有効になっています。 指数バックオフモードで再試行できます。

なし

問題が解決しない場合は、DingTalkユーザーグループに参加します (ID:11721331Function Computeテクニカルサポートにお問い合わせください。

詳細情報

Function Computeコンソールに加えて、次の方法を使用してトリガーを設定できます。

  • Serverless Devsを使用してトリガーを設定します。 詳細については、「Serverless Devs」をご参照ください。

  • SDKを使用してトリガーを設定します。 詳細は、SDK をご参照ください。

既存のトリガーを変更または削除するには、「トリガーの管理」をご参照ください。