5

तो मैं इस अच्छी छोटी लैम्ब्डा है, जो स्थानीय स्तर पर महान चलाता बना लिया अंडे नहीं कर सकते हैं, फिर भी नहीं इतना।अनुमतियां मुसीबत, जब वास्तव में जंगली में बाहर बच्चे प्रक्रिया

लैम्ब्डा, घटना स्रोत में एचटीएमएल के साथ एक घटना लेता है, धर्मान्तरित कि एक पीडीएफ के एचटीएमएल (HTML-पीडीएफ नोड मॉड्यूल का उपयोग कर), एक S3 बाल्टी है कि पीडीएफ गुजरता है, और फिर वापस हाथ एक हस्ताक्षरित यूआरएल है कि समय सीमा समाप्त 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-पीडीएफ के भीतर एक समस्या की तरह लगता है। मैंने सोचा था कि यह कुछ पठन के कारण फैंटॉमजेएस (जो एचटीएमएल-पीडीएफ निर्भर करता है) के साथ एक समस्या हो सकती है: https://engineering.fundingcircle.com/blog/2015/04/09/aws-lambda-for-great-victory/, हालांकि, चूंकि लैम्ब्डा ने अधिकतम ज़िप आकार को 50 एमबी तक बढ़ा दिया है, मुझे बाइनरी अपलोड करने में कोई समस्या नहीं है ।

किसी भी विचार?

उत्तर

2

html-पीडीएफ हुड, जो जब स्थापित किया जा रहा कुछ बाइनरी संकलित करने के लिए की जरूरत है के तहत phantomjs उपयोग करता है। मुझे लगता है कि आपकी समस्या यह है कि आप उन स्थानीय रूप से संकलित बाइनरी तैनात कर रहे हैं लेकिन लैम्ब्डा को अमेज़ॅन लिनक्स पर संकलित बाइनरी की आवश्यकता है।

आप एक EC2 उदाहरण पर अपनी तैनाती पैकेज का निर्माण है कि अमेज़न लिनक्स जैसे चल रहा है और फिर से इस समस्या को हल कर सकते हैं सीधे इसे वहां से तैनात करें जैसे कि इसे this tutorial में समझाया गया है।

भी एक ऐसी ही समस्या पर this answer की जाँच करें।

+0

इस बाहर की कोशिश कर रहा है, एक बार मैं अच्छी तरह से स्पष्ट में हूँ, स्पष्टता दोस्त – wvm2008

+0

के लिए धन्यवाद अंत बात नहीं बनी है, स्वीकार करेंगे ... मैं EC2 पर अपने कोड का निर्माण और ठीक को तैनात करने में सक्षम था, लेकिन मैं एक ही त्रुटि के साथ समाप्त होता हूं ... html-pdf के node_modules में देख रहा है, यह phantomjs_prebuilt का उपयोग कर रहा है, लगता है कि इसके साथ कुछ करने के लिए हो सकता है? – wvm2008

+0

क्या कोड ईसी 2 पर काम कर रहा है? Phantomjs-prebuilt का उपयोग करते समय आपको 'npm rebuild' को कॉल करना पड़ सकता है। – birnbaum

संबंधित मुद्दे