无服务器 - API 网关触发 Lambda


API 网关是触发 lambda 的另一种流行方法,就像 cron/rate 事件一样。基本上,您会获得 lambda 函数的 URL 端点。此 URL 属于连接到您的 lambda 的 API 网关。每当您在浏览器中或通过应用程序调用 URL 时,您的 lambda 函数都会被调用。在本章中,我们将了解如何使用无服务器框架将 API 网关连接到 lambda 函数,以及如何测试它。

HTTP 事件

要将 API 网关链接到 lambda 函数,我们需要在 serverless.yml 的函数定义中创建 HTTP 事件。以下示例演示如何将 lambda 函数链接到 REST API 并使用 GET 请求触发它。

functions:
   user_details_api:
      handler: handler.send_user_details
      events:
         - http:
            path: details/{user_id}
            method: get
            integration: lambda-proxy
            cors: true
		  
   location_api:
      handler: handler.send_location
      events:
         - http:
            path: location/{user_id}
            method: get
            integration: lambda-proxy
            cors: true

让我们一一打开钥匙。我们将只讨论上面列表中的第一个函数 (user_details_api)。下面介绍的概念也适用于其他函数。

路径的值指定调用URL的端点之后的地址。上例中定义的两个函数将共享相同的端点,但一个将使用端点/详细信息/{user_id}调用,而另一个将通过端点/位置/{user_id}调用。大括号内的元素是路径参数。我可以发送任何值来代替 user_id,并且 lambda 函数可以编程为返回该特定用户的详细信息(请参阅下面的示例函数)。

method的值表示请求的方法。流行的方法是 get 和 post。还有其他几种方法。深入研究这些方法的细节超出了本章的范围。在tutorialspoint上有另一篇文章,您可以参考以了解详细信息。

集成字段指定 lambda 函数如何与 API 网关集成。默认是lambda-proxy,而其他可能的选项是lambda、http、http-proxy、mock。这两个选项中使用最广泛的选项是 lambda 和 lambda-proxy。用外行人的话来说,lambda-proxy将全部控制权交给 lambda 函数,而lambda将部分控制权交给 API 网关,将部分控制权交给 lambda 函数。

如果您选择lambda-proxy作为集成类型,则整个 HTTP 请求将以原始形式传递给您的 lambda 函数,并且 lambda 函数发送的响应将不经更改地传递给发出请求的客户端。因此,您必须在 lambda 函数的响应中定义 statusCode 和标头。

如果您选择lambda作为集成类型,您的 API 网关可以对收到的请求进行更改,然后再将其传递给 lambda 函数。同样,它也可以在将 lambda 函数发送的响应转发到客户端之前对其进行修改。API 网关将状态代码和标头添加到响应中,因此 lambda 函数只需担心发送正文。两种选择都有其优点和缺点。

如果您喜欢简单性,可以使用lambda-proxy。如果您可以接受一定的复杂性(因为您将不得不担心 lambda 函数的代码以及 API 网关的配置),但需要更多的控制,则可以选择 lambda

您可以在此处详细了解这两种类型之间的区别。在其他集成类型中,在将 API 网关与 HTTP 后端集成时使用httphttp-proxy,而不是 lambda 函数,因此与我们无关。当您只想测试API而不调用后端时,可以使用mock 。

cors - true配置启用 CORS(跨源资源共享)。通俗地说,这意味着您允许来自另一个域的服务器的请求。如果没有cors - true,则仅允许来自同一域的请求。当然,您可以仅允许某些特定域,而不是允许所有域。要了解如何执行此操作,请参阅文档

对于 API 网关触发的 lambda,无服务器中还有更多可能的配置。强烈建议您仔细阅读文档,或者至少为链接添加书签,以便您可以在需要时进行查找。

示例 Lambda 函数

此时,您可能想知道您创建了 API Gateway 触发函数,但是如何访问 lambda 函数中的路径参数呢?以下 Python 中的 lambda 函数示例将回答这个问题。当集成类型为lambda-proxy时,我们基本上使用'pathParameters'属性。

import json

def lambda_handler(event, context):
   # TODO implement
   # print(event) 
   #helps you see the entire input request. The printed output can be found in CloudWatch logs
      user = event['pathParameters']['user_id']
      return {
         'statusCode': 200,
         'body': json.dumps('Hello ' + str(user))
      }

访问端点

现在,您可能遇到的另一个问题是如何访问端点。有多种方法可以做到这一点。第一种方式是通过无服务器部署。每当您通过服务部署一个或多个功能时,端点都会显示在无服务器部署的末尾。

第二种方法是通过 Lambda 控制台。如果您在 lambda 控制台上导航到您的函数,您可以看到附加到它的 API 网关。单击它应该会显示端点。

API网关

请注意,如上所述,服务中的所有功能共享相同的端点。路径属性将一个功能的实际触发 URL 与另一个功能区分开来。

参考