edit-icon download-icon

API バックエンドサービスに Function Compute を使用

最終更新日: Sep 04, 2018

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 形式にしてクライアントに返します。

Implementation principles

API Gateway より Function Compute に送信されるパラメーターの形式

Function Compute を API Gateway のバックエンドサービスとして使用する場合、 API Gateway が Function Compute に送信するイベントリクエストの形式には決まりがあります。Function Compute は、次の形式でパラメーターを受け取り、処理します。

  1. {
  2. "path":"api request path",
  3. "httpMethod":"request method name",
  4. "headers":{all headers,including system headers},
  5. "queryParameters":{query parameters},
  6. "pathParameters":{path parameters},
  7. "body":"string of request payload",
  8. "isBase64Encoded":"true|false, indicate if the body is Base64-encode"
  9. }

注意:

  • "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 形式にして返します。

  1. {
  2. "isBase64Encoded":true|false,
  3. "statusCode":httpStatusCode,
  4. "headers":{response headers},
  5. "body":"..."
  6. }

注意:

  • 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 を作成するには、次の手順を実行します。

  1. Function Compute コンソールで関数を作成する

  2. バックエンドサービス Function Compute の API を作成して定義する

  3. API をデバッグする

  4. API を本番環境に公開する

Function Compute コンソールで関数を作成する

  1. サービスを作成します。Function Compute コンソールにログインし、サービスと関数のリージョンを選択して作成し、サービスの作成をクリックします。ダイアログボックスで、サービスの作成プロセスを完了します。

    注意:サービスの作成後は、リージョンを変更できませんので、リージョンは間違えずに選択します。

    Create a service

  2. 作成したサービスに関数を作成します。この新しく作成されたサービスのページで、関数の作成をクリックし、関数の作成処理を入力します。

    1. 関数テンプレートを選択します。

      Function Compute コンソールでは環境 Node.js 6 : api-gateway-nodejs6 のための API Gateway バックエンド実行テンプレートを提供しています。

      api-gateway-nodejs6 テンプレートがビジネスニーズに適合しない場合は、ブランク関数を選択します。ブランク関数テンプレートを選択した場合は、基本管理設定でコードを記述する必要があります。アップロードを完了するには、事前にコードのパッケージを用意しておいてください。

      Select sample

    2. トリガーを設定します。トリガー しないを選択し、[次へ] をクリックします。

    3. 関数を設定します。基本情報の入力、コードの記述、環境変数の設定、環境の設定を行います。 [次へ]をクリックします。

    4. サービスロール管理は無視して [次へ]をクリックします。

      すでに RAM コンソールで対応する roleArn 許可を設定しているため、ここではサービスのロールを設定する必要はありません。API Gateway コンソールで API を作成する場合、[許可の取得]をクリックして roleArn 許可を自動的に取得します。

    5. すべての情報が正しいことを確認の上、作成をクリックします。

      関数の作成後に、関数リストで基本情報を確認します。

Function Compute バックエンドサービス API を作成し定義する

API Gateway コンソール で API を作成し、Function Compute としてバックエンドサービスを定義します。

  1. API Gateway コンソール にログインします。

  2. グループを作成します。

    左側のナビゲーションペインで [API グループ] をクリックし、グループのリージョンを選択して[グループの作成] をクリックします。(すでにグループを作成している場合は、このステップをスキップします。)

    注意:Function Compute と API が異なるリージョンにある場合は、Function Compute サービスは、インターネット経由でアクセスされます。

    高いデータセキュリティと低遅延ネットワークが要求される場合には、関数と同じリージョンに API を作成してください。

    Create a group

    API グループを作成したら、ステージ(環境)管理でグループの環境変数を設定します。テスト、ステージング、および本番の 3 つのステージで API は使用できます。ステージの切り替え時にバックエンドのアドレスを変更しなくても済むよう、環境変数のパラメーターを追加してリクエストが自動的に転送されるようにします。環境変数の設定方法は、環境の管理をご参照ください。

  3. API を作成し、定義します。

    1. グループの作成後、グループの操作列から[API の表示]ボタンをクリックしてグループの [API リスト]ページに移動します。

      1.[ API の作成] をクリックし API の作成と定義に入ります。

    2. API の基本情報を入力し、次へ をクリックします。

      API

    3. API のリクエストを定義し、 [次へ] をクリックします。

      注意リクエストモードリクエストパラメーターのパススルー に設定すると、API Gateway に送信された body パラメーターの内容は処理されずに Function Compute に直接送信されます。

      Create an API

    4. API のバックエンドサービスを定義し、 [次へ]をクリックします。

      注意:このページでは、次の条件を満たす必要があります。

      • バックエンドサービスタイプ には、Function Compute を設定します。

      • サービス名 には、Function Compute コンソール で作成したサービスの名前を入力します。

      • 関数名 には、Function Compute コンソール で作成した関数の名前を入力します。

      • [許可の取得]をクリックして Arn ロールを自動取得します。

        API Gateway バックエンドサービスとして Function Compute に初めてロール許可を取得している場合は、 許可の取得をクリックすると、RAM コンソールの認証ページが表示されます。RAMコンソールで許可を付与するポリシーをクリックし、API の作成ページに戻り、許可の取得 を再びクリックします。Arn ロールは、自動的に選択ボックスに表示されます。

      Define backend service

    5. レスポンスを定義して 作成 クリックします。

      注意:レスポンスのサンプルの設定は必須であり、フォーマットは、Function Compute レスポンスパラメーターの形式に従う必要があります。

      Define response

      詳細については、「APIを作成」をご参照ください。

