itty-aws
这是一个使用代理的微小AWS SDK TypeScript实现,将所有服务和API都压缩到约49 KB内。该名称是对出色的itty-router的致敬。
🛠 这是一个高度实验性的API,请勿用于任何严肃的用途。
支持的API
已知可用:
- ✅ 任何使用普通JSON协议的现代API应该都可以直接使用。
- ✅ DynamoDB
- ✅ EventBridge
- ✅ SQS
- ✅ S3
CreateBucket
、GetObject
、HeadObject
、PutObject
、DeleteObject
、ListObjectsV2
- ⛔️ S3的其余API可能由于XML API的不一致性而无法工作。
- ⛔️ SNS(参见:#2)
为什么?
我们希望有一个轻量级的AWS SDK,不影响Lambda的冷启动时间,并且具有标准的API设计。AWS SDK v3为了减少包大小而牺牲了可用性,引入了client.send(Command)
,但仍未实现轻量级体验。这些都是不必要的 - 我们可以鱼和熊掌兼得!
AWS SDK v3的问题
本项目旨在解决官方AWS SDK的以下问题:
- 随着代码使用更多AWS API,包大小和冷启动时间会恶化
- 某些API过于庞大(比如S3)
- 依赖Lambda环境提供的AWS SDK也并不总能节省时间,因为仅仅require/import它就需要时间,因为代码太大
- 在不影响性能的情况下,恢复
client.apiName(..)
设计(例如,使用dynamo.getItem(..)
而不是dynamo.send(GetItemCommand)
)
状态
整个AWS SDK(包括所有服务和API)的大小为:
- 压缩后的包大小:22 KB
- 未压缩的包大小:32 KB
💪 有可能进一步减小这个大小。
安装
npm install itty-aws
使用
从itty-aws
导入顶级AWS
对象,并为你想要的服务实例化一个客户端。SDK的大小是恒定的,所以你的性能不会受到AWS服务数量或选择的影响。API是客户端上的方法 - 就像AWS SDK v2一样,只是不需要.promise()
。
import { AWS } from "itty-aws";
const ddb = new AWS.DynamoDB();
const response = await ddb.getItem({
TableName,
Key: {
pk: {
S: "key",
},
},
});
console.log(response.Item);
如何实现?
我们没有像AWS那样为SDK生成庞大的类和函数,而是根据AWS SDK v2生成类型声明,并使用代理为所有客户端提供通用实现。你可以在./src/index.ts中找到这个文件。
已知问题
- 尚未测试性能 - 我们使用的
https
或fetch
可能比AWS SDK使用的魔法方法慢。 - 我们仍然从AWS SDK导入一些重量级代码来签名请求 - 包括tslib(不知道为什么)。我们应该研究手动替换这些依赖项,或至少将它们最小化。