edit-icon download-icon

HTTP トリガー

最終更新日: May 31, 2019

HTTP トリガーは、Function Compute で扱っているトリガーの 1 つで、HTTP リクエストの送信により関数の実行がトリガーされます。HTTP トリガーを使用して Web サービスを構築できます。HTTP トリガーでは、HEAD、POST、PUT、GET、および DELETE メソッドを使用して、関数をトリガーします。

注意:

  1. HTTP トリガーハンドラーは、共通ハンドラーとは異なります。詳しくは、 「HTTP トリガーハンドラーの形式 」 をご参照ください。
  2. 現在、Java ランタイム環境は HTTP トリガーをサポートしていません。

利点

API Gateways のトリガーと比較して、HTTP トリガーには以下の利点があります。

  • 管理とデバッグが簡単です。HTTP トリガーは、Function Compute で Web サービスおよび API をすばやく実装するのに役立ちます。
  • 標準の HTTP テストツールを使用して、Function Compute ホストの機能とパフォーマンスを検証できます。
  • リクエスト処理が簡略化されます。HTTP トリガーは、リクエストおよびレスポンスをさまざまな形式で処理できます。JSON 文字列にエンコードまたはデコードする処理を省くことができるため、効率が向上します。
  • より簡単に CDN オリジン取得や MNS といった WebHook コールバックに対応したサービスに接続できます。

内容

本トピックでは、HTTP トリガーの次の点について説明します。

制約

  • 関数に HTTP トリガーを設定した後に、他のタイプのトリガーを設定することはできません。
  • 各関数に HTTP トリガーは1 つのみ割り当てることができます。

HTTP トリガーの設定

URL の作成

HTTP リクエストを次のアドレスに送信して関数を呼び出します。

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

Function Compute の関数ハンドラーとなる URL 内の request パラメーターには、actionqueriesrequest headerbody、およびその他の情報が含まれています。

HTTP トリガー設定

HTTP トリガー Config を、次の形式に設定します。

  1. {
  2. "authType" : "anonymous",
  3. "methods" : ["GET", "POST"]
  4. }

通常、Config では authType と methods の 2 つのフィールドを使用します。これらのフィールドについて以下に説明します。

  • authType:認証タイプを示します。次のように、anonymous または function に設定できます。
    • anonymous: サーバー認証の必要はなく、匿名でのアクセスが可能です。このモードのシステムはある程度安全です。
      例:
      1. curl "<account-id>.<region>.fc.aliyuncs.com/2016-08-15/proxy/serviceName/functionName/action?hello=world"
    • function: サーバー認証が必要であり、匿名ではアクセスすることができません。このモードのシステムは非常に安全です。さらに、署名認証に成功する必要があります。HTTP リクエストのヘッダーに AuthorizationDate の情報を追加しなければなりません。GMT 形式の Date が署名アルゴリズムに使用されます。サーバーは Date に基づいて署名を計算し、その結果を Authorization の入力値と比較します。比較の結果、要件を満たし、現在時刻と Date の値との差が 15 分以内であれば認証が通ります。
  • methods: HTTP トリガーで使用できるアクセスメソッドは次のとおりです。
    • HEAD: HTTP HEAD
    • GET: HTTP GET
    • POST: HTTP POST
    • PUT: HTTP PUT
    • DELETE: HTTP DELETE

HTTP トリガーハンドラーの形式

HTTP トリガーのあるハンドラーは、Function Compute の一般的なハンドラーとは異なります。現時点で Function Compute は、Node.js および Python ランタイム環境に対応しています。ハンドラーの種類の詳細については、以下の関連トピックをご参照ください。

下図は、Node.js および Python ランタイム環境における、一般的なハンドラー (左側) と HTTP トリガーのあるハンドラー (右側) との比較です。HTTP トリガーを設定した後は、HTTP トリガーをサポートするハンドラーのみを使用できます。

Node.js ランタイム環境

nodejs_compare

Python ランタイム環境

python_compare

例 1:コンソールでの操作

次の例では、Function Compute コンソールを使用して HTTP トリガーを設定する方法について説明します。トリガーとその作成方法についての詳細は、「はじめに」 および 「トリガーの作成」をご参照ください。

