2017-08-08 160 views
2

我創建了一個節點快速應用程序,它使用multer將圖像上傳到我的「asset-in」s3存儲桶。在圖像上傳到s3之後,圖像處理lambda函數拍攝圖像,並將其重新調整到另一個s3存儲桶。將圖像從lambda上傳到s3(損壞的文件)

上傳腳本:

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(...); 

我可以運行沒有任何問題在本地主機這個快遞的應用程序,但是當我使用aws-serverless-express運行由拉姆達明確的應用程序,我無法訪問圖像(訪問拒絕)和圖像處理lambda函數給我的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爲節點GraphicsMagick工具和ImageMagick的模塊

我想問題出在快速應用程序中,我使用serverless在aws lambda上運行。也許這是與mda設置有關的問題,它與lambda環境有衝突嗎?順便說一下,我的assetsBucket具有「AmazonS3FullAccess」角色。


UPDATE:

其實我只是發現了,這個問題是不是存取權限的許可,它的確定,公衆訪問被拒絕(SRY爲missleading信息)。當我下載的圖像,這被上傳到我的資產鬥,我不能打開它,並收到以下錯誤代碼:

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

但我只得到,如果我上傳的圖片與此錯誤aws lambda(無服務器),當我在本地運行上傳過程時,一切似乎都與該文件一樣好,所以不知何故當通過lambda上傳文件被損壞時

回答

0

在我的情況下,它是API網關故障,事實證明,您必須啓用二進制支持,否則,lambda函數將永遠不會收到二進制內容:

  1. 轉到你設置ApiGateway端點
  2. 轉到二進制媒體類型
  3. 添加新的二進制類型,並把:圖像/ JPG

此外,如果你的lambda函數是一個VPC和安全的背後組,首先檢查它是否在沒有VPC的情況下運行。