すべてのプロダクト
Search
ドキュメントセンター

API Gateway:Function Compute

最終更新日:Nov 25, 2024

Function Computeはイベント駆動型サービスです。 Function ComputeをAPI Gatewayと統合すると、API Gatewayを使用して、関数をAPIとして安全に公開できます。 これにより、API Gatewayはユーザーの認証、呼び出しの抑制、データの変換を行うことができます。 このトピックでは、Function Compute 3.0を例として、API GatewayとFunction Computeサービスを統合する方法について説明します。

前提条件

API Gatewayインスタンスが作成されました。 詳細については、「インスタンスタイプの選択」をご参照ください。

概要

API Gatewayは、HTTP関数とイベント関数の2種類のFunction Compute関数をサポートしています。

HTTP関数とAPI Gatewayの統合

web関数の作成

Function ComputeをAPI Gatewayと統合する前に、function Compute 3.0コンソールでweb関数を作成する必要があります。 詳細については、「web関数の作成」をご参照ください。

バックエンドサービスの作成

API Gatewayでバックエンドサービスを作成し、Function Computeサービスを指すようにバックエンドサービスのURLを設定する必要があります。

  1. API Gatewayコンソールにログインします。 左側のナビゲーションウィンドウで、[APIの管理] > [バックエンドサービス] を選択します。 上部のナビゲーションバーで、リージョンを選択します。 次に、[バックエンドサービスの作成] をクリックします。

    image

  2. [バックエンドサービスの作成] ダイアログボックスで、次の図のようにパラメーターを設定し、[確認] をクリックします。

    image

  3. [バックエンドサービス] ページで、作成したバックエンドサービスをクリックします。 [バックエンドサービス定義] ページで、[運用] タブをクリックします。 [基本情報] セクションで、右上隅の [作成] をクリックします。

    image

  4. [基本情報] ページで、[トリガーパス] パラメーターを設定し、[発行] をクリックします。

    image

APIの作成

API GatewayコンソールでAPIを作成します。 詳細については、「手順3: APIの作成」をご参照ください。

  • APIグループを作成します。 Function Compute関数と同じリージョンにAPIグループを作成することを推奨します。

説明

APIグループがFunction Compute関数とは異なるリージョンで作成されている場合、API Gatewayはインターネット経由で関数にアクセスするため、トラフィック料金が発生します。 高いデータセキュリティと低いネットワーク遅延が必要な場合は、function Computeで関数を作成したリージョンを選択してAPIグループを作成します。

  • APIを作成して定義します。 [APIの作成] ウィザードの [バックエンドサービスの定義] ステップで、次のパラメーターを設定します。

image

設定モード: [既存のバックエンドサービスを使用] を選択します。

バックエンドサービスタイプ: Function Computeを選択します。

バージョン: Function Compute V3.0を選択します。

関数タイプ: [HTTP関数] を選択します。

バックエンドサービス: [FC-Backend] を選択します。

バックエンドリクエストパス: カスタムパスを指定します。 カスタムパスを指定しない場合は、スラッシュ (/) を入力します。

HTTPメソッド: Function Computeでサポートされているメソッドを選択します。 複数のメソッドを指定する場合は、ANYを選択します。

別のアカウントのFunction Compute関数の使用

