【问题标题】:imagemin plugin throwing ENOENT error on aws lambdaimagemin 插件在 aws lambda 上引发 ENOENT 错误
【发布时间】:2019-04-06 12:48:33
【问题描述】:

我使用 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))

};

【问题讨论】:

  • 你安装了imagemin-optipng吗?如果是这样,建议你看看这个线程:github.com/panteng/wechat-h5-boilerplate/issues/5
  • @GCSDC :从我的代码中可以看出,我没有使用 gulp-imagemin,我使用的是 imagemin 模块。你能指定 gulp-imagemin 和 imagemin 模块之间的区别吗?
  • 我看到了,还是跟贴里报的错误一样,如果把gulp-imagemin换成imagemin,cmets上的程序可能会解决问题。不确定两者之间有什么区别。我认为gulp-imagemin 只是imagemin 的一个实现,可以用 gulp 运行。

标签: node.js aws-lambda imagemin


【解决方案1】:

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

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

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

这是我所做的时间表:

  1. 使用 Ubuntu 安装和启用 WSL(没什么大不了的,10 分钟顶部,只需关注 Microsofts doc
  2. 以管理员身份打开 Ubuntu 终端 (如果您不以管理员身份运行,它将不允许您在接下来的步骤中正确运行“npm install”)
  3. 确保所有内容都已更新,只需运行 “apt install upgrade”
  4. 通过运行“mkdir your-folder-name创建一个文件夹(或者直接 cd 进入项目的原始文件夹,您可以通过 Shift+RightClick 给定文件夹和选择“在此处打开 Linux Shell”。我更喜欢将其分开以避免弄乱我原来的东西)
  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. 运行“Serverless Deploy”来部署您的项目

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-23
      • 2022-12-16
      • 2021-12-28
      • 1970-01-01
      • 2021-06-26
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      相关资源
      最近更新 更多