无拉姆达
假设您需要在 API 后面公开一个 JSON 文件。使用 AWS 的无服务器方法,您可能首先会使用如下架构: ...即调用 S3 的 Lambda 前面的 API 网关。或者,您是否知道可以删除 Lambda 并让 API Gateway 直接调用 S3? 这就是我所说的“无Lambda”。它利用 API Gateway 的AWS集成类型,它允许您在没有任何中间应用程序逻辑的情况下公开任何 AWS
假设您需要在 API 后面公开一个 JSON 文件。使用 AWS 的无服务器方法,您可能首先会使用如下架构:
...即调用 S3 的 Lambda 前面的 API 网关。或者,您是否知道可以删除 Lambda 并让 API Gateway 直接调用 S3?
这就是我所说的“无Lambda”。它利用 API Gateway 的AWS
集成类型,它允许您在没有任何中间应用程序逻辑的情况下公开任何 AWS 服务。映射模板使用Velocity模板语言 (VTL) 和JSONPath表达式提供转换请求/响应的粘合剂。
演练
继续上面的 S3 示例,使用 GET 方法创建一个 API 网关,并按照以下内容设置集成请求:
-
选择 AWS 服务类型、区域和 Simple Storage Service (S3)
-
选择GET HTTP方式
-
选择“使用路径覆盖”动作类型
-
在路径覆盖字段中输入对象的
<bucket>/<prefix>
创建一个 IAM 角色,该角色具有对您的<bucket>/<prefix>
具有s3:GetObject
权限的策略以及允许 API 网关假定它的信任关系。现在您需要做的就是切换到测试视图,单击“测试”,您应该会在响应正文中看到 JSON 对象的内容:
示例
模拟集成
以 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阅读本文的草稿。
更多推荐
所有评论(0)