2016-03-02 49 views
0

我在Lambda中有一個函數,只有在對象發生更改時纔會將元數據標題添加到s3上的對象。AWS Lambda函數和S3 - 僅當對象發生更改時才更改S3中的對象的元數據

ContentType: 'application/javascript' 
 
CacheControl: 'max-age=600'

但事實證明,LAMBDA檢查大約100倍桶在秒,不僅如果對象改變了,其成本了很多。

訪問日誌上S3:

b6234e2652b93344f7 aa [02/Mar/2016:11:00:55 +0000] 54.0.0.209 arn:aws:sts::718436:assumed-role/lambda_s3_exec_role/awslambda_642_201609 805 REST.COPY.OBJECT /local.js "PUT /local.js HTTP/1.1" 200 - 234 4404 50 24 "-" "aws-sdk-nodejs/2.2.32 linux/v0.10.36" - 
 
b6234ee5f9cf0344f7 aa [02/Mar/2016:11:00:55 +0000] 54.0.0.209 arn:aws:sts::71836:assumed-role/lambda_s3_exec_role/awslambda_642_209 890005 REST.COPY.OBJECT_GET local.js - 200 - - 4404 - - - - -

功能:

console.log('Loading function'); 
 

 
var aws = require('aws-sdk'); 
 
var s3 = new aws.S3({ apiVersion: '2006-03-01' }); 
 

 
exports.handler = function(event, context) { 
 
    //console.log('Received event:', JSON.stringify(event, null, 2)); 
 

 
    // Get the object from the event and show its content type 
 
    var bucket = event.Records[0].s3.bucket.name; 
 
    var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); 
 
    var params = { 
 
     Bucket: bucket, 
 
     Key: key, 
 
     CopySource: encodeURIComponent(bucket+"/"+key), 
 
     ContentType: 'application/javascript', 
 
     CacheControl: 'max-age=600', 
 
     "Metadata":{ 
 
     }, 
 
     MetadataDirective: 'REPLACE' 
 
    }; 
 
    //s3.getObject(params, function(err, data) { 
 
    s3.copyObject(params, function(err, data) { 
 
     if (err) { 
 
      console.log(err); 
 
      var message = "Error getting object " + key + " from bucket " + bucket + 
 
       ". Make sure they exist and your bucket is in the same region as this function."; 
 
      console.log(message); 
 
      context.fail(message); 
 
     } else { 
 
      console.log('CONTENT TYPE:', data.ContentType); 
 
      context.succeed(data.ContentType); 
 
     } 
 
    }); 
 
};

我需要改變,以便在功能WIL什麼l只有當對象在s3中改變時才工作?

感謝先進!

回答

3

您爲自己創建了一個無限循環錯誤! Lambda函數在對象發生更改時觸發,並且通過更改元數據並使用copyObject更改對象,從而再次加載Lambda函數。您立即達到了100個併發請求的Lambda限制,以確保您現在不必支付一百萬歐元,因爲您編寫了無限循環。

爲了規避這一點,您需要重新考慮您的架構。有多種選擇,但最簡單的是我認爲的這個:

在您的Lambda代碼中,首先執行s3.getObject並檢查您要更改的標頭是否已經存在。如果是這樣,關閉Lambda函數。這樣您每次編輯只執行兩次Lambda函數。不是100%的理想,但對於實際應用而言足夠好。

+0

'while(+1){...}'heh。一個建議是隻獲取對象元數據 - 而不是整個對象。 –