Amazon API Gateway
開発者ガイド

Node.js の AWS SDK を使用してエッジ最適化された API をセットアップする

ここでは Node.js の AWS SDK を使用して、AWS SDK を使用した API Gateway API の作成を説明します。開発環境のセットアップ方法など、AWS SDK の詳細な使用方法については、「AWS SDK」を参照してください。

Node.js の AWS SDK を使用した API の設定では、createRestApicreateResource または getResourcesputMethodputMethodResponseputIntegration、および putIntegrationResponse 関数を呼び出します。

次の手順では、GET /pets および GET /pets/{petId} メソッドをサポートする簡単な PetStore API をセットアップするためにこれらの SDK コマンドを使用するうえで重要なステップを説明します。

Node.js の AWS SDK を使用して簡単な PetStore API をセットアップする

  1. SDK をインスタンス化します。

    var AWS = require('aws-sdk'); AWS.config.region = 'us-west-2'; var apig = new AWS.APIGateway({apiVersion: '2015/07/09'});
  2. createRestApi 関数を呼び出して RestApi エンティティをセットアップします。

    apig.createRestApi({ name: "Simple PetStore (node.js SDK)", binaryMediaTypes: [ '*' ], description: "Demo API created using the AWS SDK for node.js", version: "0.00.001" }, function(err, data){ if (!err) { console.log(data); } else { console.log('Create API failed:\n', err); } });

    関数は次の結果のような出力を返します。

    { id: 'iuo308uaq7', name: 'PetStore (node.js SDK)', description: 'Demo API created using the AWS SDK for node.js', createdDate: 2017-09-05T19:32:35.000Z, version: '0.00.001', binaryMediaTypes: [ '*' ] }

    得られた API の識別子は iuo308uaq7 です。API のセットアップを続行するにはこれを指定する必要があります。

  3. getResources 関数を呼び出して RestApi のルートリソース ID を取得します。

    apig.getResources({ restApiId: 'iuo308uaq7' }, function(err, data){ if (!err) { console.log(data); } else { console.log('Get the root resource failed:\n', err); } })

    この関数は次の結果のような出力を返します。

    { "items": [ { "path": "/", "id": "s4fb0trnk0" } ] }

    ルートリソース識別子は s4fb0trnk0 です。ここから、次の手順である API リソースツリーの構築を開始できます。

  4. createResource 関数を呼び出して API の /pets リソースをセットアップし、s4fb0trnk0 プロパティでルートリソース識別子 (parentId) を指定します。

    apig.createResource({ restApiId: 'iuo308uaq7', parentId: 's4fb0trnk0', pathPart: 'pets' }, function(err, data){ if (!err) { console.log(data); } else { console.log("The '/pets' resource setup failed:\n", err); } })

    成功すると次のような結果が得られます。

    { "path": "/pets", "pathPart": "pets", "id": "8sxa2j", "parentId": "s4fb0trnk0'" }

    /pets/{petId} リソースをセットアップするには、次の createResource 関数を呼び出し、/pets プロパティに新しく作成された 8sxa2j リソース (parentId) を指定します。

    apig.createResource({ restApiId: 'iuo308uaq7', parentId: '8sxa2j', pathPart: '{petId}' }, function(err, data){ if (!err) { console.log(data); } else { console.log("The '/pets/{petId}' resource setup failed:\n", err); } })

    正常に終了すると、新しく作成されたリソースの id 値が返されます。

    { "path": "/pets/{petId}", "pathPart": "{petId}", "id": "au5df2", "parentId": "8sxa2j" }

    この手順を通して、リソース ID /pets を指定して 8sxa2j リソースを、リソース ID /pets/{petId} を指定して au5df2 リソースを参照します。

  5. putMethod 関数を呼び出して GET HTTP メソッドを /pets リソース (8sxa2j) に追加します。これにより、GET /pets Method がオープンアクセスでセットアップされます。

    apig.putMethod({ restApiId: 'iuo308uaq7', resourceId: '8sxa2j, httpMethod: 'GET', authorizationType: 'NONE' }, function(err, data){ if (!err) { console.log(data); } else { console.log("The 'GET /pets' method setup failed:\n", err); } })

    この関数の結果は、次のような出力を返します。

    { "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE" }

    GET リソース (/pets/{petId}) に au5df2 の API メソッドをセットアップする GET /pets/{petId} HTTP メソッドを追加するには、次のように putMethod 関数を呼び出します。

    apig.putMethod({ restApiId: 'iuo308uaq7', resourceId: 'au5df2', httpMethod: 'GET', authorizationType: 'NONE', requestParameters: { "method.request.path.petId" : true } }, function(err, data){ if (!err) { console.log(data); } else { console.log("The 'GET /pets/{petId}' method setup failed:\n", err); } })

    この関数の結果は、次のような出力を返します。

    { "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE", "requestParameters": { "method.request.path.petId": true } }

    前の例のように requestParameters プロパティを設定し、クライアントの指定する petId 値をバックエンドにマッピングおよびパスする必要があります。

  6. putMethodResponse 関数を呼び出して GET /pets メソッドのメソッドレスポンスをセットアップします。

    apig.putMethodResponse({ restApiId: 'iuo308uaq7', resourceId: "8sxa2j", httpMethod: 'GET', statusCode: '200' }, function(err, data){ if (!err) { console.log(data); } else { console.log("Set up the 200 OK response for the 'GET /pets' method failed:\n", err); } })

    この関数の結果は、次のような出力を返します。

    { "statusCode": "200" }

    GET /pets/{petId} メソッドの 200 の OK レスポンスを設定するには、putMethodResponse 関数を呼び出し、/pets/{petId} プロパティに au5df2 リソース識別子 (resourceId) を指定します。

    apig.putMethodResponse({ restApiId: 'iuo308uaq7', resourceId: "au5df2", httpMethod: 'GET', statusCode: '200' }, function(err, data){ if (!err) { console.log(data); } else { console.log("Set up the 200 OK response for the 'GET /pets/{petId}' method failed:\n", err); } })
  7. putIntegration 関数を呼び出して Integration メソッドの指定の HTTP エンドポイントで GET /pets をセットアップし、/pets プロパティで 8sxa2j リソース識別子 (parentId) を指定します。

    apig.putIntegration({ restApiId: 'iuo308uaq7', resourceId: '8sxa2j', httpMethod: 'GET', type: 'HTTP', integrationHttpMethod: 'GET', uri: 'http://perstore-demo-endpoint.execute-api.com/pets' }, function(err, data){ if (!err) { console.log(data); } else { console.log("Set up the integration of the 'GET /' method of the API failed:\n", err); } })

    この関数は次のような出力を返します。

    { "httpMethod": "GET", "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "type": "HTTP", "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "cacheNamespace": "8sxa2j" }

    GET /pets/{petId} メソッドと バックエンドの HTTP エンドポイント http://perstore-demo-endpoint.execute-api.com/pets/{id} の統合をセットアップするには、次の putIntegration 関数を呼び出し、/pets/{petId} プロパティで API のau5df2 リソース識別子 (parentId) を指定します。

    apig.putIntegration({ restApiId: 'iuo308uaq7', resourceId: 'au5df2', httpMethod: 'GET', type: 'HTTP', integrationHttpMethod: 'GET', uri: 'http://perstore-demo-endpoint.execute-api.com/pets/{id}', requestParameters: { "integration.request.path.id": "method.request.path.petId" } }, function(err, data){ if (!err) { console.log(data); } else { console.log("The 'GET /pets/{petId}' method integration setup failed:\n", err); } })

    この関数は、成功すると次のような出力を返します。

    { "httpMethod": "GET", "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "type": "HTTP", "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}", "cacheNamespace": "au5df2", "requestParameters": { "integration.request.path.id": "method.request.path.petId" } }
  8. putIntegrationResponse 関数を呼び出して GET /pets メソッドに 200 の OK 統合レスポンスをセットアップし、/pets プロパティに API の 8sxa2j リソース識別子 (resourceId) を指定します。

    apig.putIntegrationResponse({ restApiId: 'iuo308uaq7', resourceId: '8sxa2j', httpMethod: 'GET', statusCode: '200', selectionPattern: '' }, function(err, data){ if (!err) { console.log(data); } else console.log("The 'GET /pets' method integration response setup failed:\n", err); })

    この関数は次の結果のような出力を返します。

    { "selectionPattern": "", "statusCode": "200" }

    GET /pets/{petId} メソッドの 200 の OK 統合レスポンスをセットアップするには、putIntegrationResponse 関数を呼び出し、/pets/{petId} プロパティに API の au5df2 リソース識別子 (resourceId) を指定します。

    apig.putIntegrationResponse({ restApiId: 'iuo308uaq7', resourceId: 'au5df2', httpMethod: 'GET', statusCode: '200', selectionPattern: '' }, function(err, data){ if (!err) { console.log(data); } else console.log("The 'GET /pets/{petId}' method integration response setup failed:\n", err); })
  9. デプロイする前に API の呼び出しをテストすることをお勧めします。GET /pets メソッドの呼び出しをテストするには、testInvokeMethod を呼び出し、/pets プロパティに 8sxa2j リソース識別子 (resourceId) を指定します。

    apig.testInvokeMethod({ restApiId: 'iuo308uaq7', resourceId: '8sxa2j', httpMethod: "GET", pathWithQueryString: '/' }, function(err, data){ if (!err) { console.log(data) } else { console.log('Test-invoke-method on 'GET /pets' failed:\n', err); } })

    GET /pets/{petId} メソッドの呼び出しをテストするには、testInvokeMethod を呼び出し、/pets/{petId} プロパティに au5df2 リソース識別子 (resourceId) を指定します。

    apig.testInvokeMethod({ restApiId: 'iuo308uaq7', resourceId: 'au5df2', httpMethod: "GET", pathWithQueryString: '/' }, function(err, data){ if (!err) { console.log(data) } else { console.log('Test-invoke-method on 'GET /pets/{petId}' failed:\n', err); } })
  10. これで顧客が呼び出す API をデプロイできます。

    apig.createDeployment({ restApiId: 'iuo308uaq7', stageName: 'test', stageDescription: 'test deployment', description: 'API deployment' }, function(err, data){ if (err) { console.log('Deploying API failed:\n', err); } else { console.log("Deploying API succeeded\n", data); } })