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

教程:使用 Lambda 代理集成构建 Hello World API

Lambda 代理集成是一种轻量型、灵活的 API Gateway API 集成类型,可让您能够使用 Lambda 函数集成 API 方法(或整个 API)。Lambda 函数可采用 Lambda 支持的任何语言进行编写。由于这是代理集成,因此您可以随时更改 Lambda 函数实现,而无需重新部署您的 API。

在本教程中,您将执行以下操作:

  • 创建一个要作为 API 的后端的“Hello, World!”Lambda 函数。

  • 创建并测试“Hello, World!” 带 Lambda 代理集成的 API。

创建“Hello, World!” Lambda 函数

此函数会将问候语作为以下格式的 JSON 对象返回给调用方:

{ "greeting": "Good {time}, {name} of {city}.[ Happy {day}!]" }

在 Lambda 控制台中创建“Hello, World!”Lambda 函数

  1. 通过 https://console.amazonaws.cn/lambda 登录 Lambda 控制台。

  2. 在 AWS 导航栏中,选择一个区域(例如,美国东部 (弗吉尼亚北部))。

    注意

    请注意您创建 Lambda 函数时所在的区域。在创建 API 时,会需要它。

  3. 在导航窗格中,选择 Functions (函数)

  4. 选择 Create function (创建函数)

  5. 选择 Author from scratch (从头开始创作)

  6. Basic information (基本信息) 中,执行以下操作:

    1. Function name (函数名称) 中,输入 GetStartedLambdaProxyIntegration

    2. Runtime (运行时) 下拉列表中,选择 Node.js 8.10

    3. Permissions (权限) 下,展开 Choose or create an execution role (选择或创建执行角色)。从 Execution role (执行角色) 下拉列表中,选择 Create new role from AWS policy templates (从 AWS 策略模板创建新角色)

    4. Role Name (角色名称) 中,输入 GetStartedLambdaBasicExecutionRole

    5. Policy templates (策略模板) 字段留空。

    6. 选择 Create function (创建函数)

  7. Function code (函数代码) 下,在内联代码编程中,复制/粘贴以下代码:

    'use strict'; console.log('Loading hello world function'); exports.handler = async (event) => { let name = "you"; let city = 'World'; let time = 'day'; let day = ''; let responseCode = 200; console.log("request: " + JSON.stringify(event)); if (event.queryStringParameters && event.queryStringParameters.name) { console.log("Received name: " + event.queryStringParameters.name); name = event.queryStringParameters.name; } if (event.queryStringParameters && event.queryStringParameters.city) { console.log("Received city: " + event.queryStringParameters.city); city = event.queryStringParameters.city; } if (event.headers && event.headers['day']) { console.log("Received day: " + event.headers.day); day = event.headers.day; } if (event.body) { let body = JSON.parse(event.body) if (body.time) time = body.time; } let greeting = `Good ${time}, ${name} of ${city}.`; if (day) greeting += ` Happy ${day}!`; let responseBody = { message: greeting, input: event }; // The output from a Lambda proxy integration must be // in the following JSON object. The 'headers' property // is for custom response headers in addition to standard // ones. The 'body' property must be a JSON string. For // base64-encoded payload, you must also set the 'isBase64Encoded' // property to 'true'. let response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value" }, body: JSON.stringify(responseBody) }; console.log("response: " + JSON.stringify(response)) return response; };
  8. 选择 Save (保存)

创建“Hello, World!” API

现在,通过使用 API Gateway 控制台为您的“Hello, World!”Lambda 函数创建 API。

构建“Hello, World!” API

  1. 通过 https://console.amazonaws.cn/apigateway 登录 API Gateway 控制台。

  2. 如果这是您首次使用 API Gateway,则您会看到一个介绍服务功能的页面。选择 Get Started (入门) 。当 Create Example API (创建示例 API) 弹出框出现时,选择 OK (确定)

    如果这不是您首次使用 API Gateway,请选择 Create API (创建 API)

  3. 创建一个空的 API,如下所示:

    1. Choose the protocol (选择协议) 下,选择 REST

    2. Create a new API (创建新 API) 下,选择 New API (新建 API)

    3. Settings (设置) 下:

      • 对于 API name (API 名称),输入 LambdaSimpleProxy

      • 如果需要,在 Description (说明) 字段中输入说明;否则,将其保留为空。

      • Endpoint Type (终端节点类型) 设置为 Regional (区域)

    4. 选择 Create API (创建 API)

  4. 创建 helloworld 资源,如下所示:

    1. Resources (资源) 树下选择根资源 (/)。

    2. Actions (操作) 下拉菜单中,选择 Create Resource (创建资源)

    3. 取消选中 Configure as proxy resource (作为代理资源进行配置)

    4. 对于 Resource Name (资源名称),输入 helloworld

    5. Resource Path (资源路径) 设置为 /helloworld

    6. 取消选中 Enable API Gateway CORS (启用 API Gateway CORS)

    7. 选择 Create Resource (创建资源)

  5. 在代理集成中,整个请求将通过表示任何 HTTP 方法的“捕获全部”ANY 方法按原样发送到后端 Lambda 函数。实际的 HTTP 方法由客户端在运行时指定。ANY 方法可让您对所有支持的 HTTP 方法使用单个 API 方法设置:DELETEGETHEADOPTIONSPATCHPOSTPUT

    要设置 ANY 方法,请执行以下操作:

    1. Resources (资源) 列表中,选择 /helloworld

    2. Actions (操作) 菜单中,选择 Create method (创建方法)

    3. 从下拉菜单中选择 ANY,然后选中复选标记图标

    4. Integration type (集成类型) 设置为 Lambda Function (Lambda 函数)

    5. 选择 Use Lambda Proxy integration (使用 Lambda 代理集成)

    6. 对于 Lambda Region (Lambda 区域) 下拉菜单,选择您在其中创建 GetStartedLambdaProxyIntegration Lambda 函数的区域。

    7. Lambda Function (Lambda 函数) 字段中,键入任何字符并从下拉菜单中选择 GetStartedLambdaProxyIntegration

    8. Use Default Timeout (使用默认超时) 保持选中状态。

    9. 选择 Save (保存)

    10. 在出现 Add Permission to Lambda Function (向 Lambda 函数添加权限) 提示时,选择 OK (确定)

部署并测试 API

在 API Gateway 控制台中部署 API

  1. Actions (操作) 下拉菜单中选择 Deploy API (部署 API)

  2. 对于 Deployment stage (部署阶段),选择 [new stage]

  3. 对于 Stage name (阶段名称),输入 test

  4. 如果需要,输入一个 Stage description (阶段说明)

  5. 如果需要,输入一个 Deployment description (部署说明)

  6. 选择 Deploy (部署)

  7. 请记下 API 的 Invoke URL (调用 URL)

使用浏览器和 cURL 来通过 Lambda 代理集成测试 API

您可以使用浏览器或 cURL 来测试您的 API。

要仅使用查询字符串参数测试 GET 请求,您可以在浏览器地址栏中键入 API 的 helloworld 资源的 URL。例如:https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle

对于其他方法,您必须使用更高级的 REST API 测试实用程序,如 POSTMANcURL。本教程使用的是 cURL。以下 cURL 命令示例假定您的计算机上已安装 cURL。

使用 cURL 测试已部署的 API:

  1. 打开终端窗口。

  2. 复制以下 cURL 命令将其粘贴到终端窗口中,同时将 r275xc9bmd 替换为您的 API 的 API ID 并将 us-east-1 替换为部署您的 API 的区域。

    curl -v -X POST \ 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday' \ -d '{ "time": "evening" }'

    注意

    如果您在 Windows 上运行命令,请改用以下语法:

    curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle" -H "content-type: application/json" -H "day: Thursday" -d "{ \"time\": \"evening\" }"

您应获得一个包含类似于以下负载的成功响应:

{ "message":"Good evening, John of Seattle. Happy Thursday!", "input":{ "resource":"/helloworld", "path":"/helloworld", "httpMethod":"POST", "headers":{"Accept":"*/*", "content-type":"application/json", "day":"Thursday", "Host":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "User-Agent":"curl/7.64.0", "X-Amzn-Trace-Id":"Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6", "X-Forwarded-For":"72.21.198.64", "X-Forwarded-Port":"443", "X-Forwarded-Proto":"https"}, "multiValueHeaders":{"Accept":["*/*"], "content-type":["application/json"], "day":["Thursday"], "Host":["r275xc9bmd.execute-api.us-east-1.amazonaws.com"], "User-Agent":["curl/0.0.0"], "X-Amzn-Trace-Id":["Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6"], "X-Forwarded-For":["11.22.333.44"], "X-Forwarded-Port":["443"], "X-Forwarded-Proto":["https"]}, "queryStringParameters":{"city":"Seattle", "name":"John" }, "multiValueQueryStringParameters":{ "city":["Seattle"], "name":["John"] }, "pathParameters":null, "stageVariables":null, "requestContext":{ "resourceId":"3htbry", "resourcePath":"/helloworld", "htt* Connection #0 to host r275xc9bmd.execute-api.us-east-1.amazonaws.com left intact pMethod":"POST", "extendedRequestId":"a1b2c3d4e5f6g7h=", "requestTime":"20/Mar/2019:20:38:30 +0000", "path":"/test/helloworld", "accountId":"123456789012", "protocol":"HTTP/1.1", "stage":"test", "domainPrefix":"r275xc9bmd", "requestTimeEpoch":1553114310423, "requestId":"test-invoke-request", "identity":{"cognitoIdentityPoolId":null, "accountId":null, "cognitoIdentityId":null, "caller":null, "sourceIp":"test-invoke-source-ip", "accessKey":null, "cognitoAuthenticationType":null, "cognitoAuthenticationProvider":null, "userArn":null, "userAgent":"curl/0.0.0","user":null }, "domainName":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "apiId":"r275xc9bmd" }, "body":"{ \"time\": \"evening\" }", "isBase64Encoded":false } }

如果您在之前的请求中将 POST 更改为 PUT,则应收到相同的响应。

要测试 GET 方法,请复制以下 cURL 命令并将其粘贴到终端窗口中,同时将 r275xc9bmd 替换为您的 API 的 API ID 并将 us-east-1 替换为部署您的 API 的区域。

curl -X GET \ 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?Seattle?name=John' \ -H 'content-type: application/json' \ -H 'day: Thursday'

您应收到与之前的 POST 请求的结果类似的响应,区别在于 GET 请求没有任何负载。因此,body 参数将为 null