无服务器 – API 网关触发的 Lambda
无服务器 – 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 的端点之后的地址。上面例子中定义的两个函数将共享同一个端点,但一个会使用 endpoint/details/{user_id} 调用,而另一个会使用 endpoint/location/{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 Gateway,一些控制权交给 lambda 函数。
如果您选择lambda-proxy作为集成类型,那么整个 HTTP 请求将以原始形式传递给您的 lambda 函数,并且由 lambda 函数发送的响应将不加更改地传递给发出请求的客户端。因此,您必须在 lambda 函数的响应中定义 statusCode 和标头。
如果您选择lambda作为集成类型,您的 API 网关可以对接收到的请求进行更改,然后再将其传递给 lambda 函数。同样,它也可以在将 lambda 函数发送的响应转发给客户端之前对其进行修改。API 网关将状态代码和标头添加到响应中,因此,lambda 函数只需担心发送正文。这两种选择都有其优点和缺点。
如果您喜欢简单,可以使用lambda 代理。如果您可以接受一些复杂性,您可以选择lambda(因为您将不得不担心 lambda 函数的代码以及 API 网关的配置),但需要更多控制。
你可以在这里阅读更多关于这两种类型之间的区别。 在其他集成类型中,将 API 网关与 HTTP 后端集成时使用的是http和http-proxy,而不是 lambda 函数,因此与我们无关。当您只想在不调用后端的情况下测试 API 时使用模拟。
该CORS –真正的配置使CORS(跨来源资源共享)。用外行的话来说,这意味着您允许来自另一个域的服务器的请求。如果没有cors – true,则只允许来自同一域的请求。当然,您可以只允许某些特定的域,而不是允许所有域。要了解如何做到这一点,请参阅文档。
对于 API-Gateway 触发的 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)) }
访问端点
现在,您可能遇到的另一个问题是如何访问端点。有多种方法可以做到这一点。第一种方法是通过无服务器部署。每当您通过服务部署一个函数或多个函数时,端点都会显示在无服务器部署的末尾。
第二种方法是通过 Lambda 控制台。如果您在 lambda 控制台上导航到您的函数,您可以看到附加到它的 API 网关。单击它应该会显示端点。
请注意,如上所述,一个服务中的所有函数共享同一个端点。路径属性将一个函数的实际触发器 URL 与另一个函数区分开来。
参考