【问题标题】:Unzipped size must be smaller than 262144000 bytes aws-iot-device-sdk-v2解压后的大小必须小于 262144000 字节 aws-iot-device-sdk-v2
【发布时间】:2021-09-22 23:54:41
【问题描述】:
刚刚将aws-iot-device-sdk-v2 安装到我的 lambda 集群中。我能够将包很好地安装到项目中。不幸的是,我收到了错误An error occurred: exampleLambda - Resource handler returned message: "Unzipped size must be smaller than 262144000 bytes (Service: Lambda, Status Code: 400, Request ID: ... 查看无服务器,我看到包含将我的包大小从 36MB 增加到 92MB。这似乎根本不对。我们的团队已经安装了 100 多个包,但没有一个包使我们部署的内存大小增加了这么多。这个问题有解决办法吗?
【问题讨论】:
标签:
amazon-web-services
aws-lambda
serverless
aws-iot
【解决方案1】:
是的,解压缩后的代码和相关内容有 250 MB 的限制。我们确实提供了一个压缩的代码文件以及相关文件,但在后台它会被解压缩。
最佳实践:保持 lambda 的大小尽可能小,并根据流程进行编排,而不是在一个 Lambda 中完成所有操作。大尺寸的 lambda 确实会影响初始化(冷启动)
解决方法:
- 在包装时使用缩小版面。在打包项目时使用打包工具/实用程序。
- 如果不使用,请尝试删除不需要的 depandancies。
- 如果资产被使用并且体积很大,请将它们放在 S3 中并使用它们,而不是将它们放在包中。
如果这些都不起作用,请保留 S3 中的大型 depandacies 并将其加载到 /tmp 目录并使用它。这不是一个好的解决方案,但会起作用。我已经用它在 Java 中建立了一个 selenium depandacies。
另外,我愿意接受来自社区的其他解决方案。谢谢!
【解决方案2】:
我建议尝试几件事:
- 用C语言编写的
aws-iot-device-sdk-v2直接依赖aws-crt是跨平台的,您可以使用脚本从node_modules/aws-crt/dist/bin中删除未使用平台的二进制文件。
- 如果您使用 serverless.com 来打包 lambda,则有一个 plugin 也可以帮助减小包大小,将其与 1 结合使用可以进一步减小包大小。
-
aws-iot-device-sdk-v2 依赖可以移动到 Lambda 层,这将减少 lambda 包的大小。
【解决方案3】:
从另一个角度来看您的问题,我会质疑是否需要从 AWS Lambda 函数内部使用设备开发工具包。设备 sdk 通常用于在客户端和 AWS IoT Core 之间建立双向连接,以发布和接收 MQTT 消息。它涉及需要在每次冷启动时重新建立的 TCP/TLS 或 Websocket 连接。这是 Lambda 函数的反模式,尤其是在消息量很大的情况下。
使用 Lambda 函数时,您应该使用 AWS 开发工具包直接发布到 AWS IoT Core:对于 Javascript,它将是
IoT Data Plane Client。
为了通过 Lambda 函数处理 MQTT 消息,您可以改为依靠 Rules for AWS IoT 将消息直接中继到处理 Lambda 函数,或者,为了增加可靠性和可扩展性,您可以将消息放入 Amazon SQS 队列或使用相应 rule actions 的 Amazon Kinesis 数据流,并将它们配置为您的 Lambda 函数的事件源。
【解决方案4】:
我遇到了这样的问题,我意识到我正在使用不同的 NodeJS 版本来进行部署/构建,而不是在应用程序中/在开发/安装期间使用的版本
注意:
这是我从面临的相同问题中收到的自己的解决方案。
仅适用于使用 NodeJS 的应用程序。