このトピックでは、Function Compute 3.0 を例に、API Gateway と Function Compute を統合する方法について説明します。
前提条件
API Gateway インスタンスを作成済みであること。インスタンスの選択については、「インスタンスタイプの選択ガイド」をご参照ください。
概要
API Gateway は、Function Compute の関数として、HTTP 関数とイベント関数の 2 種類をサポートしています。
HTTP 関数と API Gateway の統合
ステップ 1:Web 関数の作成
API Gateway を設定する前に、Function Compute 3.0 コンソールで Web 関数を作成する必要があります。詳細については、「Web 関数の作成」をご参照ください。
ステップ 2:バックエンドサービスの作成
API Gateway でバックエンドサービスを定義し、そのアドレスをご利用の Function Compute サービスに設定します。
-
API Gateway コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。上部のナビゲーションバーでリージョンを選択し、[バックエンドサービスの作成] をクリックします。

-
[バックエンドサービスの作成] ダイアログボックスで、パラメーターを設定し、[OK] をクリックします。
[名前] を
FC-backendに設定します。 [タイプ] を [Function Compute] に、[製品バージョン] を [Function Compute 3.0] に、[関数タイプ] を [HTTP 関数] に設定します。 -
バックエンドサービスページで、作成したバックエンドサービスをクリックします。表示されたサービス定義ページで、[本番] タブを選択します。[基本情報] セクションで、[作成] をクリックします。
-
[基本情報] ページで、[トリガーパス] のアクセスアドレスを設定し、[公開] をクリックします。
アクセスアドレスは HTTP 関数の URL です。例:
https://helloworld-xxx-hangzhou-vpc.fcapp.run。
ステップ 3:API の作成
API Gateway コンソールで API を作成します。詳細については、「API の作成」をご参照ください。
-
API グループを選択します。Function Compute 関数と同じリージョンに作成することを推奨します。
Function Compute 関数と API が異なるリージョンにある場合、API Gateway はインターネット経由でリクエストをご利用の Function Compute サービスにルーティングするため、データ転送コストが発生する可能性があります。データセキュリティとネットワーク遅延が重要な場合は、API と Function Compute 関数が同じリージョンにあることを確認してください。
API を作成して定義します。[バックエンドサービスの定義] ステップで、次のパラメーターを設定します。
バックエンド設定:既存のバックエンドサービスを使用します。
バックエンドサービスタイプ:Function Compute。
製品バージョン:Function Compute 3.0。
関数タイプ:HTTP 関数。
バックエンドサービス:作成したバックエンドサービスの名前を選択します。
バックエンドリクエストパス:カスタムパスを指定できます。指定しない場合は、スラッシュ (/) を入力します。
HTTP メソッド:バックエンドの Function Compute 関数がサポートするメソッドを選択します。複数のメソッドがサポートされている場合は、ANY を選択します。
別のアカウントの関数の使用
API Gateway は、別の Alibaba Cloud アカウントに属する Function Compute 関数を呼び出すことができます。このセクションでは、アカウント A の API Gateway インスタンスがアカウント B の関数を呼び出す方法について説明します。
-
アカウント B は、アカウント A の API Gateway インスタンスに Function Compute 関数を呼び出す権限を付与する必要があります。
ステップ 1:アカウント B として Resource Access Management (RAM) コンソールにログインし、RAM ロールを作成します。詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールの作成」をご参照ください。
ステップ 2:ステップ 1 で作成した RAM ロールに Function Compute 関数を呼び出す権限を付与します。`AliyunFCInvocationAccess` という名前のシステムポリシーをアタッチします。詳細については、「RAM ロールへの権限付与」をご参照ください。
ステップ 3:ステップ 1 で作成した RAM ロールの信頼ポリシーを編集します。詳細については、「RAM ロールの信頼ポリシーの編集」をご参照ください。アカウント A の ID (例:123456789012****) を信頼ポリシーに追加します。変更後の信頼ポリシーは次のとおりです。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "123456789012****@apigateway.aliyuncs.com" ] } } ], "Version": "1" }ステップ 4:アカウント B は、ステップ 1 で作成した RAM ロールの Alibaba Cloud リソースネーム (ARN) をアカウント A に提供します。詳細については、「RAM ロールの概要」をご参照ください。
-
API Gateway コンソールで、アカウント A はアカウント B の Function Compute 関数にアクセスするバックエンドサービスを追加します。トリガーパスには、アカウント B の関数のアクセス URL を入力します。ロールの ARN には、アカウント B から提供された ARN を入力します。
HTTP 関数をバックエンドサービスとして使用する場合、クライアントの `Authorization` ヘッダーは API Gateway によって上書きされます。クライアント側では別のパラメーター名を使用することを推奨します。
イベント関数と API Gateway の統合
ステップ 1:イベントトリガー関数の作成
Function Compute 3.0 コンソールでイベント関数を作成するには、「イベントトリガー関数の作成」をご参照ください。
ステップ 2:バックエンドサービスの作成
API Gateway でバックエンドサービスを定義し、そのアドレスをご利用の Function Compute サービスに設定します。
-
API Gateway コンソールにログインします。リージョンを選択します。左側のナビゲーションウィンドウで、 を選択します。右上隅にある [バックエンドサービスの作成] をクリックします。
[名前] を
FC-mobileに設定します。[タイプ] を Function Compute に、[製品バージョン] を Function Compute 3.0 に、[関数タイプ] を イベント関数 に設定します。 -
バックエンドサービスページで、作成したバックエンドサービスをクリックします。表示されたサービス定義ページで、[本番] タブを選択します。[基本情報] セクションで、[作成] をクリックします。
-
作成したイベント関数の名前を選択し、[公開] をクリックします。
[リージョン] を [中国 (杭州)] に、[関数のエイリアス] を [LATEST] に設定します。
ステップ 3:API の作成
API Gateway コンソールで API を作成します。詳細については、「API の作成」をご参照ください。
-
API グループを選択します。Function Compute 関数と同じリージョンに作成することを推奨します。
Function Compute 関数と API が異なるリージョンにある場合、API Gateway はインターネット経由でリクエストをご利用の Function Compute サービスにルーティングするため、データ転送コストが発生する可能性があります。データセキュリティとネットワーク遅延が重要な場合は、API と Function Compute 関数が同じリージョンにあることを確認してください。
バックエンド設定:既存のバックエンドサービスを使用します。
バックエンドサービスタイプ:Function Compute。
製品バージョン:Function Compute 3.0。
関数タイプ:イベント関数。
バックエンドサービス:作成したバックエンドサービスの名前を選択します。
イベント関数のデータ形式
API Gateway がイベント関数を呼び出すと、API 関連のデータがマップ形式に変換され、Function Compute サービスに渡されます。処理後、関数は次の図に示す出力形式で、ステータスコード、ヘッダー、ボディなどのデータを返します。その後、API Gateway はこの返されたコンテンツを、クライアントに送信されるレスポンスのステータスコード、ヘッダー、ボディにマッピングします。

