
无服务器 - 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)。下面介绍的概念也适用于其他函数。
path 的值指定调用 URL 后面的地址。上面示例中定义的两个函数将共享相同的终结点,但一个将使用终结点/details/{user_id} 调用,而另一个将使用终结点/location/{user_id} 调用。花括号内的元素是路径参数。我可以在 user_id 的位置发送任何值,并且可以对 Lambda 函数进行编程以返回该特定用户的详细信息(请参阅下面的示例函数)。
method 的值指示请求方法。常用的方法是 get 和 post。还有其他几种方法。深入探讨这些方法的细节超出了本章的范围。在 tutorialspoint 上还有一篇帖子,您可以参考以了解详细信息。
integration 字段指定 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 和 header。
如果您选择 lambda 作为集成类型,则您的 API 网关可以在将其传递到 Lambda 函数之前更改接收到的请求。类似地,它还可以修改 Lambda 函数发送的响应,然后再将其转发到客户端。API 网关会将状态代码和标头添加到响应中,因此 Lambda 函数只需要担心发送正文即可。这两种选项各有优缺点。
如果您喜欢简单,可以使用 lambda-proxy。如果您不介意一些复杂性(因为您需要担心 Lambda 函数的代码以及 API 网关的配置),但需要更多控制权,则可以选择 lambda。
您可以在 此处阅读有关这两种类型之间差异的更多信息。在其他集成类型中,http 和 http-proxy 用于将 API 网关与 HTTP 后端而不是 Lambda 函数集成,因此与我们无关。mock 用于您只想测试 API 而无需调用后端时。
cors − true 配置启用 CORS(跨源资源共享)。用通俗的话来说,这意味着您允许来自另一个域的服务器的请求。如果没有 cors − true,则只允许来自同一域的请求。当然,除了允许所有域之外,您还可以只允许某些特定域。要了解如何执行此操作,请参阅 文档。
在无服务器中,对于 API 网关触发的 Lambda 函数,还可以进行更多配置。强烈建议您阅读 文档,或者至少将其链接添加为书签,以便在需要时查找。
示例 Lambda 函数
此时,您可能想知道您创建了 API 网关触发的函数,但是如何在 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)) }
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
访问终结点
现在,您可能还有另一个问题,即如何访问终结点。有多种方法可以做到这一点。第一种方法是通过无服务器部署。每当您部署函数或通过服务部署多个函数时,终结点都会显示在无服务器部署的末尾。
第二种方法是通过 Lambda 控制台。如果您导航到 Lambda 控制台上的函数,则可以看到附加到它的 API 网关。单击它应该会显示终结点。

请注意,如上所述,服务中的所有函数共享相同的终结点。path 属性区分一个函数与另一个函数的实际触发 URL。