假设您需要在 API 后面公开一个 JSON 文件。使用 AWS 的无服务器方法,您可能首先会使用如下架构:

API 网关到 Lambda 到 S3

...即调用 S3 的 Lambda 前面的 API 网关。或者,您是否知道可以删除 Lambda 并让 API Gateway 直接调用 S3?

API 网关到 Lambda

这就是我所说的“无Lambda”。它利用 API Gateway 的AWS集成类型,它允许您在没有任何中间应用程序逻辑的情况下公开任何 AWS 服务。映射模板使用Velocity模板语言 (VTL) 和JSONPath表达式提供转换请求/响应的粘合剂。

演练

继续上面的 S3 示例,使用 GET 方法创建一个 API 网关,并按照以下内容设置集成请求:

  • 选择 AWS 服务类型、区域和 Simple Storage Service (S3)

  • 选择GET HTTP方式

  • 选择“使用路径覆盖”动作类型

  • 在路径覆盖字段中输入对象的<bucket>/<prefix>

API 网关 S3 集成请求

创建一个 IAM 角色,该角色具有对您的<bucket>/<prefix>具有s3:GetObject权限的策略以及允许 API 网关假定它的信任关系。现在您需要做的就是切换到测试视图,单击“测试”,您应该会在响应正文中看到 JSON 对象的内容:

API 网关 S3 响应

示例

模拟集成

以 JSON 示例得出其合乎逻辑的结论,我们可以更进一步,将 S3 从等式中完全删除。选择MOCK集成类型,添加所需的{"statusCode": 200}请求映射模板并将 JSON 对象的内容移动到集成响应映射模板。

这种方法通常会产生约 3 毫秒的响应时间(与到 S3 的额外跃点相比约 65 毫秒)并且是静态数据的良好解决方案。

DynamoDB

带有 DynamoDB 的简单 CRUD API 非常适合 Lambdaless。 API Gateway 的$context 变量包括$context.requestId,它可以用作实体的 UUID,以及$context.requestTimeEpoch用于创建/更新时间戳。

请求/响应模板可用于与 DynamoDB 的数据类型描述符相互转换,例如:

#set($inputRoot = $input.path('$'))
{
  "TableName": "my-table",
  "Key": {
    "uuid": {
      "S": "$context.requestId"
    }
  },
  "Item": {
    "uuid": {
      "S": "$context.requestId"
    },
    "name": {
      "S": "$inputRoot.name"
    },
    "items": {
      "L": [
        #foreach($item in $inputRoot.items)
        {
          "S": "$item"
        }#if($foreach.hasNext),#end
        #end
      ]
    },
    "createdAt": {
      "N": "$context.requestTimeEpoch"
    }
  }
}

进入全屏模式 退出全屏模式

其他想法

  • 使用HTTP_PROXY集成绕过区域锁定网站

  • 将事件泵入 SQS 队列

  • 使用您现有的客户服务解决方案提高 AWS Support 票证

优点

一个简单的 Lambda 乍一看似乎无害,但每个函数都有自己的维护成本,包括:

  • 维护应用程序代码

  • 维护依赖

  • 围绕交付该代码的任何 CI/CD 工具

  • 执行运行时升级

  • 安全扫描

  • 配置监控和警报(例如 CloudWatch)

  • 配置仪器(例如 X 射线)

删除 Lambda 意味着需要更少的资源来维护、测试和支付费用。

延迟也减少了。链中的跳数更少,冷启动的问题消失了。

缺点

然而,这种 Lambdaless 方法有许多缺点需要考虑。可能最明显的是您一次只能与一个服务集成。这限制了简单集成的方法并排除了复杂的逻辑,例如加入。

Velocity 虽然提供了某种级别的控制流例如if/else和循环,以及 AWS 自己的扩展,例如实用程序函数,但它在某种程度上是一种利基语言,并且在使用您的 Lambda 运行时语言时引入了其自身的复杂性选择(例如 JavaScript、Python)。

这种方法也与 API Gateway 紧密耦合。AWS集成类型和请求/响应映射模板方法是 API Gateway 独有的,因此不如 Lambda 应用程序逻辑(更容易从 Lambda 环境本身抽象)可移植。

它还依赖于“低级”AWS API,与相应的 SDK 包装器相比,这些 API 的可访问性较低且通常很少记录。

延伸阅读

  • 使用 Amazon API Gateway 作为 DynamoDB 的代理

  • 使用 AWS API Gateway 和 DynamoDB 的无服务器和 Lambdaless 可扩展 CRUD 数据 API

感谢Callum Vincent阅读本文的草稿。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