メニュー
AWS Lambda
開発者ガイド

ステップ 3: Amazon API Gateway を使用して API を作成し、テストする

このステップでは、Amazon API Gateway を使用して作成した API 内のメソッドに Lambda 関数を関連付け、エンドツーエンドエクスペリエンスをテストします。つまり、HTTPS リクエストが API メソッドに送信されると、Amazon API Gateway は Lambda 関数を呼び出します。

最初に、Amazon API Gateway を使用して、1 つのリソース (DynamoDBManager) と 1 つのメソッド (POST) を持つ API (DynamoDBOperations) を作成します。POST メソッドを Lambda 関数に関連付けます。次に、エンドツーエンドエクスペリエンスをテストします。

ステップ 3.1: API を作成する

次の create-rest-api コマンドを実行して、このチュートリアル用の DynamoDBOperations API を作成します。

Copy
$ aws apigateway create-rest-api \ --name DynamoDBOperations

以下に、応答の例を示します。

Copy
{ "name": "DynamoDBOperations", "id": "api-id", "createdDate": 1447724091 }

API ID を書き留めます。

API のルートリソースの ID も必要です。この ID を取得するには、get-resources コマンドを実行します。

Copy
$ aws apigateway get-resources \ --rest-api-id api-id

応答の例を以下に示します (この時点ではルートリソースのみですが、次のステップでリソースを追加します)。

Copy
{ "items": [ { "path": "/", "id": "root-id" } ] }

ステップ 3.2: API のリソース (DynamoDBManager) を作成します。

次の create-resource コマンドを実行して、前のセクションで作成した API のリソース (DynamoDBManager) を作成します。

Copy
$ aws apigateway create-resource \ --rest-api-id api-id \ --parent-id root-id \ --path-part DynamoDBManager

以下に、応答の例を示します。

Copy
{ "path": "/DynamoDBManager", "pathPart": "DynamoDBManager", "id": "resource-id", "parentId": "root-id" }

応答内の ID を書き留めます。これは、作成したリソース (DynamoDBManager) の ID です。

ステップ 3.3: リソースに対するメソッド (POST) を作成する

次の put-method コマンドを実行して、API (DynamoDBOperations) のリソース (DynamoDBManager) に対するメソッド (POST) を作成します。

Copy
$ aws apigateway put-method \ --rest-api-id api-id \ --resource-id resource-id \ --http-method POST \ --authorization-type NONE

--authorization-type パラメーターに、このメソッドでは未認証リクエストがサポートされていることを意味する NONE を指定します。この値はテスト用には適切ですが、本稼働時にはキーベースまたはロールベースのいずれかの認証を使用する必要があります。

以下に、応答の例を示します。

Copy
{ "apiKeyRequired": false, "httpMethod": "POST", "authorizationType": "NONE" }

ステップ 3.4: Lambda 関数を POST メソッドの送信先に設定する

次のコマンドを実行して、Lambda 関数を POST メソッド の統合ポイントに設定します (POST メソッドのエンドポイントに HTTPS リクエストを行ったときに、Amazon API Gateway がこのメソッドを呼び出します)。

Copy
$ aws apigateway put-integration \ --rest-api-id api-id \ --resource-id resource-id \ --http-method POST \ --type AWS \ --integration-http-method POST \ --uri arn:aws:apigateway:aws-region:lambda:path/2015-03-31/functions/arn:aws:lambda:aws-region:aws-acct-id:function:your-lambda-function-name/invocations

注記

  • --rest-api-id は、Amazon API Gateway で作成した API (DynamoDBOperations) の ID です。

  • --resource-id は、API に作成したリソース (DynamoDBManager) のリソース ID です。

  • --http-method は API ゲートウェイ メソッドであり、--integration-http-method は API ゲートウェイ が AWS Lambda との通信に使用するメソッドです。

  • --uri は、Amazon API Gateway からのリクエストの送信先となるエンドポイントの一意の識別子です。

以下に、応答の例を示します。

Copy
{ "httpMethod": "POST", "type": "AWS", "uri": "arn:aws:apigateway:region:lambda:path/2015-03-31/functions/arn:aws:lambda:region:aws-acct-id:function:LambdaFunctionForAPIGateway/invocations", "cacheNamespace": "resource-id" }

POST メソッドのレスポンスおよび統合レスポンスの content-type を、以下のように JSON に設定します。

  • 次のコマンドを実行して、POST メソッドのレスポンスを JSON に設定します。これが、API メソッドが返すレスポンスのタイプになります。

    Copy
    $ aws apigateway put-method-response \ --rest-api-id api-id \ --resource-id resource-id \ --http-method POST \ --status-code 200 \ --response-models "{\"application/json\": \"Empty\"}"
  • 次のコマンドを実行して、POST メソッドの統合レスポンスを JSON に設定します。これが、Lambda 関数が返すレスポンスのタイプになります。

    Copy
    $ aws apigateway put-integration-response \ --rest-api-id api-id \ --resource-id resource-id \ --http-method POST \ --status-code 200 \ --response-templates "{\"application/json\": \"\"}"

ステップ 3.5: API をデプロイする

このステップでは、作成した API を prod というステージにデプロイします。

