刚刚将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多个软件包,但没有一个软件包将我们部署的内存大小增加这么多。这个问题有解决办法吗?
是的,解压缩时代码和依赖项的限制为250 MB。我们确实提供了一个压缩的代码文件和依赖项,但在幕后它会被解压缩。
最佳实践:保持lambda大小尽可能小,并根据流进行编排,而不是在一个lambda中完成所有操作。大尺寸lambda确实会影响的初始化(冷启动(
解决方法:
- 打包时使用缩小的依赖项。打包项目时使用打包工具/实用程序
- 如果不使用,请尝试删除不需要的依赖项
- 如果使用了巨大的资产,请将它们放在S3中使用,而不是放在包中
如果这些都不起作用,请在S3中保留较大的依赖项,并将其加载到/tmp目录中并使用它。这不是一个好的解决方案,但会起作用。我已经用它在Java中设置了一个硒依赖项。
此外,我对社区的其他解决方案持开放态度。谢谢
我遇到了这样的问题,我意识到我使用了不同的NodeJS版本来进行部署/构建,而不是在应用程序/开发/安装期间使用的版本
注:
这是我从面临的同样问题中得到的自己的解决方案。仅适用于使用NodeJS的应用程序。
我建议尝试几件事:
- 用C编写的
aws-iot-device-sdk-v2
直接依赖aws-crt
是跨平台的,您可以使用脚本从node_modules/aws-crt/dist/bin
中删除未使用平台的二进制文件 - 如果您使用serverless.com来打包lambda,那么有一个插件也可以帮助减小包大小,将其与1结合使用可以进一步减小包大小
aws-iot-device-sdk-v2
依赖项可以移动到Lambda层,这将减小Lambda包的大小
从另一个角度来看您的问题,我会质疑是否需要在AWS Lambda函数中使用设备SDK。设备sdk通常用于在客户端和AWS IoT Core之间建立双向连接,以发布和接收MQTT消息。它涉及TCP/TLS或Websocket连接,需要在每次冷启动时重新建立。这是Lambda函数的反模式,尤其是在消息量很大的情况下。
当使用Lambda函数时,您应该使用AWS SDK直接发布到AWS IoT Core:对于Javascript物联网数据平面客户端。
为了通过Lambda函数处理MQTT消息,您将依赖AWS IoT规则将消息直接中继到处理Lambda函数,或者,为了增加可靠性和可扩展性,您可以使用相应的规则操作将消息放入Amazon SQS队列或Amazon Kinesis数据流,并将其配置为Lambda函数的事件源。