2017-08-08 3 views
2

J'ai créé une application de noeud express qui utilise multer pour télécharger des images dans mon compartiment s3 "assets-in". Une fois les images téléchargées sur s3, une fonction de traitement d'image lambda prend l'image et la redimensionne dans un autre compartiment s3.chargement de l'image de lambda vers s3 (fichier corrompu)

script d'upload:

var assetsBucketIn = new AWS.S3({ 
    accessKeyId  : "...", 
    secretAccessKey : "...", 
    region   : "...", 
    params : { 
    Bucket : "..." 
    } 
}); 

var uploadAssets  = multer({inMemory : true}); 
var imgFieldSettings = [ 
    { 
    name  : 'uploadFiles', 
    maxCount : 7 
    } 
]; 

router.post('/images', uploadAssets.fields(imgFieldSettings), (req, res, next) => { 
    ... 
    uploadPromises = []; 
    for(let i = 0; i < req.files.uploadFiles.length; i++){ 
    let params = { 
     Key : path.join(srcPath, srcName), 
     Body : req.files.uploadFiles[i].buffer 
    }; 
    let uploadPromise = assetsBucketIn.upload(params).promise(); 
    uploadPromises.push(uploadPromise); 
    } 

    Promise.all(uploadPromises) 
    .then(...).catch(...); 

je peux exécuter cette application expresse sur le localhost sans aucun problème, mais quand je suis en cours d'exécution de l'application expresse lambda à l'aide aws-serverless-express, je ne peux pas accéder à l'image (accès privés) et les fonctions de traitement d'image lambda me donne l'erreur du journal follwoing:

TypeError: Cannot read property 'width' of undefined at gm. (/var/task/index.js:103:50) at emitMany (events.js:127:13) at gm.emit (events.js:201:7) at gm. (/var/task/node_modules/gm/lib/getters.js:70:16) at cb (/var/task/node_modules/gm/lib/command.js:322:16) at ChildProcess.onExit (/var/task/node_modules/gm/lib/command.js:305:9) at emitTwo (events.js:106:13) at ChildProcess.emit (events.js:191:7) at maybeClose (internal/child_process.js:886:16) at Socket. (internal/child_process.js:342:11)

gm est le module GraphicsMagick et ImageMagick pour le noeud

Je suppose que le problème est dans l'application express, que je cours sur aws lambda en utilisant serverless. Peut-être que c'est un problème avec les paramètres de multer, qui entrent en conflit avec l'environnement lambda? mon assetsBucket a le rôle "AmazonS3FullAccess" en passant.


MISE À JOUR:

En fait, je viens de découvrir que le problème n'est pas l'autorisation d'accès, il est ok, que l'accès du public se refuser (dsl pour cette information missleading). Lorsque je télécharge l'image, qui obtient téléchargé sur mon seau d'actifs, je ne peux pas l'ouvrir et obtenir le code d'erreur suivant:

Error interpreting JPEG image file (Not a JPEG file: starts with 0xef 0xbf)

Mais je reçois cette erreur que si je télécharger les photos avec aws lambda (Serverless), quand je courais le processus de téléchargement sur place, tout semble être bien avec le fichier, alors en quelque sorte le fichier est corrompu lors du téléchargement via lambda

Répondre

0

Dans mon cas, il était API défaut Gateway, il s'avère que vous devez activer le support binaire, sinon, la fonction lambda ne recevra jamais le contenu binaire:

  1. Accédez aux paramètres de vous ApiGateway point final
  2. Aller à binaire Types de support
  3. Ajouter un nouveau type binaire et mis: image/jpg

Aussi, si votre fonction Lambda est derrière un VPC et la sécurité groupe, vérifiez d'abord si cela fonctionne sans VPC d'abord.