Copy
$ aws apigateway create-deployment \ --rest-api-id api-id \ --stage-name prod

以下に、応答の例を示します。

Copy
{ "id": "deployment-id", "createdDate": 1447726017 }

ステップ 3.6: Amazon API Gateway が Lambda 関数を呼び出すためのアクセス権限を付与する

Amazon API Gateway を使用して API を作成し、デプロイしたので、テストできます。まず、POST メソッドに HTTPS リクエストを送信したときに、Amazon API Gateway が Lambda 関数を呼び出すことができるようにアクセス権限を追加する必要があります。

これを行うには、Lambda 関数に関連付けられているアクセス権限ポリシーにアクセス権限を追加する必要があります。次の AWS Lambda add-permission コマンドを実行して、Lambda 関数 (LambdaFunctionForAPIGateway) を呼び出すアクセス権限を Amazon API Gateway サービスプリンシパル (apigateway.amazonaws.com) に付与します。

Copy
$ aws lambda add-permission \ --function-name LambdaFunctionOverHttps \ --statement-id apigateway-test-2 \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:region:aws-acct-id:api-id/*/POST/DynamoDBManager"

テストを行うには、このアクセス権限を付与する必要があります (Amazon API Gateway に移動し、[Test] を選択して API メソッドをテストする場合は、このアクセス権限が必要です)。--source-arn には、ステージ値としてワイルドカード文字 (*) を指定する (テスト用のみを表す) ことに注意してください。これにより、API をデプロイせずにテストできます。

次に、同じコマンドをもう一度実行しますが、今度は、Lambda 関数を呼び出すためのアクセス権限を、デプロイ済み API に付与します。

Copy
$ aws lambda add-permission \ --function-name LambdaFunctionOverHttps \ --statement-id apigateway-prod-2 \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:region:aws-acct-id:api-id/prod/POST/DynamoDBManager"

デプロイ済み API が Lambda 関数を呼び出すためのアクセス権限を持つように、このアクセス権限を付与します。--source-arn には、API のデプロイ時に使用したステージ名である prod を指定することに注意してください。

ステップ 3.7: HTTPS リクエストの送信をテストする

このステップでは、POST メソッドのエンドポイントに HTTPS リクエストを送信する準備ができています。Curl または Amazon API Gateway で提供されているメソッド (test-invoke-method) のいずれかを使用できます。

DynamoDB テーブルに対して Lambda 関数でサポートされているオペレーションをテストする場合は、まず Amazon DynamoDB の LambdaTable (Id) (Id は文字列型のハッシュキー) でテーブルを作成する必要があります。

Lambda 関数でサポートされている echo および ping のオペレーションをテストする場合は、DynamoDB テーブルを作成する必要はありません。

リソース (DynamoDBManager) のエンドポイントに HTTPS POST リクエストを送信するには、Amazon API Gateway の CLI コマンドを使用できます。Amazon API Gateway はデプロイ済みであるため、Curl を使用して同じオペレーション用のメソッドを呼び出すことができます。

Lambda 関数では、DynamoDB テーブル内に項目を作成する create オペレーションの使用がサポートされています。このオペレーションをリクエストするには、次の JSON を使用します。

Copy
{ "operation": "create", "tableName": "LambdaTable", "payload": { "Item": { "Id": "foo", "number": 5 } } }

リクエスト本文に前述の JSON を使用して、リソース (DynamoDBManager) のエンドポイントに POST メソッドの HTTPS リクエストを送信する、Amazon API Gateway の test-invoke-method コマンドを実行します。

Copy
$ aws apigateway test-invoke-method \ --rest-api-id api-id \ --resource-id resource-id \ --http-method POST \ --path-with-query-string "" \ --body "{\"operation\":\"create\",\"tableName\":\"LambdaTable\",\"payload\":{\"Item\":{\"Id\":\"1\",\"name\":\"Bob\"}}}"

または、次の Curl コマンドを使用することもできます。

Copy
curl -X POST -d "{\"operation\":\"create\",\"tableName\":\"LambdaTable\",\"payload\":{\"Item\":{\"Id\":\"1\",\"name\":\"Bob\"}}}" https://api-id.execute-api.aws-region.amazonaws.com/prod/DynamoDBManager

Lambda 関数でサポートされている echo オペレーション用のリクエストを送信するには、次のリクエストペイロードを使用できます。

Copy
{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }

リクエスト本文に前述の JSON を使用して、リソース (DynamoDBManager) のエンドポイントに POST メソッドの HTTPS リクエストを送信する、Amazon API Gateway の test-invoke-method CLI コマンドを実行します。

Copy
$ aws apigateway test-invoke-method \ --rest-api-id api-id \ --resource-id resource-id \ --http-method POST \ --path-with-query-string "" \ --body "{\"operation\":\"echo\",\"payload\":{\"somekey1\":\"somevalue1\",\"somekey2\":\"somevalue2\"}}"

または、次の Curl コマンドを使用することもできます。

Copy
curl -X POST -d "{\"operation\":\"echo\",\"payload\":{\"somekey1\":\"somevalue1\",\"somekey2\":\"somevalue2\"}}" https://api-id.execute-api.region.amazonaws.com/prod/DynamoDBManager