手順 1:HTTP トリガーの設定

関数の作成時、または関数が作成された後にトリガーを作成できます。

関数の作成時にトリガーを作成

  1. Function Compute コンソールにログインします。

  2. 中国 (上海) などのリージョンを選択します。

  3. 左側のナビゲーションペインで、サービスを選択します。

  4. [関数の作成] をクリックします。表示されたページで、次の手順を実行します。

    a. [すべて選択] をクリックして、ドロップダウンリストから Node.js8 を選択します。 b. [空の関数] テンプレートを選択します。 c. (オプション) HTTP トリガーを選択し、必要に応じてパラメーターを設定します。[次へ] をクリックします。[トリガーなし] を選択することもできます。
    Create a trigger d. 関数を作成して [サービス名]、[関数名]、[関数の説明]、および [ランタイム] を設定します。 e. [コード設定] エリアで、[インライン編集] を選択し、以下のサンプルコードを HTTP トリガーのあるハンドラー用に貼り付けます。この例は Node.js ランタイム環境で実行されることに注意してください。

    1. var getRawBody = require('raw-body')
    2. module.exports.handler = function (request, response, context) {
    3. // get requset header
    4. var reqHeader = request.headers
    5. var headerStr = ' '
    6. for (var key in reqHeader) {
    7. headerStr += key + ':' + reqHeader[key] + ' '
    8. };
    9. // get request info
    10. var url = request.url
    11. var path = request.path
    12. var queries = request.queries
    13. var queryStr = ''
    14. for (var param in queries) {
    15. queryStr += param + "=" + queries[param] + ' '
    16. };
    17. var method = request.method
    18. var clientIP = request.clientIP
    19. // get request body
    20. getRawBody(request, function (err, data) {
    21. var body = data
    22. // you can deal with your own logic here
    23. // set response
    24. // var respBody = new Buffer('requestURI' + requestURI + ' path' + path + ' method' + method + ' clientIP' + clientIP)
    25. var respBody = new Buffer('requestHeader:' + headerStr + '\n' + 'url: ' + url + '\n' + 'path: ' + path + '\n' + 'queries: ' + queryStr + '\n' + 'method: ' + method + '\n' + 'clientIP: ' + clientIP + '\n' + 'body: ' + body + '\n')
    26. // var respBody = new Buffer( )
    27. response.setStatusCode(200)
    28. response.setHeader('content-type', 'application/json')
    29. response.send(respBody)
    30. })
    31. };

    f. [次へ] をクリックします。 j. (オプション) 必要な許可を設定します。 h. 設定を確認して [作成] をクリックします。

関数の作成後にトリガーを作成

  1. Function Compute コンソールにログインします。

  2. 中国 (上海) などのリージョンを選択します。

  3. 左側のナビゲーションペインで、サービスを選択します。

  4. 関数を選択します。

  5. [トリガー] タブをクリックし、[トリガーの作成] をクリックします。

  6. 表示されたページで、[HTTP トリガー] を選択し、必要に応じてパラメーターを設定します。次に、[OK] をクリックします。

    Create a trigger

手順 2:トリガーのデバッグ

  1. 関数を選択します。表示されたページで、[コード] タブをクリックし、[Params] タブが表示されるまでページを下にスクロールします。

  2. [Params] タブをクリックし、キーと値のペアを入力します。キーと値のペアは自動的に HTTP URL に追加されます。

    params

  3. [Header] タブをクリックし、リクエストヘッダーのキーと値のペアを入力します。認証が必要な場合、このタブのリクエストヘッダーには自動的に Date キーと Authorization キーが含まれます。

    headers

  4. [実行] をクリックします。

例 2:SDK プログラミング

この例では、Python SDK を使用して HTTP トリガーを作成します。

注意:HTTP リクエストを 指定アドレス に送信することによってのみ、HTTP トリガーで関数を呼び出すことができます。SDK プログラミングの invoke_function メソッドは使用できません。