API Gatewayを使用すると、別のアカウントのFunction Compute関数を使用してAPIと統合できます。 次のセクションでは、アカウントA内のAPI GatewayがアカウントBの機能にアクセスできるようにする方法について説明します。

  1. アカウントBを使用して次の手順を実行し、アカウントA内のAPI GatewayにアカウントB内の関数へのアクセスを許可します。

    ステップ1: アカウントBを使用してResource Access Management (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ロールのAlibaba Cloudリソース名 (ARN) を指定します。詳細については、「RAMロールの概要」トピックの「用語」セクションをご参照ください。

  2. API GatewayコンソールでアカウントAを使用して、アカウントA内のAPI GatewayからアカウントB内のFunction Computeへのアクセスを許可するために必要な情報を指定します。トリガーパスの内容は、アカウントB内のFunction Computeのエンドポイントです。

重要

APIのバックエンドサービスとしてHTTP関数を使用する場合、クライアントから送信されたリクエストのAuthorization値はHTTP関数のAuthorization値で上書きされます。 リクエストには別のパラメーターを使用することを推奨します。

イベント関数とAPI Gatewayの統合

イベント関数の作成

function Compute 3.0コンソールでイベント関数を作成する方法の詳細については、「イベント関数の作成」をご参照ください。

バックエンドサービスの作成

API Gatewayでバックエンドサービスを作成し、Function Computeサービスを指すようにバックエンドサービスのURLを設定する必要があります。

  1. API Gatewayコンソールにログインします。 左側のナビゲーションウィンドウで、[APIの管理] > [バックエンドサービス] を選択します。 上部のナビゲーションバーで、リージョンを選択します。 次に、右上隅の [バックエンドサービスの作成] をクリックし、次のパラメーターを設定します。

    image

  2. [バックエンドサービス] ページで、作成したバックエンドサービスをクリックします。 [バックエンドサービス定義] ページで、[運用] タブをクリックします。 [基本情報] セクションで、右上隅の [作成] をクリックします。

    image

  3. 作成したイベント関数を選択し、[公開] をクリックします。

    image

APIの作成

API GatewayコンソールでAPIを作成します。 詳細については、「手順3: APIの作成」をご参照ください。

  • APIグループを作成します。 Function Compute関数と同じリージョンにAPIグループを作成することを推奨します。

説明

APIグループを作成するリージョンが、Function Computeでサービスを作成したリージョンと異なる場合、API Gatewayは、インターネット経由でFunction Computeのサービスにアクセスします。これにより、トラフィック料金が発生します。 高いデータセキュリティと低いネットワーク遅延が必要な場合は、APIのリージョンが関数のリージョンと同じであることを確認してください。

  • APIを作成します。 [APIの作成] ウィザードの [バックエンドサービスの定義] ステップで、特定のパラメーターに注意してください。 次の図に、ステップ内のすべてのパラメーターを示します。

image

設定モード: [既存のバックエンドサービスを使用] を選択します。

バックエンドサービスタイプ: Function Computeを選択します。

バージョン: Function Compute V3.0を選択します。

関数タイプ: [イベント関数] を選択します。

バックエンドサービス: 作成したバックエンドサービスを選択します。

イベント関数が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でレスポンス本文をエンコードするには、isBase64Encodedtrueに設定します。 レスポンスボディをBase64-encodedする必要がない場合は、isBase64Encodedfalseに設定します。 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サービスは利用できません。

イベント関数の呼び出し例

次のセクションでは、イベント関数、イベント関数要求、およびAPI応答のサンプルコードを示します。

イベント関数

次のセクションでは、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);
};        

イベント関数要求

この例では、POSTメソッドを使用して、リクエストパスが次の文字列であるAPIを呼び出します。

/fc/test/invoke/[type]        

次のサンプルコードは、APIリクエストの例を示しています。

POST http://test.alicloudapi.com/fc/test/invoke/test?param1=aaa&param2=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レスポンス

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 GatewayのAPIのバックエンドサービスとして使用できないのはなぜですか。

Function Computeをバックエンドサービスとして使用するAPIを作成する場合、指定するサービス名と関数名が、function Computeコンソールで作成したサービスと関数の名前と同じであることを確認します。

Function ComputeがAPIのバックエンドサービスとして使用されている場合、API Gatewayはプライベートネットワーク経由でFunction Computeにアクセスできますか?

はい。 既定では、イベント関数がAPIのバックエンドサービスとして使用され、API Gatewayがfunction Computeと同じリージョンにある場合、API Gatewayは内部ネットワークを介してFunction Computeにアクセスします。