5

私はこの素敵なラムダを作成しました。AWSラムダで問題が発生しました。子プロセスを起動できません

lambdaは、イベントソースでhtmlを使用してイベントを受け取り、html-pdfノードモジュールを使用してそのhtmlをPDFに変換し、そのpdfをs3バケットに渡して、期限切れの署名付きURLを手渡します60秒で

少なくとも、それは起こるべきものです(再び、ローカルで動作します)。ラムダにテストする場合、私は次のエラーを取得する:

{ 
    "errorMessage": "spawn EACCES", 
    "errorType": "Error", 
    "stackTrace": [ 
     "exports._errnoException (util.js:870:11)", 
     "ChildProcess.spawn (internal/child_process.js:298:11)", 
     "Object.exports.spawn (child_process.js:362:9)", 
     "PDF.PdfExec [as exec] (/var/task/node_modules/html-pdf/lib/pdf.js:87:28)", 
     "PDF.PdfToFile [as toFile] (/var/task/node_modules/html-pdf/lib/pdf.js:83:8)", 
     "/var/task/index.js:72:43", 
     "Promise._execute (/var/task/node_modules/bluebird/js/release/debuggability.js:272:9)", 
     "Promise._resolveFromExecutor (/var/task/node_modules/bluebird/js/release/promise.js:473:18)", 
     "new Promise (/var/task/node_modules/bluebird/js/release/promise.js:77:14)", 
     "createPDF (/var/task/index.js:71:19)", 
     "main (/var/task/index.js:50:5)" 
    ] 
} 

は、ここでは、コード自体です(コンパイルされていない、そのための便利な一気のタスクがあります)

if(typeof regeneratorRuntime === 'undefined') { 
    require("babel/polyfill") 
} 

import fs from 'fs' 
import pdf from 'html-pdf' 
import md5 from 'md5' 
import AWS from 'aws-sdk' 
import Promise from 'bluebird' 
import moment from 'moment' 

const tempDir = '/tmp' 
const config = require('./config') 
const s3 = new AWS.S3() 

export const main = (event, context) => { 
    console.log("Got event: ", event) 

    AWS.config.update({ 
     accessKeyId: config.awsKey, 
     secretAccessKey: config.awsSecret, 
     region: 'us-east-1' 
    }) 

    const filename = md5(event.html) + ".pdf" 

    createPDF(event.html, filename).then(function(result) { 
     uploadToS3(filename, result.filename).then(function(result) { 
      getOneTimeUrl(filename).then(function(result) { 
       return context.succeed(result) 
      }, function(err) { 
       console.log(err) 
       return context.fail(err) 
      }) 
     }, function(err) { 
      console.log(err) 
      return context.fail(err) 
     }) 
    }, function(err) { 
     console.log(err) 
     return context.fail(err) 
    }) 
} 

const createPDF = (html, filename) => { 
    console.log("Creating PDF") 
    var promise = new Promise(function(resolve, reject) { 
     pdf.create(html).toFile(filename, function(err, res) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(res) 
      } 
     }) 
    }) 
    return promise 
} 

const uploadToS3 = (filename, filePath) => { 
    console.log("Pushing to S3") 
    var promise = new Promise(function(resolve, reject) { 

     var fileToUpload = fs.createReadStream(filePath) 
     var expiryDate = moment().add(1, 'm').toDate() 

     var uploadParams = { 
      Bucket: config.pdfBucket, 
      Key: filename, 
      Body: fileToUpload 
     } 

     s3.upload(uploadParams, function(err, data) { 
      if(err) { 
       reject(err) 
      } else { 
       resolve(data) 
      } 
     }) 
    }) 
    return promise 
} 

const getOneTimeUrl = (filename) => { 
    var promise = new Promise(function(resolve, reject) { 
     var params = { 
      Bucket: config.pdfBucket, 
      Key: filename, 
      Expires: 60 
     } 

     s3.getSignedUrl('getObject', params, function(err, url) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(url) 
      } 
     }) 
    }) 
    return promise 
} 

は、HTML、PDFファイル内の問題のように思えます。私はPhantomJS(html-pdfが依存している)の問題であると思っていました。https://engineering.fundingcircle.com/blog/2015/04/09/aws-lambda-for-great-victory/しかし、ラムダは最大ジップサイズを50MBにしているので、バイナリのアップロードに問題はありません。

どのような考えですか?

答えて

2

html-pdfはインストール時にいくつかのバイナリをコンパイルする必要があるフードでphantomjsを使用します。あなたの問題はローカルコンパイルされたバイナリを配備していることですが、LambdaにはAmazon Linuxでコンパイルされたバイナリが必要です。

この問題は、Amazon Linuxを実行しているEC2インスタンスで展開パッケージを作成してから、次に展開します。 this tutorialで説明されているように、そこから直接展開します。

同様の問題でthis answerもチェックしてください。

+0

私がクリアになったら、明快な友人のおかげで、これを受け入れることになります – wvm2008

+0

最終的にはうまくいきませんでした。私はec2で自分のコードをビルドしてOKにできました。私はまったく同じエラーで終わります... html-pdfのnode_modulesを見て、それはphantomjs_prebuiltを使っています、それと何か関係があると思いますか? – wvm2008

+0

EC2でコードが動作していますか? phantomjs-prebuiltを使うときは、 'npm rebuild'を呼び出さなければならないかもしれません。 – birnbaum

関連する問題