前提条件

  • Python ランタイム環境をデプロイしていること。
  • Function Compute Python SDK ツールをインストールしていること。ローカルデバイスで pip install aliyun-fc2 コマンドを実行してツールを入手することができます。

操作手順

  1. Function Compute で関数をコンパイルし、サンプルコード を code フォルダの main.js ファイルにコピーして貼り付けます。

  2. create_http_trigger.py という名前のファイルを作成し、そのファイルに次の Python コマンドをコピーして貼り付けます。

  1. import fc2
  2. import os
  3. def main():
  4. service_name = "http_trigger_service"
  5. func_name = "test_http_trigger_node"
  6. endpoint = os.getenv("FC_ENDPOINT")
  7. url = "%s/2016-08-15/proxy/%s/%s" % (endpoint, service_name, func_name)
  8. print url
  9. fc_client = fc2.Client(
  10. endpoint=endpoint,
  11. accessKeyID=os.getenv("ACCESS_KEY_ID"),
  12. accessKeySecret=os.getenv("ACCESS_KEY_SECRET"),
  13. Timeout=5)
  14. fc_client.create_service(service_name)
  15. fc_client.create_function(service_name, func_name, "nodejs6", "main.handler", codeDir='./code')
  16. trigger_config = {
  17. "authType" : "anonymous",
  18. "methods" : ["GET", "POST"],
  19. }
  20. fc_client.create_trigger(service_name, func_name, "trigger_on_echo", "http", trigger_config, "dummy_arn", "")
  21. main()
  1. HTTP トリガーを作成するには python create_http_trigger.py コマンドを入力します。

  2. HTTP リクエストを送信し、関数を呼び出します。

    例:

    1. curl -v "<account-id>.<region>.fc.aliyuncs.com/2016-08-15/proxy/http_trigger_service/test_http_trigger_node/action"

結果は次のとおりです。

Result

トラブルシューティング

HTTP トリガーを作成して関数を呼び出した後、リクエストエラーと関数エラーが発生する可能性があります。リクエストが無効で、 response パラメーターに 4xx ステータスコードが含まれているとリクエストエラーが発生します。関数が適切にプログラムされておらず、 5xx ステータスコードが返される場合、関数エラーが発生します。次の表は、リクエストエラーまたは関数エラーが発生する可能性があるシナリオ、およびそのようなエラーを迅速にトラブルシューティングする方法を説明しています。

エラーの種類 X-Fc-Error-Type HTTP ステータスコード 説明 引き続き課金されるか
リクエストエラー FcCommonError 400 リクエストが レスポンスの上限を超えています。 いいえ
FcCommonError 400 認証を必要とする関数を呼び出すリクエストに、Date または Authorization が含まれていません。 いいえ
FcCommonError 403 認証を必要とする機能を呼び出すリクエストの署名が正しくありません。認証の必要な HTTP トリガーによく発生するエラーです。Date 値と現在時刻との差が 15 分以上ある場合の署名は無効です。 いいえ
FcCommonError 403 HTTP トリガーに設定されていないメソッドがリクエストされました。たとえば、HTTP トリガーには GET メソッドのみが設定されていますが、POST メソッドがリクエストされました。 いいえ
FcCommonError 404 HTTP トリガーのない関数を呼び出す HTTP リクエストが送信されました。 いいえ
ユーザースロットリングエラー FcCommonError 429 同時実行性を減らすために、トラフィックがスロットリングされています。チケットを起票して、同時実行クォータの引き上げをリクエストできます。 いいえ
関数エラー UnhandledInvocationError 502 関数が返す値がレスポンスの上限を超えています。 はい
UnhandledInvocationError 502 関数コードに構文エラーまたは例外があります。 はい
UnhandledInvocationError 502 HTTP トリガーのない関数に HTTP リクエストが送信されました。 はい
システムエラー FcCommonError 500 Function Compute で発生するシステムエラーの解決には、リクエストを再送信します。 いいえ
システムスロットリングエラー FcCommonError 503 システムスロットリングエラーの解決には、試行に失敗したリクエストを再送信します。 いいえ

問題が解決しない場合は、チケットを起票し、サポートセンターへお問い合わせください。