2015-12-10 10 views
6

Sto lavorando su un lambda che fa uso di moduli (asincrona, richiesta, ecc) codiceImpossibile utilizzare qualsiasi modulo 3rd party con AWS Lambda

Unable to import module 'index': Error 
at Function.Module._resolveFilename (module.js:338:15) 
at Function.Module._load (module.js:280:25) 
at Module.require (module.js:364:17) 
at require (module.js:380:17) 
at Object.<anonymous> (/var/task/index.js:1:63) 
at Module._compile (module.js:456:26) 
at Object.Module._extensions..js (module.js:474:10) 
at Module.load (module.js:356:32) 
at Function.Module._load (module.js:312:12) 
at Module.require (module.js:364:17) 

Esempio:

var 
    AWS = require('aws-sdk'), 
    util = require('util'), 
    request = require('request'); 

exports.handler = function(event, context) { 
    console.log('test'); 
    context.done(); 
}; 

E funziona bene (stampa test) purché non siano richiesti moduli di terze parti (oltre a aws-sdk). Non appena aggiungo una riga come:

require('request') // or async, config and so on 

Non riesce con l'errore sopra riportato. Ho provato a chiamare direttamente questi moduli specificando il percorso completo senza fortuna. È come guardare la directory sbagliata quando si chiama require.

Dumping process.env dei rendimenti console:

PATH: '/usr/local/bin:/usr/bin:/bin', 
LAMBDA_TASK_ROOT: '/var/task', 
LAMBDA_RUNTIME_DIR: '/var/runtime', 
AWS_REGION: 'us-west-2', 
AWS_DEFAULT_REGION: 'us-west-2', 
AWS_LAMBDA_LOG_GROUP_NAME: '/aws/lambda/Thumbnailer', 
AWS_LAMBDA_LOG_STREAM_NAME: '2015/12/10/[$LATEST]3f8ef236195448c88f206634bde6301b', 
AWS_LAMBDA_FUNCTION_NAME: 'Thumbnailer', 
AWS_LAMBDA_FUNCTION_MEMORY_SIZE: '512', 
AWS_LAMBDA_FUNCTION_VERSION: '$LATEST', 
NODE_PATH: '/var/runtime:/var/task:/var/runtime/node_modules', 

Ecco il module stavo lavorando fuori - evidentemente questo utilizzato per lavorare ad un certo punto, ma non fa per me.

Idee? Sento che mi manca qualche configurazione unica per lambda qui.

+0

Puoi descrivere il tuo pacchetto di distribuzione lambda? – James

+0

@James - I file zip (non la cartella). Lambda sembra funzionare bene, non può usare quel modulo. – cyberwombat

+0

Beh, dovrei dire che non genera errori, ma non succede niente dal momento che è solo il callback, quindi forse un altro problema. – cyberwombat

risposta

9

omg che era doloroso ... Risulta che OSX rende la cartella node_modules leggibile solo dall'utente e AWS non può leggerlo. Rendi la cartella node_modules leggibile dal mondo e funziona. Non sono sicuro che tutte le configurazioni OSX reagiscano allo stesso modo. Sto usando nvm che potrebbe essere il colpevole.

Aggiornamento. Ho usato per impostare tutti i file su 0666 ma ho riscontrato problemi con gli eseguibili. Ecco una piccola sceneggiatura che affronterà le cose correttamente. Imposta tutti i file su 0666 a meno che non siano eseguibili o una directory nel cui caso 0777. Eseguire questo all'interno della cartella del progetto (fate attenzione le implicazioni di non farlo!):

Ecco uno script da un question ho postato:

#!/bin/bash 
find . \ 
'(' -perm -0700 -exec chmod 0777 '{}' + ')' -o \ 
'(' -perm -0600 -exec chmod 0666 '{}' + ')' 
+1

Ho appena avuto questo problema ma le autorizzazioni erano già leggibili. Qualche altra idea su causa o correzione? – ken

+2

@ken vedi il commento di James - assicurati di non comprimere una cartella ma singoli file. – cyberwombat

+0

Stavo solo guardando il codice node-lambda e sembra che itera su ogni file nella directory del codice e lo inserisce in un unico zip. In realtà per non-windows viene eseguito lo shell nativo ma lo stesso risultato. Non sembra esserci un'opzione di configurazione, ma in realtà avrei pensato che questo fosse il comportamento corretto. Non è vero? – ken

Problemi correlati