Function Compute で Node.js を使用するには、Node.js 関数をハンドラとして定義する必要があります。現在、Node.js ランタイム環境では、共通ハンドラまたは HTTP トリガーハンドラをサポートしています。HTTP トリガーを使用すると、HTTP リクエストをより効率的に処理できます。HTTPトリガーハンドラを除き、他の Node.js でコーディングされた関数ハンドラーはすべて共通ハンドラを使います。Node.js ランタイム環境の詳細については、「Node.js ランタイム環境」をご参照ください。
内容
このトピックでは、共通ハンドラと HTTP トリガーハンドラについて説明します。
共通ハンドラ
関数は次のように定義されます。
exports.handler = function(event, context, callback) {
callback(null, 'hello world');
};
関数名
exports.handler
は、関数の作成時に提供される “handler” フィールドと一致しなければなりません。たとえば、ハンドラが index.handler
として指定されている場合、Function Compute はindex.js
ファイルで定義された handler
関数を取得します。
event パラメーター
event パラメーターは、関数を呼び出すときに定義されます。このパラメーターは
Buffer
型で、関数の入力パラメーターです。event パラメーターは、関数によって定義されていません。関数に渡されると、event は
Buffer
型になります。このパラメーターは必要に応じて変換できます。たとえば、JSON 文字列が渡された場合、パラメーターをobject
に変換できます。渡された event の例:{
"key": "value"
}
関数コード:
exports.handler = function(event, context, callback) {
var eventObj = JSON.parse(event.toString());
callback(null, eventObj['key']);
};
value パラメーターが返されます。
context パラメーター
context パラメータには、 リクエスト ID や一時セキュリティトークンなど、関数の実行時に生成される情報が含まれます。コーディングの際に、生成された情報を使用できます。このパラメーターは
object
型です。context パラメーターは、次のように定義できます。
{
'requestId': 'b1c5100f-819d-c421-3a5e-7782a27d8a33',
'credentials': {
'accessKeyId': 'STS.access_key_id',
'accessKeySecret': 'access_key_secret',
'securityToken': 'security_token',
},
'function': {
'name': 'my-func',
'handler': 'index.handler',
'memory': 128,
'timeout': 10,
},
'service': {
'name': 'my-service',
'logProject': 'my-log-project',
'logStore': 'my-log-store',
},
'region': 'cn-shanghai',
'accountId': '123456'
}
上記の関数の主要パラメーターは、次のとおりです。
- requestId: この呼び出しの一意の ID です。例外が発生した場合のトラブルシューティングを容易にするため、このパラメータをメモしておいてください。
- function:この関数に関する基本情報 (関数名、ハンドラ、関数メモリ、タイムアウト時間など) です。
- credentials:Function Compute がサービスロールを想定して取得する、一時セキュリティ認証情報です。これらの認証情報は、生成されてから 6 時間に失効します。このパラメーターを使用して、OSS などの特定のサービスにアクセスできます。これにより、AccessKey が関数コードにハードコーディングで書き込まれることを防ぎます。
- service:現在の関数が提供するサービスの詳細を指定します。たとえば、このパラメーターにはサービス名、ログプロジェクト、Log Service の Logstore などが含まれます。
- region:cn-shanghai など、この関数が適用されるリージョンです。
- accountId:Alibaba Cloud アカウントの ID です。
次のコードでは、OSS にファイルを送信するために Security Token Service (STS) が使用されています。
var OSSClient = require('ali-oss').Wrapper;
exports.handler = function (event, context, callback) {
console.log(event.toString());
var ossClient = new OSSClient({
accessKeyId: context.credentials.accessKeyId,
accessKeySecret: context.credentials.accessKeySecret,
stsToken: context.credentials.securityToken,
region: 'oss-cn-shanghai',
bucket: 'my-bucket',
});
ossClient.put('my-object', new Buffer('hello, fc')).then(function (res) {
callback(null, 'put object');
}).catch(function (err) {
callback(err);
});
};
注意:STS を使用して OSS にアクセスできるように、一時セキュリティトークンを発行する必要があります。
callback パラメーター
- callback パラメーターは、呼び出された関数の結果を返すために使用されます。パラメーターシグネチャは、
function(err, data)
です。Node.js 関数のほとんどの callback と同様に、callback の最初のパラメーターは error で、2 番目のパラメーターは data です。callback が呼び出されたときに err パラメーターが空でない場合、HandledInvocationError
が返されます。それ以外の場合は、データの値が返されます。データがBuffer
型の場合、結果は直ちに返されます。データがobject
型の場合、結果は変換後に返されます。データが他の型の場合、結果は文字列に変換されてから返されます。
HTTP トリガーハンドラ
注意:HTTP トリガーハンドラは、共通ハンドラとは異なります。
function(request, response, context)
上記の関数では、context パラメーターは、共通ハンドラの context と同じです。
request パラメーター
headers
:map 型で、HTTP クライアントからのキーと値のペアの格納に使用されます。path
:string 型で、HTTP クライアントの URL を指定します。queries
:map 型で、HTTP クライアントの URL からのクエリリクエストのキーと値のペアを格納するために使用されます。パラメーター値は、文字列または配列です。method
:string 型で、HTTP メソッドが使用されます。clientIP
:string 型で、クライアントの IP アドレスを指定します。url
:string 型で、リクエストの URL を指定します 。
HTTP body の取得:HTTP トリガーハンドラのリクエストパラメーターは、HTTP リクエストと互換性があります。body フィールドは用意されていません。HTTP リクエストを使用して、 HTTP body を取得できます。
// 詳細については、次の例をご参照ください。
var getRawBody = require('raw-body')
getRawBody(request, function(err, data){
var body = data
})
注意:headers パラメーターのキーに、次のフィールドが含まれている場合、このキーは無視されます。これは、Function Compute がデフォルトで次のフィールドを提供するためです。ユーザー定義フィールドはサポートしていません。
x-fc-
で始まるキーも無視されます。
accept-encoding
connection
keep-alive
proxy-authorization
te
trailer
transfer-encoding
レスポンスで提供されるメソッド
response.setStatusCode(statusCode)
: status code を設定します。- param
statusCode
: (required, type integer)
- param
response.setHeader(headerKey, headerValue)
: header を設定します。- param
headerKey
: (required, type string) - param
headerValue
: (required, type string)
- param
response.deleteHeader(headerKey)
: header を削除します。- param
headerKey
: (required, type string)
- param
response.send(body)
: body を送信します。- param
body
: (required, typeBuffer
or astring
or astream.Readable
)
- param
注意: headers パラメーターのキーに、次のフィールドが含まれている場合、このキーは無視されます。これは、Function Compute がデフォルトで次のフィールドを提供するためです。ユーザー定義フィールドはサポートしていません。
x-fc-
で始まるキーも無視されます。
connection
content-length
content-encoding
date
keep-alive
proxy-authenticate
server
trailer
transfer-encoding
upgrade
制限事項
リクエストの制限事項
リクエストが次の制限を超えると、 400
ステータスコードおよび InvalidArgument
エラーコードが表示されます。
- headers サイズ:headers パラメーターのすべてのキーと値のサイズは 4 KB を超えることはできません。
- path サイズ:path のサイズは、すべての query パラメーターのサイズに等しく、4 KB を超えることはできません。
- body サイズ:HTTP リクエストの body サイズは、 6 MB を超えることはできません。
レスポンスの制限事項
レスポンスが以下の制限を超えると、 502
ステータスコードおよび BadResponse
エラーコードが表示されます。
- headers サイズ:headers パラメーターのすべてのキーと値のサイズは 4 KB を超えることはできません。
- body サイズ:HTTP レスポンスの body サイズは、 6 MB を超えることはできません。