Function Computeはイベント駆動型サービスです。 詳細については、「関数タイプの選択」をご参照ください。 Function ComputeをAPI Gatewayと統合すると、API Gatewayを使用して、関数をAPIとして安全に公開できます。 これにより、API Gatewayはユーザーの認証、呼び出しの抑制、データの変換を行うことができます。
1. 概要
API Gatewayは、HTTP関数とイベント関数の2種類の関数をサポートしています。
2. HTTP関数とAPI Gatewayの統合
2.1 HTTP関数の作成
API Gatewayコンソールでパラメーターを設定する前に、function ComputeコンソールでHTTPトリガーで設定された関数を作成する必要があります。 詳細については、「HTTPリクエストで関数を呼び出すHTTPトリガーの設定」をご参照ください。
2.2 APIの作成Create an API
API GatewayコンソールでAPIを作成する方法の詳細については、「はじめに」の「Function Computeをバックエンドサービスとして使用してAPIを作成する」をご参照ください。 このトピックでは、考慮事項が必要な操作について説明します。
APIグループを作成します。 Function Compute関数と同じリージョンにAPIグループを作成することを推奨します。
APIグループを作成するリージョンが、Function Computeでサービスを作成したリージョンと異なる場合、API Gatewayは、インターネット経由でFunction Computeのサービスにアクセスします。これにより、トラフィック料金が発生します。 高いデータセキュリティと低いネットワーク遅延が必要な場合は、APIのリージョンが関数のリージョンと同じであることを確認してください。
APIを作成して定義します。 [APIの作成] ウィザードの [バックエンドサービスの定義] ステップで、特定のパラメーターに注意してください。 次の図に、ステップ内のすべてのパラメーターを示します。
バックエンドサービスタイプ: Function Computeを選択します。
呼び出し方法: [HTTPトリガー] を選択します。
トリガーパス: Function Computeコンソールの関数の [関数の詳細] ページの [トリガー] タブに表示されるトリガーパスを使用します。 同じリージョンで関数を呼び出す場合は、トリガーパスのドメイン名を内部エンドポイントに置き換えることができます。 内部エンドポイントを使用する場合は、次の操作を実行します。Function Computeコンソールに移動し、左側のナビゲーションウィンドウで [サービスと関数] をクリックし、目的のサービスをクリックし、関数リストで目的のHTTP関数をクリックし、[トリガー管理 (URL)] タブをクリックし、タブで内部エンドポイントを見つけます。
バックエンドリクエストパス: カスタムパスを指定します。 カスタムパスを指定しない場合は、スラッシュ (/) を入力します。
HTTPメソッド: Function Computeでサポートされているメソッドを選択します。 複数のメソッドを指定する場合は、ANYを選択します。
ロールARN: API GatewayにFunction Computeへのアクセスを許可するために使用するリソースアクセス管理 (RAM) ロールのAlibaba Cloudリソース名 (ARN) を指定します。 デフォルトでは、API Gatewayコンソールの指示に従って、同じAlibaba Cloudアカウント内でAPI GatewayからFunction Computeへのアクセスを許可するロールARNを設定できます。
2.3 別のアカウント内にデプロイされたFunction Computeを使用する
API Gatewayを使用すると、Alibaba Cloudアカウントまたは別のAlibaba Cloudアカウント内にデプロイされたFunction Computeをバックエンドサービスとして使用できます。 次のセクションでは、Alibaba Cloudアカウント内のAPI Gatewayが、別のAlibaba Cloudアカウント内にデプロイされたFunction Computeを使用できるようにする方法について説明します。 この例では、アカウントB内のFunction Computeは、アカウントA内のAPI Gatewayによって使用されます。
アカウントBを使用して次の手順を実行し、アカウントA内のAPI GatewayにアカウントB内のFunction Computeへのアクセスを許可します。
ステップ1: アカウントBを使用してRAMコンソールにログインし、RAMロールを作成します。 詳細については、「信頼できるAlibaba CloudアカウントのRAMロールの作成」をご参照ください。
ステップ2: ステップ1で作成したRAMロールにAliyunFCInvocationAccessポリシーをアタッチします。 このポリシーは、RAMロールがFunction Computeにアクセスできるようにします。 詳細については、RAMロールへの権限の付与トピックの「方法1: [ロール] ページの [権限の追加] をクリックしてRAMロールに権限を付与する」を参照してください。
ステップ3: アカウントAのID 123456789012 **** をRAMロールの信頼ポリシーに追加して、信頼ポリシーを変更します。 詳細については、「RAMロールの信頼ポリシーの編集」トピックの「例1: RAMロールの信頼できるエンティティをAlibaba Cloudアカウントに変更する」をご参照ください。 次のサンプルコードは、変更された信頼ポリシーの例を示します。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"123456789012****@apigateway.aliyuncs.com"
]
}
}
],
"Version": "1"
}
手順4: アカウントAのRAMロールのARNを指定します。詳細については、RAMロールの概要トピックの「用語」セクションを参照してください。
API GatewayコンソールでアカウントAを使用して、アカウントA内のAPI GatewayからアカウントB内のFunction Computeへのアクセスを許可するために必要な情報を指定します。トリガーパスの内容は、アカウントB内のFunction Computeのエンドポイントです。
APIのバックエンドサービスとしてHTTP関数を使用する場合、クライアントから送信されたリクエストのAuthorization値はHTTP関数のAuthorization値で上書きされます。 リクエストには別のパラメーターを使用することを推奨します。
3. イベント関数とAPI Gatewayの統合
3.1 イベント関数の作成
function Computeコンソールで関数の実行をトリガーするようにAPI Gatewayを設定できます。 詳細については、「API Gatewayトリガーの設定」をご参照ください。
3.2 APIの作成Create an API
API GatewayコンソールでAPIを作成する方法の詳細については、「はじめに」の「Function Computeをバックエンドサービスとして使用してAPIを作成する」をご参照ください。 このトピックでは、考慮事項が必要な操作について説明します。
APIグループを作成します。 Function Compute関数と同じリージョンにAPIグループを作成することを推奨します。
APIグループを作成するリージョンが、Function Computeでサービスを作成したリージョンと異なる場合、API Gatewayは、インターネット経由でFunction Computeのサービスにアクセスします。これにより、トラフィック料金が発生します。 高いデータセキュリティと低いネットワーク遅延が必要な場合は、APIのリージョンが関数のリージョンと同じであることを確認してください。
APIを作成します。 [APIの作成] ウィザードの [バックエンドサービスの定義] ステップで、特定のパラメーターに注意してください。 次の図に、ステップ内のすべてのパラメーターを示します。
関数タイプ: [イベント関数] を選択します。
サービス名と関数名: Function Computeの実際のサービス名と関数名に基づいてパラメーターを設定します。
3.3 イベント関数がAPI Gatewayと統合されている場合のフォーマット要件
API Gatewayがfunction Computeのイベント関数をバックエンドサービスとして使用するAPIのリクエストを受信すると、API Gatewayはリクエストパラメーターを変換し、リクエストをFunction Computeに送信します。 Function Computeはリクエストを処理し、特定の出力形式でレスポンスをAPI Gatewayに返します。 応答には、statusCode、ヘッダー、およびbodyパラメーターなどのデータが含まれます。 レスポンスの出力形式を次の図に示します。 API Gatewayは、応答内のデータを、statusCode、ヘッダー、およびbodyパラメーターなどのAPI応答の特定のパラメーターにマップし、API応答をクライアントに返します。
API GatewayがFunction Computeに送信する各APIリクエストのリクエストパラメーターの入力形式
API GatewayがFunction Computeをバックエンドサービスとして使用するAPIのリクエストを受信すると、API Gatewayはリクエストパラメーターを変換し、リクエストパラメーターをイベントパラメーターの値としてFunction Computeに渡します。 次に、Function Computeは、Map形式のリクエストパラメータから必要なパラメータを取得し、リクエストを処理します。 次のサンプルコードは、必要なパラメーターの例を示しています。
{
"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に送信されたリクエストの本文がBase64-encodedされます。 この場合、Function Computeはリクエストを処理する前にBase64でリクエストボディをデコードする必要があります。isBase64Encoded
の値がfalse
の場合、API GatewayからFunction Computeに送信されるリクエストの本文はBase64-encodedされません。
Function ComputeがAPI Gatewayに返す応答パラメーターの出力形式
Function ComputeがAPI Gatewayに返すレスポンスはJSON形式です。 これにより、API Gatewayは応答を解析できます。 次のサンプルコードは、JSON形式のレスポンスの例を示しています。
{
"isBase64Encoded":true|false,
"statusCode":httpStatusCode,
"headers":{response headers},
"body":"..."
}
レスポンスボディがバイナリデータの場合、ボディはFunction ComputeでBase64-encodedする必要があります。 Base64でレスポンス本文をエンコードするには、
isBase64Encoded
をtrue
に設定します。 レスポンスボディをBase64-encodedする必要がない場合は、isBase64Encoded
をfalse
に設定します。 Function Computeから返されたレスポンスボディでisBase64Encoded
の値がtrue
の場合、API Gatewayはボディをクライアントに返す前にBase64でボディをデコードします。Node.js環境では、Function Computeはさまざまな応答結果に基づいてコールバックパラメーターを作成します。
Function Computeが正常な応答を返した場合、コールバックパラメーターの値は、callback(null,{"statusCode":200,"body":"..."}) の形式になります。
Function Computeが例外を返した場合、コールバックパラメーターの値は、callback(new Error('internal server error') 、null) の形式になります。
Function Computeがクライアントエラーを返した場合、コールバックパラメーターの値は、callback(null,{"statusCode":400,"body":"param error"}) の形式になります。
Function Computeが必要な形式でない応答を返す場合、API Gatewayはクライアントに次のエラーメッセージを返します: 503サービスは使用できません。
3.4 イベント関数の呼び出しの例
次のセクションでは、イベント関数、APIリクエスト、およびAPIレスポンスのサンプルコードを示します。
3.4.1 イベント関数のサンプルコード
次のセクションでは、Function Computeコンソールの [関数の詳細] ページの [コード] タブのサンプルコードを示します。
module.exports.handler = function(event, context, callback) {
var responseCode = 200;
console.log("request: " + JSON.stringify(event.toString()));
// Convert the value of the event parameter into a JSON object.
event=JSON.parse(event.toString());
var isBase64Encoded=false;
// Construct a response body based on the status code that is specified in a request. Different response bodies are constructed based on different status codes.
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;
}
}
// If the body of the event parameter is Base64-encoded, decode the body in Base64 in 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();
}
}
// Set the input parameter to the content that is sent from API Gateway to Function Compute.
var responseBody = {
message: "Hello World!",
input: event
};
// Encode the response body in Base64 based on your business requirements.
var base64EncodeStr=new Buffer(JSON.stringify(responseBody)).toString('base64');
// Specify the response that Function Compute returns to API Gateway in the following format: The value of the isBase64Encoded parameter varies based on whether the response body is Base64-encoded.
var response = {
isBase64Encoded:true,
statusCode: responseCode,
headers: {
"x-custom-header" : "header value"
},
body: base64EncodeStr
};
console.log("response: " + JSON.stringify(response));
callback(null, response);
};
3.4.2 APIリクエストのサンプルコード
次のサンプルコードは、APIリクエストのパスの例を示しています。 この例では、POSTメソッドを使用してAPIを呼び出します。
/fc/test/invoke/[type]
次のサンプルコードは、APIリクエストの例を示しています。
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"}
3.4.3 APIレスポンスのサンプルコード
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"}}}
4. よくある質問
4.1 function Computeで作成した関数をAPI GatewayのAPIのバックエンドサービスとして使用できないのはなぜですか。
Function Computeをバックエンドサービスとして使用するAPIを作成する場合、指定するサービス名と関数名が、function Computeコンソールで作成したサービスと関数の名前と同じであることを確認します。
4.2 Function ComputeがAPIのバックエンドサービスとして使用されている場合、API Gatewayはプライベートネットワーク経由でFunction Computeにアクセスできますか?
はい。 既定では、イベント関数がAPIのバックエンドサービスとして使用され、API Gatewayがfunction Computeと同じリージョンにある場合、API Gatewayは内部ネットワークを介してFunction Computeにアクセスします。