2016-09-16 102 views
1

我試圖按照AWS指南S3和Lambda這裏AWS lambda函數完成請求

http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html

我在手工測試階段之前退出,但我得到「的errorMessage」:「當我嘗試運行測試時,在完成請求之前退出進程「。

在日誌中,失敗點與async.waterfall代碼有關。

當我運行Lambda函數時,它得到我的示例圖像,調整它的大小並將其放入新的S3存儲桶。然後,它看起來像異步試圖找到一個未定義的「nextTask」運行。我以前從未使用異步,所以我不知道如何解決此問題。

的CloudWatch的日誌文件給我這個

2016-09-16T18:36:44.011Z 836d0280-7c3c-11e6-933a-9b5b3a5e8dd8 TypeError: undefined is not a function 
at /var/task/ResizeImages.js:98:13 
at /var/task/node_modules/async/dist/async.js:486:20 
at nextTask (/var/task/node_modules/async/dist/async.js:5008:33) 
at Response.<anonymous> (/var/task/node_modules/async/dist/async.js:5015:17) 
at Response.<anonymous> (/var/task/node_modules/async/dist/async.js:339:31) 
at Response.<anonymous> (/var/task/node_modules/async/dist/async.js:847:20) 
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:355:18) 
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20) 
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10) 
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:615:14) 

安裝異步(和imageMagik),我只是用命令

npm install async gm 

在我的node_modules文件夾。

我使用的示例節點腳本是在這裏,第98行是註釋。

// dependencies 
var async = require('async'); 
var AWS = require('aws-sdk'); 
var gm = require('gm') 
      .subClass({ imageMagick: true }); // Enable ImageMagick integration. 
var util = require('util'); 

// constants 
var MAX_WIDTH = 100; 
var MAX_HEIGHT = 100; 

// get reference to S3 client 
var s3 = new AWS.S3(); 

exports.handler = function(event, context, callback) { 
    // Read options from the event. 
    console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); 
    var srcBucket = event.Records[0].s3.bucket.name; 
    // Object key may have spaces or unicode non-ASCII characters. 
    var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); 
    var dstBucket = srcBucket + "-resized"; 
    var dstKey = "thumb-" + srcKey; 

    // Sanity check: validate that source and destination are different buckets. 
    if (srcBucket == dstBucket) { 
     callback("Source and destination buckets are the same."); 
     return; 
    } 

    // Infer the image type. 
    var typeMatch = srcKey.match(/\.([^.]*)$/); 
    if (!typeMatch) { 
     callback("Could not determine the image type."); 
     return; 
    } 
    var imageType = typeMatch[1]; 
    if (imageType != "jpg" && imageType != "png") { 
     callback('Unsupported image type: ${imageType}'); 
     return; 
    } 

    // Download the image from S3, transform, and upload to a different S3 bucket. 
    async.waterfall([ 
     function download(next) { 
      // Download the image from S3 into a buffer. 
      s3.getObject({ 
        Bucket: srcBucket, 
        Key: srcKey 
       }, 
       next); 
      }, 
     function transform(response, next) { 
      gm(response.Body).size(function(err, size) { 
       // Infer the scaling factor to avoid stretching the image unnaturally. 
       var scalingFactor = Math.min(
        MAX_WIDTH/size.width, 
        MAX_HEIGHT/size.height 
       ); 
       var width = scalingFactor * size.width; 
       var height = scalingFactor * size.height; 

       // Transform the image buffer in memory. 
       this.resize(width, height) 
        .toBuffer(imageType, function(err, buffer) { 
         if (err) { 
          next(err); 
         } else { 
          next(null, response.ContentType, buffer); 
         } 
        }); 
      }); 
     }, 
     function upload(contentType, data, next) { 
      // Stream the transformed image to a different S3 bucket. 
      s3.putObject({ 
        Bucket: dstBucket, 
        Key: dstKey, 
        Body: data, 
        ContentType: contentType 
       }, 
       next); 
      } 
     ], function (err) { 
      if (err) { 
       console.error(
        'Unable to resize ' + srcBucket + '/' + srcKey + 
        ' and upload to ' + dstBucket + '/' + dstKey + 
        ' due to an error: ' + err 
       ); 
      } else { 
       console.log(
        'Successfully resized ' + srcBucket + '/' + srcKey + 
        ' and uploaded to ' + dstBucket + '/' + dstKey 
       ); 
      } 

      callback(null, "message"); 
     } // ------- LINE 98 ----------- 
    ); 
}; 
+0

確保您的「運行」設置爲「node4.3」而不是「的NodeJS」 – idbehold

+0

這是問題,謝謝 – mike

回答

2

發佈可見性答案。

運行時被設定爲的NodeJS而非node4.3