Serverless 框架中 Lambda 函数调用 API Gateway 时出现的问题及解决方法

阅读时长 5 分钟读完

Serverless 架构是近年来快速发展的一种云计算架构,其核心思想是让应用程序开发者无需关注底层基础设施(如服务器、操作系统等),只需关注代码的编写。AWS Lambda 和 API Gateway 是 Serverless 架构中两个非常重要的服务,典型的应用程序场景是前端通过 API Gateway 调用 Lambda 函数提供的服务。然而,在实际应用中,开发者常常会遇到调用 API Gateway 时出现的问题,本文将介绍一些常见问题以及解决方法。

1. API Gateway 返回错误代码

在使用 Serverless 架构进行开发时,Lambda 函数通过 API Gateway 被调用,如果返回的结果不符合预期,需要检查 API Gateway 是否返回了错误代码。API Gateway 中状态码的含义和 HTTP 协议基本一致,例如 200 表示成功,400 表示请求内容有误,500 表示服务器内部错误等。对于返回错误的情况,可能出现的原因有:

  • Lambda 函数没有正确地处理请求。
  • API Gateway 配置有误。
  • 调用 API Gateway 时请求参数有误。
  • 其他原因。

在排除其他原因之后,可以检查 API Gateway 的配置,按照相应的状态码进行调整,例如添加正确的响应模板等。

2. API Gateway 的请求参数无法传递到 Lambda 函数

Lambda 函数常常需要通过 API Gateway 接收来自前端的请求参数,但有时候会出现请求参数无法传递到 Lambda 函数的情况。这可能是由于 API Gateway 的请求体默认是以 JSON 格式传递的,而 Lambda 函数默认接收的参数是 event 和 context 两个参数。为了接收前端发来的请求参数,需要使用如下方式将 JSON 格式的请求体解析成 JavaScript 对象:

这样就可以将解析后的请求参数传入 Lambda 函数中了。

3. API Gateway 中跨域请求报错

在开发 Serverless 应用时,经常会在前端使用 ajax 或者 fetch 方式调用 API Gateway 的服务,但是如果前端与后端的域名或者端口号不一致,就会出现跨域请求的问题。如果 API Gateway 没有正确配置跨域资源共享(CORS),则请求会被拒绝,这时需要在 API Gateway 中为所有路由启用 CORS,具体方法可以在 API Gateway 中进行配置,

YAML 配置文件中的 cors 字段可以开启 CORS,origins 字段指定接受跨域请求的来源,默认值是 "",也可以指定特定的来源。headers 字段指定了 API Gateway 允许提交的 Header,Content-Type 和 Authorization 是请求最常用到的两个 Header。allowCredentials 字段用来设置是否允许前端向后端传递 Cookie 等验证信息,但需要注意的是,如果要传递这些信息,同时 origins 字段不能为 "",必须指定具体的来源。

4. Serverless 应用中的消息队列

Serverless 架构中,消息队列是一种非常重要的组件。消息队列主要用于异步处理任务,可以将一个请求分解成独立的任务,分发至多个服务中进行处理。AWS 提供了多项消息队列相关的服务,如 Kinesis、SQS 和 SNS。

例如,我们可以将 API Gateway 中接收到的请求放到 SQS 中进行处理,而不是直接传递给 Lambda 函数:

-- -------------------- ---- -------
----------
  -------------------------
    -------- --------------------------------
    -------
      - -----
          ----- ----
          ------- ----
          ------------ ---
          --------
            ---------
              ----------------- -
                -
                  ------- -----------------
                  ---------- -
                    ---------------- -- --------------------------------
                    ---------- ---------------------------------------------------------------------------------------
                    ----
                  -
                -
            -----------
              ------
                --------------- -------
              -------------
                ------------- ---
          ---------
            --------- ---------------------------
            ------------
              ----
                -------- --

这样,制定了 integration: sqs 就会将请求转发到 SQS,parameters.paths.messageGroupId 中指定了消息的 GroupId, parameters.querystrings.delaySeconds 指定了请求时的延迟时间。需要注意的是,使用 SQS 要求 Lambda 函数必须具备处理从 SQS 收到的消息的能力,这需要对 Lambda 函数的代码进行相应的调整。

5. 总结

以上是在开发 Serverless 应用时可能遇到的一些问题及解决方法。在实际开发过程中,应该始终关注 Serverless 架构和前端技术的发展动态,及时使用新技术和解决方案,以更好的服务于已有的应用场景。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65b88934add4f0e0ff119ce2

纠错
反馈