2016-04-05 39 views
0

Amazon Lambda'yı anlamak için çalışıyorum. Bu, yüklenen dosyanın içerik türünü görüntülemek için s3 şablonundan sadece biraz değiştirilir.AWS Lambda s3 nesne veri şablonunu çalıştırmıyor

Alınan olay günlüğüm, ve paramlar günlüğünün her ikisi de bulut saatinde görünmesine rağmen s3.getObject() gibi hiçbir zaman yürütülemiyor, çünkü günlük günlüğündeki hata günlüğü hiç gösterilmiyor ve günlüğe kaydediliyor zaman aşımı süresinden sonra zaman aşımına uğradı.

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

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 
    }; 
    console.log(params); 
    s3.getObject(params, function(err, data) { 
     if (err) console.log(err, err.stack); // an error occurred 
     else  console.log(data);   // successful response 
/* 
     if (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); 
     } 
*/ 
    }); 
}; 

Geçerli IM rolünün bazı değişiklikler yapması gerekiyor mu?

{ 
    "Version": "2012-10-17", 
    "Statement": [{ 
     "Effect": "Allow", 
     "Action": [ 
     "logs:CreateLogGroup", 
     "logs:CreateLogStream", 
     "logs:PutLogEvents"], 
     "Resource": "arn:aws:logs:*:*:*" 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "ec2:CreateNetworkInterface", 
     "ec2:DescribeNetworkInterfaces", 
     "ec2:DetachNetworkInterface", 
     "ec2:DeleteNetworkInterface"], 
     "Resource": "*" 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:ListAllMyBuckets", 
     "s3:ListBucket", 
     "s3:GetBucketLocation", 
     "s3:GetObject", 
     "s3:PutObject"], 
     "Resource": "arn:aws:s3:::*" 
    }, 
    { 
     "Action": "lambda:*", 
     "Effect": "Allow", 
     "Resource": "arn:aws:lambda:*" 
    }] 
} 
+0

Lambda işleviniz için VPC erişimini etkinleştirdiniz mi? –

cevap

0

ListBucket'e ihtiyacınız var ListAllBuckets. Lambda erişiminizi kısıtlamanızı öneriyorum.

{ 
     "Statement":[ 
     { 
     "Effect":"Allow", 
     "Action":[ 
      "s3:ListAllMyBuckets" 
     ], 
     "Resource":"arn:aws:s3:::*" 
     }, 
     { 
     "Effect":"Allow", 
     "Action":[ 
      "s3:ListBucket", 
      "s3:GetBucketLocation" 
     ], 
     "Resource":"arn:aws:s3:::yourBucket" 
     }, 
     { 
     "Effect":"Allow", 
     "Action":[ 
      "s3:GetObject" 
     ], 
     "Resource":"arn:aws:s3:::yourBucket/*" 
     } 
     ] 
    } 
+0

Çalıştığımda kısıtlayacağım. ama önce onu çalıştırmak istiyorum ... – shaun

+0

ListAllMyBuckets eklerseniz işe yarıyor mu? – user3913702

+0

hala zaman aşımına uğradı. "errorMessage": "2016-04-05T20: 56: 41.722Z dfb5a335-fb70-11e5-8877-a1b08ad78d9c Görev, 10.00 saniyeden sonra zaman aşımına uğradı" '' console.log (params); zaman aşımına uğramaktan daha iyi. – shaun

1

Daha önce bu soruna girdim. Bu, doğrulama, oluşturma ve geri çağrıları imzaladıktan sonra ancak geri gönderme çağrısı gerçekleşmeden önce olur. Esasen, yuvalardan biri Zombi moduna giriyor. Bunu AWS'ye bildirdim, ancak henüz bir düzeltme yapmamışlar. "Düzelt" için, s3 istemcisini başlatırken soket zaman aşımını ayarlayın. Soket zaman aşımı olacak ve işlem otomatik olarak yeniden denenecektir. Varsayılan olarak

var s3 = new AWS.S3({httpOptions: { timeout: 2000 }}); 

, zaman aşımı zaman aşımı önemli ölçüde daha kısa olduğu bu Lambda'ya oluşursa sorunlu olmasının nedeni olan iki dakikadır.