imagemin插件在AWS Lambda上抛出ENOENT错误

时间:2019-04-06 12:48:33

标签: node.js aws-lambda imagemin

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

};

2 个答案:

答案 0 :(得分:1)

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

我尝试了几种不同的解决方案,但最简单、最快的解决方案是安装 Windows Subsystem for Linux 并从 Windows 上的 Ubuntu 终端运行无服务器部署。

问题在于某些软件包依赖于操作系统,这意味着安装在不同操作系统上的相同软件包将产生不同的安装。因此,您的本地构建/运行工作正常,因为您在 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. 运行“无服务器部署”以部署您的项目

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

答案 1 :(得分:0)

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