我正在使用节点模块pdf-to-text作为我的Nodejs lambda函数,但我得到了一个" spawn pdftotext ENOENT
"错误。我尝试启动AWS EC2实例并使用this script在那里编译poppler。我设法在S3上获得一个tar.gz文件,其中包含一个popplar文件,其中包含一个bin和lib文件夹。
但是,当我引用放在bin文件夹中的poppler文件时,如下所示:
process.env['PATH'] = process.env['PATH'] + ':' + path.join(process.env['LAMBDA_TASK_ROOT'], '/bin/poppler');
那不起作用。我收到spawn ENOTDIR
错误。然后我解压缩它并尝试引用文件中的bin文件夹:' bin / bin'但我收到spawn EACCES
错误。
我尝试直接引用" bin / pdftotext"并且再次出现spawn ENOTDIR
错误。
有没有人有幸把这个库放在lambda函数中?
TL; DR,我想在我的lambda函数中运行命令spawn('pdftotext')
。
取得了一些进展,我在poppler文件夹上做了一个chmod,现在我收到了这个错误:
Error: pdf-text-extract command failed: pdftotext: error while loading shared libraries: libpoppler.so.56: cannot open shared object file: No such file or directory
答案 0 :(得分:1)
awsLambda用户代码只访问两个目录。
所有lambda函数都将源代码保存在/ var / task
上
在您的代码中,使用此路径中的任何一个而不是当前目录路径 “/ bin / poppler” 。像这样
process.env['PATH'] = process.env['PATH'] + ':' + path.join(process.env['LAMBDA_TASK_ROOT'], '/bin/poppler');
答案 1 :(得分:1)
运行ldd pdftotext
以查看您需要包含在LAMBDA_TASK_ROOT/lib
目录下的lambda部署包中的静态链接库列表。
例如,我在运行时看到了这个:
linux-vdso.so.1 => (0x00007ffc2e998000)
libjpeg.so.62 => /usr/lib64/libjpeg.so.62 (0x00007f6a7d732000)
libopenjpeg.so.2 => /usr/lib64/libopenjpeg.so.2 (0x00007f6a7d512000)
libfontconfig.so.1 => /home/ec2-user/tmp/usr/lib/libfontconfig.so.1 (0x00007f6a7d2d0000)
libxml2.so.2 => /home/ec2-user/tmp/usr/lib/libxml2.so.2 (0x00007f6a7cf6c000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6a7cd67000)
libfreetype.so.6 => /home/ec2-user/tmp/usr/lib/libfreetype.so.6 (0x00007f6a7cab4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6a7c898000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f6a7c592000)
libm.so.6 => /lib64/libm.so.6 (0x00007f6a7c290000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6a7c07a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6a7bcb5000)
libz.so.1 => /lib64/libz.so.1 (0x00007f6a7ba9f000)
/lib64/ld-linux-x86-64.so.2 (0x00005559f0a32000)
基本lambda AMI中尚未包含的任何内容可能需要复制到LAMBDA_TASK_ROOT/lib
目录中才能运行pdftotext
(在我的情况下,所有内容都指向/home/ec2-user/tmp/*
)。您的错误明确提到libpoppler.so.56
,因此您需要找到您的构建并将该文件包含在此目录中。
docs提到你可以调整的LD_LIBRARY_PATH
环境变量,这样你就可以将文件放在不同的地方,但是当我尝试在lambda中设置它时,它没有效果,所以我会把文件放在路径中已经存在的目录中。