Serverless教程

Serverless API网关

API 网关是另一种流行的触发 lambda 的方法,就像 cron/rate 事件一样。基本上,您会获得 lambda 函数的 URL 端点。此 URL 属于连接到您的 lambda 的 API 网关。每当您在浏览器中或通过应用程序调用 URL 时,您的 lambda 函数都会被调用。在本章中,我们将看到如何使用Serverless框架将 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。还有其他几种方法。深入研究这些方法的细节超出了本章的范围。还有另一个关于lidihuo的帖子,你可以参考它的详细信息.
集成字段指定了 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 和 headers。
如果您选择 lambda 作为集成类型,您的 API 网关可以对接收到的请求进行更改,然后再将其传递给 lambda 函数。同样,它也可以在将 lambda 函数发送的响应转发给客户端之前对其进行修改。 API 网关将状态代码和标头添加到响应中,因此,lambda 函数只需担心发送正文。这两种选择都有其优点和缺点。
如果您喜欢简单,可以使用 lambda-proxy。如果您可以接受一些复杂性,您可以选择 lambda(因为您将不得不担心 lambda 函数的代码以及 API 网关的配置),但需要更多控制。
您可以阅读有关这两种类型之间差异的更多信息此处。在其他集成类型中, httphttp-proxy 用于将 API 网关与 HTTP 后端集成而不是 lambda 函数,因此与我们无关。 mock当您只想测试 API 而不调用后端时使用。
cors- true 配置启用 CORS(跨源资源共享)。用外行的话来说,这意味着您允许来自另一个域的服务器的请求。如果没有 cors- true,则只允许来自同一域的请求。当然,您可以只允许某些特定的域,而不是允许所有域。要了解如何做到这一点,请参阅 文档。
对于 API 网关触发的 lambda,Serverless中有更多可能的配置。强烈建议您阅读文档,或者至少为链接添加书签,以便您可以在需要时随时查找。

示例 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))
      }

访问端点

现在,您可能遇到的另一个问题是如何访问端点。有多种方法可以做到这一点。第一种方法是通过Serverless部署。每当您通过服务部署一个函数或多个函数时,端点都会显示在Serverless部署的末尾。
第二种方法是通过 Lambda 控制台。如果您在 lambda 控制台上导航到您的函数,您可以看到附加到它的 API 网关。点击它应该会显示端点。
API 网关
请注意,如上所述,一个服务中的所有函数共享同一个端点。path 属性将一个函数的实际触发器 URL 与另一个函数区分开来。

参考文献

Serverless API 网关文档 lambda 代理与 lambda 集成
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4