解压缩后的大小必须小于 262144000 字节 aws-iot-device-sdk-v2

Unzipped size must be smaller than 262144000 bytes aws-iot-device-sdk-v2

刚刚 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。这似乎根本不对。我们的团队已经安装了一百多个软件包,但其中 none 增加了我们部署的内存大小。这个问题有一些解决方法吗?

是的,解压缩时有 250 MB 的代码和依赖项限制。我们确实提供了一个压缩的代码文件和依赖项,但在后台它会被解压缩。

最佳实践:使 lambda 大小尽可能小并根据流进行编排,而不是在一个 Lambda 中完成所有操作。大尺寸 lambda 确实会影响初始化(冷启动)

解决方法:

  1. 打包时使用缩小的依赖项。打包项目时使用 packaging tool/utilities。
  2. 如果不使用,请尝试删除不需要的依赖项。
  3. 如果用到assets而且很大,就把它们放在S3中使用,而不是放在package中。

如果none这项工作,请将大型依赖项保留在 S3 中并将其加载到 /tmp 目录并使用它。这不是一个好的解决方案,但会起作用。我用它在 Java.

中设置硒依赖项

此外,我对社区的其他解决方案持开放态度。谢谢!

我建议尝试以下几件事:

  1. 用C写的aws-iot-device-sdk-v2直接依赖aws-crt是跨平台的,你可以使用脚本从node_modules/aws-crt/dist/bin.
  2. 中删除未使用平台的二进制文件
  3. 如果您使用 serverless.com 来打包 lambda,则有一个 plugin 也可以帮助减小包的大小,将它与1 可以进一步减小封装尺寸。
  4. aws-iot-device-sdk-v2 依赖项可以移动到 Lambda 层,这将减少 lambda 包的大小。

从另一个角度来看您的问题,我会质疑是否需要从 AWS Lambda 函数内部使用设备 SDK。设备 sdk 通常用于在客户端和 AWS IoT Core 之间建立双向连接,以发布和接收 MQTT 消息。它涉及需要在每次冷启动时重新建立的 TCP/TLS 或 Websocket 连接。这是 Lambda 函数的反模式,尤其是在消息量很大的情况下。

使用 Lambda 函数时,您应该使用 AWS 开发工具包直接发布到 AWS IoT Core:对于 Javascript,它将是 物联网数据平面客户端.

为了通过 Lambda 函数处理 MQTT 消息,您需要依赖 Rules for AWS IoT to relay the messages directly to the processing Lambda function, or, for added reliability and scalability, you can put the message into an Amazon SQS queue or an Amazon Kinesis data stream using the corresponding rule actions 并将它们配置为您的 Lambda 函数的事件源。

我遇到了这样的问题,我意识到我正在使用不同的 NodeJS 版本来做 deployment/build 而不是 application/during development/installation

注意:

这是我从遇到的相同问题中收到的自己的解决方案。 仅适用于使用 NodeJS 的应用程序。