如何在AWS Lambda上部署phantomjs节点应用程序?

瑞安哈尔奇

我将一个小的Lambda函数组合在一起,使用SpookyJS,CasperJS和PhantomJS工具链对网站进行了无头浏览。这项任务非常简单,几个月前的某个时候,它正在Lambda上工作。我最近不得不改变一些事情,想再次进行该项目,但是刚开始时又遇到了让Lambda运行而又没有任何容量错误的问题。我的问题是如何在Lambda中运行phantomjs

我正在运行的示例代码是:

spooky.start('http://en.wikipedia.org/wiki/Spooky_the_Tuff_Little_Ghost');
spooky.then(function () {
    this.emit('hello', 'Hello, from ' + this.evaluate(function () {
        return document.title;
    }));
});
spooky.run();

我在Lambda中遇到的错误是:

{ [Error: Child terminated with non-zero exit code 1] details: { code: 1, signal: null } }

我遵循了各种过程,以确保所有内容都可以在Lambda上运行。以下是我尝试诊断的一长串内容:

  1. 使用本地运行node index.js并确认其正常运行
  2. 将package.json和js文件上传到Amazon Linux EC2实例,以进行npm安装调用的建议进行编译,并在此处进行了描述
  3. 运行npm install在EC2实例,并再次运行node index.js,以确保正确的输出
  4. 压缩所有内容,然后使用cli部署到AWS

我的package.json是:

{
  "name": "lambda-spooky-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "casperjs": "^1.1.3",
    "phantomjs-prebuilt": "^2.1.10",
    "spooky": "^0.2.5"
  }
}