API をデバッグする

API を作成して定義すると、自動的に [API リスト] ページが表示されます。作成した API のリクエストパスが正しいことを検証します。

  1. API リスト ページで、API 名をクリックするか、[管理] ボタンをクリックして[API 定義]ページに移動します。

  2. 左側のナビゲーションペインで[API のデバッグ]をクリックします。

  3. リクエストパラメーターを入力し、[リクエストの送信]をクリックします。

    応答結果は、ページの右側に表示されます。

    成功結果が返された場合、API は使用できます。

    エラーコード 4XX または 5XX が返される場合、リクエストの際にエラーが発生したことを示します。詳細については、エラーメッセージの取得方法 および エラーコード一覧をご参照ください。

  4. 本番稼働の前に、ステージングステージ(環境)へ API を公開して検証します。

    API が使用可能であることを検証後、API 定義 ページに戻り、API をステージングステージ(環境)に公開します。呼び出しの検証には、サブドメイン名を使用して実際のユーザによるリクエストをシミュレーションします。

    注意:API の定義に環境変数を設定している場合は、headers にX-Ca-Stage: PREパラメーターを指定してステージングステージ(環境)の API を呼び出します。

本番環境に API を公開する

API のデバッグを実行して使用に差し支えないことを確認後、公開します。

  1. API 一覧ページで、API 名をクリックするか、管理 ボタンをクリクしてAPI 定義ページに移動します。

  2. ページの右上にある[デプロイ]ボタンをクリックします。

  3. 本番 を選択し、コメント欄を入力し、 [デプロイ] をクリックします。

    本番ステージ(環境)に公開するとユーザーは API を呼び出すことができます。

公開についての詳細は、API の公開 をご参照ください。

サンプル

関数コードのサンプル、API リクエストのサンプル、および API Gateway レスポンスのサンプルは、次のとおりです。

関数コードのサンプル

Function Compute に設定されたコードのサンプルです。

  1. module.exports.handler = function(event, context, callback) {
  2. var responseCode = 200;
  3. console.log("request: " + JSON.stringify(event.toString()));
  4. // イベントを JSON オブジェクトに変換します。
  5. event=JSON.parse(event.toString());
  6. var isBase64Encoded=false;
  7. // 検証用に入力した statusCode をそのまま返します。
  8. if (event.queryParameters !== null && event.queryParameters !== undefined) {
  9. if (event.queryParameters.httpStatus !== undefined && event.queryParameters.httpStatus !== null && event.queryParameters.httpStatus !== "") {
  10. console.log("Received http status: " + event.queryParameters.httpStatus);
  11. responseCode = event.queryParameters.httpStatus;
  12. }
  13. }
  14. // body が Base64 エンコードされている場合、Function Compute は body を復号化します。
  15. if(event.body!==null&&event.body!==undefined){
  16. if(event.isBase64Encoded!==null&&event.isBase64Encoded!==undefined&&event.isBase64Encoded){
  17. event.body=new Buffer(event.body,'base64').toString();
  18. }
  19. }
  20. // input には API Gateway が Function Compute に送信するコンテンツを記述します。
  21. var responseBody = {
  22. message: "Hello World!",
  23. input: event
  24. };
  25. // body の文字列を Base64 エンコードします。必要に応じて設定します。
  26. var base64EncodeStr=new Buffer(JSON.stringify(responseBody)).toString('base64');
  27. // Function Compute の API Gateway に返す応答形式。次の要件を満たす必要があります。isBase64Encoded には body を Base64 エンコードする必要があるかどうかを設定します。
  28. var response = {
  29. isBase64Encoded:true,
  30. statusCode: responseCode,
  31. headers: {
  32. "x-custom-header" : "header value"
  33. },
  34. body: base64EncodeStr
  35. };
  36. console.log("response: " + JSON.stringify(response));
  37. callback(null, response);
  38. };

リクエストのサンプル

以下の APIの POST 形式リクエスト Path です。

  1. /fc/test/invoke/[type]
  1. POST http://test.alicloudapi.com/fc/test/invoke/test?param1=aaa&param2=bbb
  2. "X-Ca-Signature-Headers":"X-Ca-Timestamp,X-Ca-Version,X-Ca-Key,X-Ca-Stage",
  3. "X-Ca-Signature":"TnoBldxxRHrFferGlzzkGcQsaezK+ZzySloKqCOsv2U=",
  4. "X-Ca-Stage":"RELEASE",
  5. "X-Ca-Timestamp":"1496652763510",
  6. "Content-Type":"application/x-www-form-urlencoded; charset=utf-8",
  7. "X-Ca-Version":"1",
  8. "User-Agent":"Apache-HttpClient\/4.1.2 (java 1.6)",
  9. "Host":"test.alicloudapi.com",
  10. "X-Ca-Key":"testKey",
  11. "Date":"Mon, 05 Jun 2017 08:52:43 GMT","Accept":"application/json",
  12. "headerParam":"testHeader"
  13. {"bodyParam":"testBody"}

API Gateway レスポンスのサンプル

  1. 200
  2. Date: Mon, 05 Jun 2017 08:52:43 GMT
  3. Content-Type: application/json; charset=UTF-8
  4. Content-Length: 429
  5. Access-Control-Allow-Origin: *
  6. Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS , PATCH
  7. 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
  8. Access-Control-Max-Age: 172800
  9. X-Ca-Request-Id: 16E9D4B5-3A1C-445A-BEF1-4AD8E31434EC
  10. x-custom-header: header value
  11. {"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 つしかマッピングすることができません。