0

我使用 imangemin 和 imagemin-optipng nodejs 插件在 aws 上创建了一个 lambda 函数,但它返回以下错误:

错误:产生/var/task/node_modules/optipng-bin/vendor/optipng ENOENT

var aws = require('aws-sdk');
var s3 = new aws.S3()
var Imagemin = require('imagemin');
var optipng = require('imagemin-optipng');

exports.handler = function(event, context, callback){
    var srcBucket = event.Records[0].s3.bucket.name;

    var srcKey = 
    decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    var params = {Bucket: srcBucket, Key: srcKey};

    s3.getObject(params).promise()
    .then(data => Imagemin.buffer(data.Body, {
             plugins: [
                optipng({ optimizationLevel: 7 })
             ]
        })
    )
    .then(buffer => 
    console.log('done ', buffer)
)
.catch(err => callback(err))

};
4

2 回答 2

1

我昨天在 AWS Lambda 上遇到了类似的问题。如果有人也面临它,并且开发环境是 Windows,那么我相信这就是你的解决方案。(请注意,在我的示例中,我使用无服务器框架进行构建和部署,但是,无论使用无服务器,该原理都应该有效)

我尝试了几种不同的解决方案,但最简单和最快的解决方案是安装适用于 Linux 的 Windows 子系统并从 Windows 上的 Ubuntu 终端运行 Serverless Deploy。

问题是某些软件包依赖于操作系统,这意味着安装在不同操作系统上的相同软件包将产生不同的安装。因此,您的本地构建/运行工作正常,因为您在 Windows 环境中安装了程序包,并且在 Windows 环境中运行程序包代码,但是,当您部署到 AWS 时,它现在在 Amazon Linux 上运行,并且您的程序包依赖于操作系统(像 mozjpeg、jpegtran 等)在运行期间会失败。所以你最好的办法是从 Linux 环境中安装包、构建部署你的项目(不确定是否所有的 Linux 发行版都适合这个声明,但 Ubuntu 肯定适合)

这是我所做的时间表:

  1. 使用 Ubuntu 安装并启用 WSL (没什么大不了的,最多 10 分钟,只需遵循Microsoft 的文档
  2. 以管理员身份 打开 Ubuntu 终端(如果您不以管理员身份运行,它将不允许您在接下来的步骤中正确运行“npm install”)
  3. 确保所有内容都已更新,只需运行“apt install upgrade”
  4. 通过运行“mkdir your-folder-name ”创建一个文件夹(或者直接 cd 进入项目的原始文件夹,您可以通过 Shift+RightClick 给定文件夹并选择“Open Linux Shell Here”来完成。我更喜欢将它分开以免弄乱我原来的东西)
  5. 通过运行“cd your-folder-name ”进入新创建的文件夹
  6. 将您的存储库克隆到该文件夹​​中,或者只是手动复制/粘贴它(要从 Windows 上的 Ubuntu 终端打开当前文件夹,只需运行“explorer.exe”。)
  7. 从 Ubuntu 终端运行旧的“npm install”
  8. 现在这是一个陷阱,如果您的 .env 文件中有 AWS KEYS/ SECRETS,并且您将serverless.yml文件设置为使用 .env 文件中的环境变量,那么如果您没有.env 文件就位(您只会在 CloudWatch 上看到真正的错误,因为浏览器中控制台记录的错误将是 CORS 错误)
  9. 运行“无服务器部署”以部署您的项目

而已。我花了大约 20 分钟来执行这个解决方案,而其他解决方案,即使有些是有效的(如 CodeBuild),更令人困惑,因此更耗时。

于 2020-12-21T10:05:21.970 回答
0

尝试重新安装 optipng-bin 模块。或者node ./node_modules/optipng-bin/lib/install.js

于 2020-04-18T03:10:23.050 回答