HTTP トリガーは、Function Compute で扱っているトリガーの 1 つで、HTTP リクエストの送信により関数の実行がトリガーされます。HTTP トリガーを使用して Web サービスを構築できます。HTTP トリガーでは、HEAD、POST、PUT、GET、および DELETE メソッドを使用して、関数をトリガーします。
注意:
- HTTP トリガーハンドラーは、共通ハンドラーとは異なります。詳しくは、 「HTTP トリガーハンドラーの形式 」 をご参照ください。
- 現在、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 リクエストを次のアドレスに送信して関数を呼び出します。
<account_id>.<region>.fc.aliyuncs.com/<version>/proxy/<serviceName>/<functionName>/[action?queries]
Function Compute の関数ハンドラーとなる URL 内の request
パラメーターには、action
、queries
、request header
、body
、およびその他の情報が含まれています。
HTTP トリガー設定
HTTP トリガー Config を、次の形式に設定します。
{
"authType" : "anonymous",
"methods" : ["GET", "POST"]
}
通常、Config では authType と methods の 2 つのフィールドを使用します。これらのフィールドについて以下に説明します。
authType
:認証タイプを示します。次のように、anonymous または function に設定できます。anonymous
: サーバー認証の必要はなく、匿名でのアクセスが可能です。このモードのシステムはある程度安全です。
例:curl "<account-id>.<region>.fc.aliyuncs.com/2016-08-15/proxy/serviceName/functionName/action?hello=world"
function
: サーバー認証が必要であり、匿名ではアクセスすることができません。このモードのシステムは非常に安全です。さらに、署名認証に成功する必要があります。HTTP リクエストのヘッダーにAuthorization
とDate
の情報を追加しなければなりません。GMT 形式のDate
が署名アルゴリズムに使用されます。サーバーはDate
に基づいて署名を計算し、その結果をAuthorization
の入力値と比較します。比較の結果、要件を満たし、現在時刻とDate
の値との差が 15 分以内であれば認証が通ります。
methods
: HTTP トリガーで使用できるアクセスメソッドは次のとおりです。HEAD
: HTTP HEADGET
: HTTP GETPOST
: HTTP POSTPUT
: HTTP PUTDELETE
: HTTP DELETE
HTTP トリガーハンドラーの形式
HTTP トリガーのあるハンドラーは、Function Compute の一般的なハンドラーとは異なります。現時点で Function Compute は、Node.js および Python ランタイム環境に対応しています。ハンドラーの種類の詳細については、以下の関連トピックをご参照ください。
- HTTP トリガーのある Node.js 関数ハンドラー
- HTTP トリガーのある Python 関数ハンドラー
- HTTP トリガーのある Php 関数ハンドラー
- HTTP トリガーのある C# 関数ハンドラー
下図は、Node.js および Python ランタイム環境における、一般的なハンドラー (左側) と HTTP トリガーのあるハンドラー (右側) との比較です。HTTP トリガーを設定した後は、HTTP トリガーをサポートするハンドラーのみを使用できます。
Node.js ランタイム環境
Python ランタイム環境
例 1:コンソールでの操作
次の例では、Function Compute コンソールを使用して HTTP トリガーを設定する方法について説明します。トリガーとその作成方法についての詳細は、「はじめに」 および 「トリガーの作成」をご参照ください。
手順 1:HTTP トリガーの設定
関数の作成時、または関数が作成された後にトリガーを作成できます。
関数の作成時にトリガーを作成
Function Compute コンソールにログインします。
中国 (上海) などのリージョンを選択します。
左側のナビゲーションペインで、サービスを選択します。
[関数の作成] をクリックします。表示されたページで、次の手順を実行します。
a. [すべて選択] をクリックして、ドロップダウンリストから Node.js8 を選択します。 b. [空の関数] テンプレートを選択します。 c. (オプション) HTTP トリガーを選択し、必要に応じてパラメーターを設定します。[次へ] をクリックします。[トリガーなし] を選択することもできます。
d. 関数を作成して [サービス名]、[関数名]、[関数の説明]、および [ランタイム] を設定します。 e. [コード設定] エリアで、[インライン編集] を選択し、以下のサンプルコードを HTTP トリガーのあるハンドラー用に貼り付けます。この例は Node.js ランタイム環境で実行されることに注意してください。var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
// get requset header
var reqHeader = request.headers
var headerStr = ' '
for (var key in reqHeader) {
headerStr += key + ':' + reqHeader[key] + ' '
};
// get request info
var url = request.url
var path = request.path
var queries = request.queries
var queryStr = ''
for (var param in queries) {
queryStr += param + "=" + queries[param] + ' '
};
var method = request.method
var clientIP = request.clientIP
// get request body
getRawBody(request, function (err, data) {
var body = data
// you can deal with your own logic here
// set response
// var respBody = new Buffer('requestURI' + requestURI + ' path' + path + ' method' + method + ' clientIP' + clientIP)
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')
// var respBody = new Buffer( )
response.setStatusCode(200)
response.setHeader('content-type', 'application/json')
response.send(respBody)
})
};
f. [次へ] をクリックします。 j. (オプション) 必要な許可を設定します。 h. 設定を確認して [作成] をクリックします。
関数の作成後にトリガーを作成
Function Compute コンソールにログインします。
中国 (上海) などのリージョンを選択します。
左側のナビゲーションペインで、サービスを選択します。
関数を選択します。
[トリガー] タブをクリックし、[トリガーの作成] をクリックします。
表示されたページで、[HTTP トリガー] を選択し、必要に応じてパラメーターを設定します。次に、[OK] をクリックします。
手順 2:トリガーのデバッグ
関数を選択します。表示されたページで、[コード] タブをクリックし、[Params] タブが表示されるまでページを下にスクロールします。
[Params] タブをクリックし、キーと値のペアを入力します。キーと値のペアは自動的に HTTP URL に追加されます。
[Header] タブをクリックし、リクエストヘッダーのキーと値のペアを入力します。認証が必要な場合、このタブのリクエストヘッダーには自動的に Date キーと Authorization キーが含まれます。
[実行] をクリックします。
例 2:SDK プログラミング
この例では、Python SDK を使用して HTTP トリガーを作成します。
注意:HTTP リクエストを 指定アドレス に送信することによってのみ、HTTP トリガーで関数を呼び出すことができます。SDK プログラミングの invoke_function メソッドは使用できません。
前提条件
- Python ランタイム環境をデプロイしていること。
- Function Compute Python SDK ツールをインストールしていること。ローカルデバイスで
pip install aliyun-fc2
コマンドを実行してツールを入手することができます。
操作手順
Function Compute で関数をコンパイルし、サンプルコード を code フォルダの
main.js
ファイルにコピーして貼り付けます。create_http_trigger.py
という名前のファイルを作成し、そのファイルに次の Python コマンドをコピーして貼り付けます。
import fc2
import os
def main():
service_name = "http_trigger_service"
func_name = "test_http_trigger_node"
endpoint = os.getenv("FC_ENDPOINT")
url = "%s/2016-08-15/proxy/%s/%s" % (endpoint, service_name, func_name)
print url
fc_client = fc2.Client(
endpoint=endpoint,
accessKeyID=os.getenv("ACCESS_KEY_ID"),
accessKeySecret=os.getenv("ACCESS_KEY_SECRET"),
Timeout=5)
fc_client.create_service(service_name)
fc_client.create_function(service_name, func_name, "nodejs6", "main.handler", codeDir='./code')
trigger_config = {
"authType" : "anonymous",
"methods" : ["GET", "POST"],
}
fc_client.create_trigger(service_name, func_name, "trigger_on_echo", "http", trigger_config, "dummy_arn", "")
main()
HTTP トリガーを作成するには
python create_http_trigger.py
コマンドを入力します。HTTP リクエストを送信し、関数を呼び出します。
例:
curl -v "<account-id>.<region>.fc.aliyuncs.com/2016-08-15/proxy/http_trigger_service/test_http_trigger_node/action"
結果は次のとおりです。
トラブルシューティング
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 | システムスロットリングエラーの解決には、試行に失敗したリクエストを再送信します。 | いいえ |
問題が解決しない場合は、チケットを起票し、サポートセンターへお問い合わせください。