在AWS NodeJS Lambda函数

时间:2016-09-07 20:26:15

标签: node.js amazon-web-services aws-lambda spawn pdftotext

我正在使用节点模块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

2 个答案:

答案 0 :(得分:1)

awsLambda用户代码只访问两个目录。

  1. / var / task
  2. / tmp
  3.   

    所有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中设置它时,它没有效果,所以我会把文件放在路径中已经存在的目录中。