AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

步骤 3:使用 Amazon API Gateway 创建 API 并对其进行测试

在本步骤中,您会将 Lambda 函数与您使用 Amazon API Gateway 创建的 API 中的方法关联并测试端到端体验。也就是说,将 HTTPS 请求发送到 API 方法后,Amazon API Gateway 将调用您的 Lambda 函数。

首先,通过将 Amazon API Gateway 与一种资源 (DynamoDBManager) 和一种方法 (POST) 结合使用来创建 API (DynamoDBOperations)。将 POST 方法与您的 Lambda 函数关联。然后,测试端到端体验。

步骤 3.1:创建 API

在本教程中,运行以下 create-rest-api 命令来创建 DynamoDBOperations API。

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

以下为响应示例:

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 方法终端节点的请求时 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" }

设置对 JSON 的 POST 方法响应和集成响应的 content-type,如下所示:

  • 运行以下命令以设置对 JSON 的 POST 方法响应。这是您的 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\"}"
  • 运行以下命令以设置对 JSON 的 POST 方法集成响应。这是 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,您便可以进行测试了。首先,您需要添加权限,以便让 Amazon API Gateway 在您将 HTTPS 请求发送到 POST 方法时调用 Lambda 函数。

为此,您需要向与 Lambda 函数关联的权限策略添加权限。运行以下 add-permission AWS Lambda 命令可为 Amazon API Gateway 服务委托人 (apigateway.amazonaws.com) 授予调用 Lambda 函数 (LambdaFunctionForAPIGateway) 的权限。

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 即可进行测试。

现在,再次运行同一命令,但这次您将向已部署的 API 授予调用 Lambda 函数的权限。

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 指定了 prod,这是我们在部署 API 时使用的阶段名称。

步骤 3.7:测试发送 HTTPS 请求

在本步骤中,您已准备好向 POST 方法终端节点发送 HTTPS 请求。您可使用 Curl 或 Amazon API Gateway 提供的方法 (test-invoke-method)。

如果您要测试 Lambda 函数在 DynamoDB 表上支持的操作,则首先需要在 Amazon DynamoDB LambdaTable (Id) 中创建一个表,其中 ID 是字符串类型的哈希键。

如果您测试的是 Lambda 函数支持的 echoping 操作,则无需创建 DynamoDB 表。

您可使用 Amazon API Gateway CLI 命令向资源 (DynamoDBManager) 终端节点发送 HTTPS POST 请求。因为您已部署 Amazon API Gateway,所以可以使用 Curl 来调用相应的方法来实现同一操作。

Lambda 函数支持使用 create 操作在 DynamoDB 表中创建项目。要请求此操作,请使用以下 JSON:

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

运行 test-invoke-method Amazon API Gateway 命令以使用请求正文中前面的 JSON 代码向资源 (DynamoDBManager) 终端节点发送 HTTPS POST 方法请求。

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" } }

运行 test-invoke-method Amazon API Gateway CLI 命令以使用请求正文中前面的 JSON 代码向资源 (DynamoDBManager) 终端节点发送 HTTPS POST 方法请求。

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