リクエストペイロードの形式 (API Gateway から Function Compute)
API のバックエンドサービスとして Function Compute を使用する場合、API Gateway は固定のマップ構造でリクエストパラメーターを関数の `event` 入力パラメーターに渡します。関数はこの構造からパラメーターを取得して処理できます。
{
"path":"API リクエストパス",
"httpMethod":"リクエストメソッド名",
"headers":{すべてのヘッダー (システムヘッダーを含む)},
"queryParameters":{クエリパラメーター},
"pathParameters":{パスパラメーター},
"body":"リクエストペイロードの文字列",
"isBase64Encoded":"true|false, ボディが Base64 エンコードされているかどうかを示す"
}
-
"isBase64Encoded"の値が"true"の場合、API Gateway は Base64 エンコードされたボディを渡します。関数は処理前にこれをデコードする必要があります。 -
"isBase64Encoded"の値が"false"の場合、API Gateway はボディの内容を Base64 エンコードしません。
レスポンスペイロードの形式 (Function Compute から API Gateway)
API Gateway が解析できるように、関数は次の JSON 形式で出力を返す必要があります。
{
"isBase64Encoded":true|false,
"statusCode":httpStatusCode,
"headers":{レスポンスヘッダー},
"body":"..."
}
-
ボディの内容がバイナリの場合、関数内で Base64 エンコードし、
"isBase64Encoded"の値を"true"に設定する必要があります。ボディの内容を Base64 エンコードする必要がない場合は、"isBase64Encoded"の値を"false"に設定します。API Gateway は、クライアントにレスポンスを返す前に、"isBase64Encoded"が"true"であるボディの内容をデコードします。 -
Node.js 環境では、関数はさまざまな結果に基づいてコールバックを設定します。
-
リクエスト成功:
callback(null,{"statusCode":200,"body":"..."}) -
例外:
callback(new Error('internal server error'),null) -
クライアントエラー:
callback(null,{"statusCode":400,"body":"param error"})
-
-
関数が必要な形式と一致しない結果を返した場合、API Gateway はクライアントに 503 Service Unavailable エラーを返します。
イベント関数の呼び出し例
次のセクションでは、イベント関数のコード、リクエスト、および API Gateway のレスポンスのサンプルを示します。
イベント関数のコードサンプル
次のコードサンプルは、関数のコード実行ページで設定できます。
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;
}
}
// ボディが Base64 エンコードされている場合は、Function Compute でボディをデコードします。
if(event.body!==null&&event.body!==undefined){
if(event.isBase64Encoded!==null&&event.isBase64Encoded!==undefined&&event.isBase64Encoded){
event.body=new Buffer(event.body,'base64').toString();
}
}
// 入力は、API Gateway から Function Compute に送信されたコンテンツです。
var responseBody = {
message: "Hello World!",
input: event
};
// 必要に応じてボディの内容を Base64 エンコードします。
var base64EncodeStr=new Buffer(JSON.stringify(responseBody)).toString('base64');
// Function Compute から API Gateway へのレスポンスは、必須の形式である必要があります。isBase64Encoded の設定は、ボディが 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 リクエストを示しています。
/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 のバックエンドサービスとして Function Compute を使用する場合、API Gateway は内部ネットワーク経由でバックエンドサービスに接続できますか?
イベント関数を使用し、API Gateway と Function Compute の両方が同じリージョンにある場合、API Gateway はデフォルトで内部ネットワークを使用します。