教程:利用 Lambda 代理集成创建 REST API - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

教程:利用 Lambda 代理集成创建 REST API

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

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

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

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

创建“Hello, World!” Lambda 函数

创建“Hello, World!” Lambda 控制台中的 Lambda 函数
  1. 通过以下网址登录 Lambda 控制台:https://console.aws.amazon.com/lambda

  2. 在 Amazon 导航栏上,选择 Amazon Web Services 区域

    注意

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

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

  4. 选择创建函数

  5. 选择从头开始创作

  6. 基本信息中,执行以下操作:

    1. 函数名称中,输入 GetStartedLambdaProxyIntegration

    2. 运行时中,选择受支持的最新 Node.jsPython 运行时。

    3. 对于架构,请保留默认设置。

    4. 权限下,展开更改默认执行角色。在执行角色下拉列表中,选择从 Amazon 策略模板创建新角色

    5. 角色名称中,输入 GetStartedLambdaBasicExecutionRole

    6. 策略模板字段留空。

    7. 选择创建函数

  7. 在内联代码编辑器的函数代码下,复制/粘贴以下代码:

    Node.js
    export const handler = function(event, context, callback) { console.log('Received event:', JSON.stringify(event, null, 2)); var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; var greeter = 'World'; if (event.greeter && event.greeter!=="") { greeter = event.greeter; } else if (event.body && event.body !== "") { var body = JSON.parse(event.body); if (body.greeter && body.greeter !== "") { greeter = body.greeter; } } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") { greeter = event.queryStringParameters.greeter; } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") { greeter = event.multiValueHeaders.greeter.join(" and "); } else if (event.headers && event.headers.greeter && event.headers.greeter != "") { greeter = event.headers.greeter; } res.body = "Hello, " + greeter + "!"; callback(null, res); };
    Python
    import json def lambda_handler(event, context): print(event) greeter = 'World' try: if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and ( event['queryStringParameters']['greeter'] is not None): greeter = event['queryStringParameters']['greeter'] except KeyError: print('No greeter') try: if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and ( event['multiValueHeaders']['greeter'] is not None): greeter = " and ".join(event['multiValueHeaders']['greeter']) except KeyError: print('No greeter') try: if (event['headers']) and (event['headers']['greeter']) and ( event['headers']['greeter'] is not None): greeter = event['headers']['greeter'] except KeyError: print('No greeter') if (event['body']) and (event['body'] is not None): body = json.loads(event['body']) try: if (body['greeter']) and (body['greeter'] is not None): greeter = body['greeter'] except KeyError: print('No greeter') res = { "statusCode": 200, "headers": { "Content-Type": "*/*" }, "body": "Hello, " + greeter + "!" } return res
  8. 选择部署

创建“Hello, World!” API

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

创建“Hello, World!” API
  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 如果您是第一次使用 API Gateway,您会看到一个介绍服务特征的页面。在 REST API 下,选择生成。当创建示例 API 弹出框出现时,选择确定

    如果这不是您首次使用 API Gateway,请选择创建 API。在 REST API 下,选择生成

  3. 对于 API 名称,请输入 LambdaProxyAPI

  4. (可选)对于描述,输入描述。

  5. API 端点类型设置保留为区域

  6. 选择创建 API

创建 API 后,您将创建一个资源。通常情况下,根据应用程序逻辑将 API 资源组织成资源树形式。在本示例中,您将创建一个 /helloworld 资源。

创建资源
  1. 选择创建资源

  2. 代理资源保持为关闭状态。

  3. 资源路径保持为 /

  4. 对于资源名称,输入 helloworld

  5. CORS(跨源资源共享)保持为关闭状态。

  6. 选择创建资源

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

创建 ANY 方法
  1. 选择 /helloworld 资源,然后选择创建方法

  2. 对于方法类型,选择 ANY

  3. 对于集成类型,选择 Lambda 函数

  4. 打开 Lambda 代理集成

  5. 对于 Lambda 函数,选择您创建 Lambda 函数的 Amazon Web Services 区域,然后输入函数名称。

  6. 要使用默认超时值 29 秒,请保持默认超时处于开启状态。要设置自定义超时,请选择默认超时,然后输入一个介于 5029000 毫秒之间的超时值。

  7. 选择创建方法

部署并测试 API

部署 API
  1. 选择部署 API

  2. 对于阶段,选择新建阶段

  3. 对于阶段名称,输入 test

  4. (可选)对于描述,输入描述。

  5. 选择部署

  6. 阶段详细信息下,选择复制图标以复制您 API 的调用 URL。

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

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

要仅使用查询字符串参数测试 GET 请求,您可以在浏览器地址栏中输入 API 的 helloworld 资源的 URL。

要创建 API 的 helloworld 资源的 URL,请将资源 helloworld 和查询字符串参数 ?greeter=John 附加到您的调用 URL。URL 应类似以下内容。

https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John

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

使用 cURL 测试已部署的 API:
  1. 打开终端窗口。

  2. 复制以下 cURL 命令并粘贴到终端窗口中,将调用 URL 替换为在上一步中复制的调用 URL,并在该 URL 的末尾添加 /helloworld

    注意

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

    curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
    1. 使用查询字符串参数 ?greeter=John 调用 API:

      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
    2. 使用标头参数 greeter:John 调用 API:

      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \ -H 'content-type: application/json' \ -H 'greeter: John'
    3. 使用正文 {"greeter":"John"} 调用 API:

      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \ -H 'content-type: application/json' \ -d '{ "greeter": "John" }'

    在所有情况下,输出为具有以下响应正文的 200 响应:

    Hello, John!