Function Compute はイベント駆動型のサービスです。特定のイベントが発生することによって関数は実行されます。現在、Function Compute のイベントソースとして API Gateway を使用できます。API リクエストで Function Compute をバックエンドサービスが指定されると、API Gateway は該当関数をトリガーします。Function Compute は実行結果を API Gateway に返します。
API Gateway は Function Compute と相互に接続されているため、認証、スロットリング、およびデータ変換といった関数を API として提供できます(API Gateway の機能を参照)。
実装の原則
API Gateway が Function Compute を呼び出す際、API リクエストのデータを(下図のような) Map 形式にしてから Function Compute に送信します。Function Compute はデータを処理すると、 statusCode、body、headers、およびその他のデータを下図の出力形式にして返します。API Gateway は Function Compute からの応答コンテンツを statusCode、headers、body、その他のデータを Map 形式にしてクライアントに返します。
API Gateway より Function Compute に送信されるパラメーターの形式
Function Compute を API Gateway のバックエンドサービスとして使用する場合、 API Gateway が Function Compute に送信するイベントリクエストの形式には決まりがあります。Function Compute は、次の形式でパラメーターを受け取り、処理します。
{
"path":"api request path",
"httpMethod":"request method name",
"headers":{all headers,including system headers},
"queryParameters":{query parameters},
"pathParameters":{path parameters},
"body":"string of request payload",
"isBase64Encoded":"true|false, indicate if the body is Base64-encode"
}
注意:
"isBase64Encoded"
が"true"
に設定されている場合、API Gateway が Function Compute に送信する body のコンテンツは Base64 文字列にエンコードされます。body のコンテンツを処理する前に、Function Compute は、Base64 文字列をデコードする必要があります。"isBase64Encoded"
が"false"
に設定されている場合、API Gateway は body のコンテンツを Base64 文字列にエンコードしません。
Function Compute レスポンスパラメーターの形式
API Gateway が解析できるよう、Function Compute は API Gateway に以下のとおり、コンテンツを JSON 形式にして返します。
{
"isBase64Encoded":true|false,
"statusCode":httpStatusCode,
"headers":{response headers},
"body":"..."
}
注意:
- body のコンテンツがバイナリ形式の場合、
"isBase64Encoded"
を"true"
に指定すると Function Compute は body のコンテンツを Base64 文字列にエンコードされます。body のコンテンツを Base64 形式にエンコードする必要がない場合は、"isBase64Encoded"
に"false"
を指定します。"isBase64Encoded"
が"true"
の場合、API Gateway はクライアントに返す前に Base64 文字列の body のコンテンツをデコードします。- Node.js 環境では、Function Compute は状況に応じてコールバックを設定します。
- 成功メッセージを返す場合:callback{null,{“statusCode”:200,”body”:”…”}}。
- 例外を返す場合:callback{new Error('internal server error'),null}。
- クライアントエラーを返す場合:callback{null,{“statusCode”:400,”body”:”param error”}}。
- Function Compute からの応答結果の形式が適切でない場合、 API Gateway は、クライアントに 503 Service Unavailable を返します。
バックエンドサービス Function Compute の API を作成する
バックエンドサービス Function Compute の API を作成するには、次の手順を実行します。
Function Compute コンソールで関数を作成する
サービスを作成します。Function Compute コンソールにログインし、サービスと関数のリージョンを選択して作成し、サービスの作成をクリックします。ダイアログボックスで、サービスの作成プロセスを完了します。
注意:サービスの作成後は、リージョンを変更できませんので、リージョンは間違えずに選択します。
- 作成したサービスに関数を作成します。この新しく作成されたサービスのページで、関数の作成をクリックし、関数の作成処理を入力します。
- 関数テンプレートを選択します。Function Compute コンソールでは環境 Node.js 6 : api-gateway-nodejs6 のための API Gateway バックエンド実行テンプレートを提供しています。api-gateway-nodejs6 テンプレートがビジネスニーズに適合しない場合は、ブランク関数を選択します。ブランク関数テンプレートを選択した場合は、基本管理設定でコードを記述する必要があります。アップロードを完了するには、事前にコードのパッケージを用意しておいてください。
- トリガーを設定します。トリガー しないを選択し、[次へ] をクリックします。
- 関数を設定します。基本情報の入力、コードの記述、環境変数の設定、環境の設定を行います。 [次へ]をクリックします。
- サービスロール管理は無視して [次へ]をクリックします。すでに RAM コンソールで対応する roleArn 許可を設定しているため、ここではサービスのロールを設定する必要はありません。API Gateway コンソールで API を作成する場合、[許可の取得]をクリックして roleArn 許可を自動的に取得します。
- すべての情報が正しいことを確認の上、作成をクリックします。 関数の作成後に、関数リストで基本情報を確認します。
Function Compute バックエンドサービス API を作成し定義する
API Gateway コンソール で API を作成し、Function Compute としてバックエンドサービスを定義します。
- API Gateway コンソール にログインします。
グループを作成します。
左側のナビゲーションペインで [API グループ] をクリックし、グループのリージョンを選択して[グループの作成] をクリックします。(すでにグループを作成している場合は、このステップをスキップします。)注意:Function Compute と API が異なるリージョンにある場合は、Function Compute サービスは、インターネット経由でアクセスされます。
高いデータセキュリティと低遅延ネットワークが要求される場合には、関数と同じリージョンに API を作成してください。API を作成し、定義します。
- グループの作成後、グループの操作列から[API の表示]ボタンをクリックしてグループの [API リスト]ページに移動します。1.[ API の作成] をクリックし API の作成と定義に入ります。
- API の基本情報を入力し、次へ をクリックします。
API のリクエストを定義し、 [次へ] をクリックします。
注意:リクエストモード を リクエストパラメーターのパススルー に設定すると、API Gateway に送信された body パラメーターの内容は処理されずに Function Compute に直接送信されます。
API のバックエンドサービスを定義し、 [次へ]をクリックします。
注意:このページでは、次の条件を満たす必要があります。
- バックエンドサービスタイプ には、Function Compute を設定します。
- サービス名 には、Function Compute コンソール で作成したサービスの名前を入力します。
- 関数名 には、Function Compute コンソール で作成した関数の名前を入力します。
- [許可の取得]をクリックして Arn ロールを自動取得します。API Gateway バックエンドサービスとして Function Compute に初めてロール許可を取得している場合は、 許可の取得をクリックすると、RAM コンソールの認証ページが表示されます。RAMコンソールで許可を付与するポリシーをクリックし、API の作成ページに戻り、許可の取得 を再びクリックします。Arn ロールは、自動的に選択ボックスに表示されます。
レスポンスを定義して 作成 クリックします。
注意:レスポンスのサンプルの設定は必須であり、フォーマットは、Function Compute レスポンスパラメーターの形式に従う必要があります。
API をデバッグする
API を作成して定義すると、自動的に [API リスト] ページが表示されます。作成した API のリクエストパスが正しいことを検証します。
- API リスト ページで、API 名をクリックするか、[管理] ボタンをクリックして[API 定義]ページに移動します。
- 左側のナビゲーションペインで[API のデバッグ]をクリックします。
- リクエストパラメーターを入力し、[リクエストの送信]をクリックします。応答結果は、ページの右側に表示されます。成功結果が返された場合、API は使用できます。エラーコード 4XX または 5XX が返される場合、リクエストの際にエラーが発生したことを示します。詳細については、エラーメッセージの取得方法 および エラーコード一覧をご参照ください。
- 本番稼働の前に、ステージングステージ(環境)へ API を公開して検証します。 API が使用可能であることを検証後、API 定義 ページに戻り、API をステージングステージ(環境)に公開します。呼び出しの検証には、サブドメイン名を使用して実際のユーザによるリクエストをシミュレーションします。
注意:API の定義に環境変数を設定している場合は、headers に
X-Ca-Stage: PRE
パラメーターを指定してステージングステージ(環境)の API を呼び出します。
本番環境に API を公開する
API のデバッグを実行して使用に差し支えないことを確認後、公開します。
- API 一覧ページで、API 名をクリックするか、管理 ボタンをクリクしてAPI 定義ページに移動します。
- ページの右上にある[デプロイ]ボタンをクリックします。
- 本番 を選択し、コメント欄を入力し、 [デプロイ] をクリックします。本番ステージ(環境)に公開するとユーザーは API を呼び出すことができます。
公開についての詳細は、API の公開 をご参照ください。
サンプル
関数コードのサンプル、API リクエストのサンプル、および API Gateway レスポンスのサンプルは、次のとおりです。
関数コードのサンプル
Function Compute に設定されたコードのサンプルです。
module.exports.handler = function(event, context, callback) {
var responseCode = 200;
console.log("request: " + JSON.stringify(event.toString()));
// イベントを JSON オブジェクトに変換します。
event=JSON.parse(event.toString());
var isBase64Encoded=false;
// 検証用に入力した statusCode をそのまま返します。
if (event.queryParameters !== null && event.queryParameters !== undefined) {
if (event.queryParameters.httpStatus !== undefined && event.queryParameters.httpStatus !== null && event.queryParameters.httpStatus !== "") {
console.log("Received http status: " + event.queryParameters.httpStatus);
responseCode = event.queryParameters.httpStatus;
}
}
// body が Base64 エンコードされている場合、Function Compute は body を復号化します。
if(event.body!==null&&event.body!==undefined){
if(event.isBase64Encoded!==null&&event.isBase64Encoded!==undefined&&event.isBase64Encoded){
event.body=new Buffer(event.body,'base64').toString();
}
}
// input には API Gateway が Function Compute に送信するコンテンツを記述します。
var responseBody = {
message: "Hello World!",
input: event
};
// body の文字列を Base64 エンコードします。必要に応じて設定します。
var base64EncodeStr=new Buffer(JSON.stringify(responseBody)).toString('base64');
// Function Compute の API Gateway に返す応答形式。次の要件を満たす必要があります。isBase64Encoded には body を Base64 エンコードする必要があるかどうかを設定します。
var response = {
isBase64Encoded:true,
statusCode: responseCode,
headers: {
"x-custom-header" : "header value"
},
body: base64EncodeStr
};
console.log("response: " + JSON.stringify(response));
callback(null, response);
};
リクエストのサンプル
以下の APIの POST 形式リクエスト Path です。
/fc/test/invoke/[type]
POST http://test.alicloudapi.com/fc/test/invoke/test?param1=aaa¶m2=bbb
"X-Ca-Signature-Headers":"X-Ca-Timestamp,X-Ca-Version,X-Ca-Key,X-Ca-Stage",
"X-Ca-Signature":"TnoBldxxRHrFferGlzzkGcQsaezK+ZzySloKqCOsv2U=",
"X-Ca-Stage":"RELEASE",
"X-Ca-Timestamp":"1496652763510",
"Content-Type":"application/x-www-form-urlencoded; charset=utf-8",
"X-Ca-Version":"1",
"User-Agent":"Apache-HttpClient\/4.1.2 (java 1.6)",
"Host":"test.alicloudapi.com",
"X-Ca-Key":"testKey",
"Date":"Mon, 05 Jun 2017 08:52:43 GMT","Accept":"application/json",
"headerParam":"testHeader"
{"bodyParam":"testBody"}
API Gateway レスポンスのサンプル
200
Date: Mon, 05 Jun 2017 08:52:43 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 429
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS , PATCH
Access-Control-Allow-Headers: X-Requested-With, X-Sequence,X-Ca-Key,X-Ca-Secret,X-Ca-Version,X-Ca-Timestamp,X-Ca-Nonce,X-Ca-API-Key,X-Ca-Stage,X-Ca-Client-DeviceId,X-Ca-Client-AppId,X-Ca-Signature,X-Ca-Signature-Headers,X-Forwarded-For,X-Ca-Date,X-Ca-Request-Mode,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range,Content-MD5
Access-Control-Max-Age: 172800
X-Ca-Request-Id: 16E9D4B5-3A1C-445A-BEF1-4AD8E31434EC
x-custom-header: header value
{"message":"Hello World!","input":{"body":"{\"bodyParam\":\"testBody\"}","headers":{"X-Ca-Api-Gateway":"16E9D4B5-3A1C-445A-BEF1-4AD8E31434EC","headerParam":"testHeader","X-Forwarded-For":"100.81.146.152","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},"httpMethod":"POST","isBase64Encoded":false,"path":"/fc/test/invoke/test","pathParameters":{"type":"test"},"queryParameters":{"param1":"aaa","param2":"bbb"}}}
よくある質問
作成した関数を入力できないのはなぜですか
入力したサービス名および関数名が、Function Compute コンソールで作成したサービスおよび関数と名前が一致していることをご確認ください。
API のバックエンドサービスとして複数の関数を設定できますか
いいえ。現在、各 API には関数を 1 つしかマッピングすることができません。