我还尝试了以下操作(大多数也可以在本地和AWS EC2实例上工作,但是在Lambda上存在相同的错误:

  1. 尝试幻影的非预构建版本
  2. 确保从以下路径可访问casperjs和phantomjs process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'] + ':' + process.env['LAMBDA_TASK_ROOT'] + '/node_modules/.bin'; console.log( 'PATH: ' + process.env.PATH );
  3. 通过包装child_process的.spawn()调用来检查生成的调用,并得到以下信息:

    { '0': 'casperjs',
      '1': 
       [ '/var/task/node_modules/spooky/lib/bootstrap.js',
         '--transport=http',
         '--command=casperjs',
         '--port=8081',
         '--spooky_lib=/var/task/node_modules/spooky/lib/../',
         '--spawnOptions=[object Object]' ],
      '2': {} }
    
  4. 直接调用.exec('casperjs').exec('phantomjs --version')确认它可以在本地和EC2上运行,但是在Lambda中收到以下错误。命令:

    `require('child_process').exec('casperjs', (error, stdout, stderr) => {
    if (error) { console.error('error: ' + error); }
       console.log('out: ' + stdout);
       console.log('err: ' + stderr);
    });
    

两者都具有以下结果:

err: Error: Command failed: /bin/sh -c casperjs
module.js:327
    throw err;
    ^

Error: Cannot find module '/var/task/node_modules/lib/phantomjs'
    at Function.Module._resolveFilename (module.js:325:15)
    at Function.Module._load (module.js:276:25)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/var/task/node_modules/.bin/phantomjs:16:15)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)

2016-08-07T15:36:37.349Z    b9a1b509-5cb4-11e6-ae82-256a0a2817b9    sout: 
2016-08-07T15:36:37.349Z    b9a1b509-5cb4-11e6-ae82-256a0a2817b9    serr: module.js:327
    throw err;
    ^

Error: Cannot find module '/var/task/node_modules/lib/phantomjs'
    at Function.Module._resolveFilename (module.js:325:15)
    at Function.Module._load (module.js:276:25)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/var/task/node_modules/.bin/phantomjs:16:15)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
瑞安哈尔奇

我发现问题是node_modules/.bin在路径中包含,在本地和ec2机器上都可以使用,因为这些文件只是指向/bin每个各自库中的操作文件夹。如果这些文件中的调用使用相对路径,则会中断。问题:

[ec2-user@ip-172-31-32-87 .bin]$ ls -lrt
total 0
lrwxrwxrwx 1 ec2-user ec2-user 35 Aug  7 00:52 phantomjs -> ../phantomjs-prebuilt/bin/phantomjs
lrwxrwxrwx 1 ec2-user ec2-user 24 Aug  7 00:52 casperjs -> ../casperjs/bin/casperjs

我通过在Lambda处理函数中将每个库的相应bin添加到lambda路径来解决此问题:

process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT'] 
        + ':' + process.env['LAMBDA_TASK_ROOT'] + '/node_modules/phantomjs-prebuilt/bin'
        + ':' + process.env['LAMBDA_TASK_ROOT'] + '/node_modules/casperjs/bin';

现在,这将在Lambda中正确运行幻影,卡斯珀和怪异。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 AWS 上部署 lambda 应用程序

来自分类Dev

如何在 openshift 上部署节点应用程序并运行它?

来自分类Dev

如何在AWS Elastic Beanstalk上部署结构化Flask应用程序

来自分类Dev

如何在 AWS 弹性 beantalk 上部署 MEAN 堆栈应用程序?

来自分类Dev

如何在weblogic群集上部署Web应用程序

来自分类Dev

如何在Openshift上部署战争和应用程序

来自分类Dev

如何在cpanel上部署nextjs应用程序?

来自分类Dev

如何在ubuntu上部署Play框架应用程序?

来自分类Dev

如何在IIS上部署WCF服务应用程序

来自分类Dev

在AWS Cloudfront上部署角度应用程序

来自分类Dev

在AWS beantalk上部署Spray应用程序

来自分类Dev

在AWS Beanstalk上部署Spray应用程序

来自分类Dev

在作为Instagram副本的AWS上部署应用程序

来自分类Dev

在AWS上部署Flask应用程序时处理密钥

来自分类Dev

如何在 AWS EC2 上部署 Flask 应用程序 - 内部服务器错误?

来自分类Dev

如何使用appscale在群集上部署应用程序?

来自分类Dev

如何使用 Bitbucket 管道在 AWS ElasticBeanstalk 上部署基于 Java Maven 的应用程序?

来自分类Dev

如何在连接到远程系统的设备上部署和执行应用程序?

来自分类Dev

如何在Amazon Kinesis服务上部署和运行Amazon Kinesis应用程序

来自分类Dev

如何在本地tomcat服务器上部署angular2应用程序?

来自分类Dev

如何在Heroku上部署安全(HTTPS)流星应用程序?

来自分类Dev

如何在MAC OS X机器上部署GTK#应用程序

来自分类Dev

在设备上部署后,该应用程序如何在sencha touch上运行?

来自分类Dev

如何在Windows Azure上部署Ruby on Rails应用程序?

来自分类Dev

如何在tc服务器上部署我的Web应用程序?

来自分类Dev

如何在符合LGPL的Linux上部署Qt5应用程序?

来自分类Dev

如何在Windows PC(Windows 7 / Windows 8)上部署Rails应用程序?

来自分类Dev

如何在OpenShift或Git上部署Java Web应用程序?

来自分类Dev

如何在App Engine(GCP)上部署Streamlit应用程序?

Related 相关文章

  1. 1

    在 AWS 上部署 lambda 应用程序

  2. 2

    如何在 openshift 上部署节点应用程序并运行它?

  3. 3

    如何在AWS Elastic Beanstalk上部署结构化Flask应用程序

  4. 4

    如何在 AWS 弹性 beantalk 上部署 MEAN 堆栈应用程序?

  5. 5

    如何在weblogic群集上部署Web应用程序

  6. 6

    如何在Openshift上部署战争和应用程序

  7. 7

    如何在cpanel上部署nextjs应用程序?

  8. 8

    如何在ubuntu上部署Play框架应用程序?

  9. 9

    如何在IIS上部署WCF服务应用程序

  10. 10

    在AWS Cloudfront上部署角度应用程序

  11. 11

    在AWS beantalk上部署Spray应用程序

  12. 12

    在AWS Beanstalk上部署Spray应用程序

  13. 13

    在作为Instagram副本的AWS上部署应用程序

  14. 14

    在AWS上部署Flask应用程序时处理密钥

  15. 15

    如何在 AWS EC2 上部署 Flask 应用程序 - 内部服务器错误?

  16. 16

    如何使用appscale在群集上部署应用程序?

  17. 17

    如何使用 Bitbucket 管道在 AWS ElasticBeanstalk 上部署基于 Java Maven 的应用程序?

  18. 18

    如何在连接到远程系统的设备上部署和执行应用程序?

  19. 19

    如何在Amazon Kinesis服务上部署和运行Amazon Kinesis应用程序

  20. 20

    如何在本地tomcat服务器上部署angular2应用程序?

  21. 21

    如何在Heroku上部署安全(HTTPS)流星应用程序?

  22. 22

    如何在MAC OS X机器上部署GTK#应用程序

  23. 23

    在设备上部署后,该应用程序如何在sencha touch上运行?

  24. 24

    如何在Windows Azure上部署Ruby on Rails应用程序?

  25. 25

    如何在tc服务器上部署我的Web应用程序?

  26. 26

    如何在符合LGPL的Linux上部署Qt5应用程序?

  27. 27

    如何在Windows PC(Windows 7 / Windows 8)上部署Rails应用程序?

  28. 28

    如何在OpenShift或Git上部署Java Web应用程序?

  29. 29

    如何在App Engine(GCP)上部署Streamlit应用程序?

热门标签

归档