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

API Gateway:Function Compute

最終更新日:Jun 23, 2026

このトピックでは、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 サービスに設定します。

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

    image

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

    [名前]FC-backend に設定します。 [タイプ][Function Compute] に、[製品バージョン][Function Compute 3.0] に、[関数タイプ][HTTP 関数] に設定します。

  3. バックエンドサービスページで、作成したバックエンドサービスをクリックします。表示されたサービス定義ページで、[本番] タブを選択します。[基本情報] セクションで、[作成] をクリックします。

  4. [基本情報] ページで、[トリガーパス] のアクセスアドレスを設定し、[公開] をクリックします。

    アクセスアドレスは 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 の関数を呼び出す方法について説明します。

  1. アカウント 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 ロールの概要」をご参照ください。

  2. 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 サービスに設定します。

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

    [名前]FC-mobile に設定します。[タイプ]Function Compute に、[製品バージョン]Function Compute 3.0 に、[関数タイプ]イベント関数 に設定します。

  2. バックエンドサービスページで、作成したバックエンドサービスをクリックします。表示されたサービス定義ページで、[本番] タブを選択します。[基本情報] セクションで、[作成] をクリックします。

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

    [リージョン][中国 (杭州)] に、[関数のエイリアス][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&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 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 はデフォルトで内部ネットワークを使用します。