2016-04-05 11 views
0

Amazon Lambdaの理解に取り組んでいます。これは、アップロードされたファイルのコンテンツタイプを表示するために、s3テンプレートからわずかに変更されています。AWSラムダがs3オブジェクトデータテンプレートを取得できない

受信したイベントログとparamsログは両方ともクラウドウォッチで表示されますが、s3.getObject()は実行されません。データログのエラーログもログに表示されません。タイムアウト時間の後にタイムアウトしたタスクです。

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); 
     } 
*/ 
    }); 
}; 

いくつか変更する必要があるのは、現在のIMの役割ですか?

{ 
    "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

ラムダ関数のVPCアクセスを有効にしましたか? –

答えて

0

ListBucketの前にListAllBucketsが必要です。 ラムダアクセスを制限することをお勧めします。

{ 
     "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

私はそれが働くようになると、私は制限します。しかし、最初に私はそれを実行するようにしたい... – shaun

+0

ListAllMyBucketsを追加すると動作しますか? – user3913702

+0

はまだタイムアウトしています。 '' errorMessage ":" 2016-04-05T20:56:41.722Z dfb5a335-fb70-11e5-8877-a1b08ad78d9c 10.00秒後にタスクがタイムアウトしました。 "' console.log(params);タイムアウトしたと言うよりも。 – shaun

1

私は以前この問題に遭遇しました。これは、validate、build、およびsignコールバックが実行された後で、sendコールバックが発生する前に発生します。基本的に、ソケットの1つがゾンビモードに入ります。私はこれをAWSに報告しましたが、まだ修正がなされていません。 「修正」するには、s3クライアントをインスタンス化するときにソケットタイムアウトを設定します。ソケットはタイムアウトし、操作は自動的に再試行されます。

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

デフォルトでは、タイムアウトは2分です。タイムアウトが大幅に短いラムダでこの問題が発生すると、問題が発生します。

関連する問題