Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

设置 API Gateway 中的 Lambda 自定义集成

为显示如何设置 Lambda 自定义集成,我们创建了一个 API Gateway API 用于公开 GET /greeting?greeter={name} 方法来调用 Lambda 函数。在 greeter 参数值为非空字符串时,该函数使用消息 "Hello, {name}!" 进行响应。如果 greeter 值是空字符串,则返回消息 "Hello, World!"。如果传入请求中未设置 greeter 参数,则返回错误消息 "Missing the required greeter parameter."。我们将函数命名为 HelloWorld

为方便参考,下面显示了 Lambda 函数的 Node.js 版本:

exports.handler = function(event, context, callback) { var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; if (event.greeter==null) { callback(new Error('Missing the required greeter parameter.')); } else if (event.greeter === "") { res.body = "Hello, World"; callback(null, res); } else { res.body = "Hello, " + event.greeter +"!"; callback(null, res); } };

您可以在 Lambda 控制台中或使用 AWS CLI 创建它。在此部分中,我们使用以下 ARN 引用此函数:

arn:aws:lambda:us-east-1:123456789012:function:HelloWorld

在后端设置了 Lambda 函数之后,继续设置 API。

使用 AWS CLI 设置 Lambda 自定义集成

  1. 调用 create-rest-api 命令以创建 API:

    aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)' --region us-west-2

    请注意在响应中生成的 API 的 id 值 (te6si5ach7)。

    { "name": "HelloWorld (AWS CLI)", "id": "te6si5ach7", "createdDate": 1508461860 }

    您在此部分中需要 API id

  2. 调用 get-resources 命令以获取根资源 id

    aws apigateway get-resources --rest-api-id te6si5ach7 --region us-west-2

    成功的响应如下所示:

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

    记录根资源 id 值 (krznpq9xpg)。您在下一个步骤中和以后需要用到它。

  3. 调用 create-resource 以创建 API Gateway 资源 /greeting

    aws apigateway create-resource --rest-api-id te6si5ach7 \ --region us-west-2 \ --parent-id krznpq9xpg \ --path-part greeting

    成功响应的形式与下方类似:

    { "path": "/greeting", "pathPart": "greeting", "id": "2jf6xt", "parentId": "krznpq9xpg" }

    记录生成的 greeting 资源的 id 值 (2jf6xt)。在下一个步骤中,您需要它在 /greeting 资源上创建方法。

  4. 调用 put-method 以创建 API 方法请求 GET /greeting?greeter={name}

    aws apigateway put-method --rest-api-id te6si5ach7 \ --region us-west-2 \ --resource-id 2jf6xt \ --http-method GET \ --authorization-type "NONE" \ --request-parameters method.request.querystring.greeter=false

    成功响应的形式与下方类似:

    { "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE", "requestParameters": { "method.request.querystring.greeter": false } }

    此 API 方法允许客户端从后端的 Lambda 函数接收问候语。此 greeter 参数是可选的,因为后端应处理匿名调用方或自识别调用方。

  5. 调用 put-method-response200 OK 响应设置到方法请求 GET /greeting?greeter={name}

    aws apigateway put-method-response \ --region us-west-2 --rest-api-id te6si5ach7 \ --resource-id 2jf6xt --http-method GET \ --status-code 200
  6. 调用 put-integration 以使用名为 HelloWorld 的 Lambda 函数设置 GET /greeting?greeter={name} 方法的集成。在提供 greeter 参数时,函数使用消息 "Hello, {name}!" 响应请求,在未设置查询字符串参数时使用 "Hello, World!" 响应。

    aws apigateway put-integration \ --region us-west-2 --rest-api-id vaz7da96z6 \ --resource-id 2jf6xt \ --http-method GET \ --type AWS \ --integration-http-method POST \ --uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations \ --request-templates file://path/to/integration-request-template.json \ --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole

    在这里,request-template 参数值 file://path/to/integration-request-template.json 指向 path/to 中名为 integration-request-template.json 的 JSON 文件,其中包含作为 JSON 对象的键/值映射。该键为请求负载的介质类型,值是指定内容类型正文的映射模板。在本示例中,JSON 文件应包含以下 JSON 对象:

    {"application/json":"{\"greeter\":\"$input.params('greeter')\"}"}

    此处提供的映射模板转换为 JSON 负载 greeter 属性的 greeter 查询字符串参数。这么做是必要的,因为对 Lambda 函数中的 Lambda 函数的输入必须表示在正文中。您可以使用映射的 JSON 字符串 (例如,"{\"greeter"\: \"'john'\"}") 作为 put-integration 命令的 request-template 输入值。但是,使用文件输入可以避免困难以及有时不可能的字符串化 JSON 对象所需的引号转义。

    对于 Lambda 集成,根据函数调用的 Lambda 服务操作规范,您必须为集成请求使用 HTTP 方法 POSTuri 参数是函数调用操作的 ARN。

    成功输出的形式与下方类似:

    { "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations", "httpMethod": "POST", "requestTemplates": { "application/json": "{\"greeter\":\"$input.params('greeter')\"}" }, "cacheNamespace": "krznpq9xpg", "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole", "type": "AWS" }

    apigAwsProxyRole 的 IAM 角色必须具有策略,允许 apigateway 服务调用 Lambda 函数。不同于为 credentials 提供 IAM 角色,您可以调用 add-permission 命令以添加基于资源的权限。API Gateway 控制台添加这些权限的方法如此处所示。

  7. 调用 put-integration-response 设置集成响应,用于将 Lambda 函数输出传递到客户端作为 200 OK 方法响应。

    aws apigateway put-integration-response \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200 \ --selection-pattern ""

    将 selection-pattern 设置为空字符串时,200 OK 响应是默认值。

    成功的响应内容应类似如下所示:

    { "selectionPattern": "", "statusCode": "200" }
  8. 调用 create-deployment 以部署 API 到 test 阶段:

    aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test
  9. 在终端中使用以下 cURL 命令测试 API:

    curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=me' \ -H 'authorization: AWS4-HMAC-SHA256 Credential={access_key}/20171020/us-west-2/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=f327...5751'

Lambda 代理集成的设置相比,它更多地涉及到设置 Lambda 自定义集成。