AWS Lambda生成视频缩略图时Mediainfo权限拒绝问题求助
解决AWS Lambda中mediainfo-wrapper的Permission Denied问题
我之前在Lambda里用mediainfo处理视频时也碰到过一模一样的权限问题,给你梳理几个最可能的原因和对应的解决办法:
核心问题:二进制文件本身缺少执行权限
你提到修改了文件夹的权限,但忽略了关键的一点:mediainfo是一个二进制可执行文件,它自身需要+x(执行)权限,而不是仅仅让文件夹有读写权限。你需要单独给这个文件添加执行权限:chmod +x ./node_modules/mediainfo-wrapper/lib/linux64/mediainfo执行完这个命令后再重新打包你的Lambda代码。
打包时权限被丢失
很多人用普通的zip命令打包时,默认不会保留文件的执行权限。你需要用带权限保留参数的命令来打包:zip -r --preserve-permissions lambda.zip .如果是用其他打包工具(比如7-Zip),也要确保开启了保留文件权限的选项,否则Lambda解压后文件会丢失执行权限。
二进制文件与Lambda运行时不兼容
Lambda的运行环境是Amazon Linux 2(或2023),如果mediainfo-wrapper提供的预编译二进制是针对其他Linux发行版(比如Ubuntu)编译的,可能会因为glibc版本差异出现权限或运行错误。这种情况下,你需要:- 在Amazon Linux 2的环境(可以用EC2或本地Docker镜像
amazonlinux:2)里编译mediainfo的二进制文件 - 把编译好的文件替换掉
mediainfo-wrapper包里对应的二进制文件 - 重新打包部署
- 在Amazon Linux 2的环境(可以用EC2或本地Docker镜像
将二进制文件移到/tmp目录执行
Lambda的/task目录是只读的(虽然文件可以有执行权限,但有些场景下会有隐性限制),而/tmp目录是可写且允许执行的。你可以在Lambda函数启动时,把mediainfo复制到/tmp并添加权限,再指定mediainfo-wrapper使用这个路径:const fs = require('fs'); const path = require('path'); const MediaInfo = require('mediainfo-wrapper'); // 复制二进制到/tmp并添加执行权限 const sourcePath = path.join(__dirname, 'node_modules/mediainfo-wrapper/lib/linux64/mediainfo'); const targetPath = '/tmp/mediainfo'; fs.copyFileSync(sourcePath, targetPath); fs.chmodSync(targetPath, 0o755); // 初始化mediainfo时指定自定义路径 const mediaInfo = new MediaInfo({ binary: targetPath });
内容的提问来源于stack exchange,提问作者Katerina
相关产品推荐
相关产品推荐

