AWS Lambdaにphantomjsノードアプリをデプロイする方法は?

ryanhallcs

小さなLambda関数を一緒に投げて、ヘッドレスブラウジング用のSpookyJS、CasperJS、およびPhantomJSツールチェーンを使用してWebサイトをクロールしました。タスクは非常に単純で、数か月前のある時点でラムダで機能していました。最近、いくつかの変更を加える必要があり、プロジェクトに再度取り組みたいと思いましたが、最初からやり直して、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. npmインストール呼び出しで推奨され、ここで説明されているように、package.jsonとjsファイルをAmazon LinuxEC2インスタンスにアップロードしてコンパイルします
  3. npm installec2インスタンスで実行し、再度実行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)
ryanhallcs

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ハンドラー関数のラムダパスに各ライブラリのそれぞれのビンを追加することで、これを回避しました。

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にデプロイする方法

分類Dev

SpringBootマイクロサービスアプリケーション(RESTful)をサーバーレスとしてAWS Lambdaにデプロイする方法は?

分類Dev

AWS ElasticBeanstalkにdjangoアプリをデプロイする方法

分類Dev

AWS Opsworks:アプリに特定のgitタグをデプロイする方法は?

分類Dev

AWS Fargateでのデプロイをスピードアップする方法は?

分類Dev

AWSでSpringアプリケーションをデプロイする方法は?

分類Dev

AWS LambdaにSpringブートアプリケーションをデプロイする

分類Dev

IntelliJ + AWS Toolkit +サーバーレスアプリ:「Lambdaにデプロイするには、プロジェクト内のハンドラーを見つけることができる必要があります」

分類Dev

AWS EC2にflaskアプリをデプロイする方法-内部サーバーエラー?

分類Dev

AWS Beanstalk-サイトマップをアップロードする方法は?

分類Dev

JavaWebアプリケーションとMongoDBをAWSにデプロイする

分類Dev

AWSに非WebJavaアプリケーションをデプロイする

分類Dev

PHPをバックエンドとしてMySQLをデータベースとしてAWSにAngular5アプリをデプロイする方法

分類Dev

AWS Elastic BeanstalkにMEANスタックアプリをデプロイする方法は?

分類Dev

ノードを使用してAWSサーバーに画像をアップロードする方法

分類Dev

コマンドフォルダー内のgolangアプリをAWS Beanstalkにデプロイする

分類Dev

Nuxt SSRアプリケーションをAWSにデプロイすることは可能ですか?

分類Dev

AWS CloudFormationアプリケーションロードバランサー-HTTPリスナーをHTTPSリスナーにリダイレクトする方法は?

分類Dev

AWS Lambdaベースのアプリケーションをデプロイするために複数のmain.goファイルを持っている

分類Dev

MySQL DockerイメージをAWS ECSにデプロイする方法は?

分類Dev

AWSにKubernetesをデプロイする方法は?

分類Dev

NestJS-aws s3に画像をアップロードする方法は?

分類Dev

AWSにアプリケーションを自動デプロイするための最良の方法は何ですか?

分類Dev

AWS ElasticBeanstalkにデプロイされたASP.NETアプリのアプリプールIDを設定する方法

分類Dev

AWS ElasticBeanstalkにデプロイされたASP.NETアプリのアプリプールIDを設定する方法

分類Dev

AWS Lambdaを複数のリージョンにデプロイしますか?

分類Dev

AWS Lambdaを複数のリージョンにデプロイしますか?

分類Dev

aws s3にhtmlローカルプロジェクトをアップロードする方法は?

分類Dev

AWSクラウドフロントにAngularアプリをデプロイする

Related 関連記事

  1. 1

    ノード/エクスプレスアプリケーションをAWSにデプロイする方法

  2. 2

    SpringBootマイクロサービスアプリケーション(RESTful)をサーバーレスとしてAWS Lambdaにデプロイする方法は?

  3. 3

    AWS ElasticBeanstalkにdjangoアプリをデプロイする方法

  4. 4

    AWS Opsworks:アプリに特定のgitタグをデプロイする方法は?

  5. 5

    AWS Fargateでのデプロイをスピードアップする方法は?

  6. 6

    AWSでSpringアプリケーションをデプロイする方法は?

  7. 7

    AWS LambdaにSpringブートアプリケーションをデプロイする

  8. 8

    IntelliJ + AWS Toolkit +サーバーレスアプリ:「Lambdaにデプロイするには、プロジェクト内のハンドラーを見つけることができる必要があります」

  9. 9

    AWS EC2にflaskアプリをデプロイする方法-内部サーバーエラー?

  10. 10

    AWS Beanstalk-サイトマップをアップロードする方法は?

  11. 11

    JavaWebアプリケーションとMongoDBをAWSにデプロイする

  12. 12

    AWSに非WebJavaアプリケーションをデプロイする

  13. 13

    PHPをバックエンドとしてMySQLをデータベースとしてAWSにAngular5アプリをデプロイする方法

  14. 14

    AWS Elastic BeanstalkにMEANスタックアプリをデプロイする方法は?

  15. 15

    ノードを使用してAWSサーバーに画像をアップロードする方法

  16. 16

    コマンドフォルダー内のgolangアプリをAWS Beanstalkにデプロイする

  17. 17

    Nuxt SSRアプリケーションをAWSにデプロイすることは可能ですか?

  18. 18

    AWS CloudFormationアプリケーションロードバランサー-HTTPリスナーをHTTPSリスナーにリダイレクトする方法は?

  19. 19

    AWS Lambdaベースのアプリケーションをデプロイするために複数のmain.goファイルを持っている

  20. 20

    MySQL DockerイメージをAWS ECSにデプロイする方法は?

  21. 21

    AWSにKubernetesをデプロイする方法は?

  22. 22

    NestJS-aws s3に画像をアップロードする方法は?

  23. 23

    AWSにアプリケーションを自動デプロイするための最良の方法は何ですか?

  24. 24

    AWS ElasticBeanstalkにデプロイされたASP.NETアプリのアプリプールIDを設定する方法

  25. 25

    AWS ElasticBeanstalkにデプロイされたASP.NETアプリのアプリプールIDを設定する方法

  26. 26

    AWS Lambdaを複数のリージョンにデプロイしますか?

  27. 27

    AWS Lambdaを複数のリージョンにデプロイしますか?

  28. 28

    aws s3にhtmlローカルプロジェクトをアップロードする方法は?

  29. 29

    AWSクラウドフロントにAngularアプリをデプロイする

ホットタグ

アーカイブ