2017-01-31 3 views
0

私のラムダが私のCSVアップロードでうまくいかない理由を理解できませんでした。他のラムダ関数で私のラムダがS3アップロードでタイムアウトしています

var AWS = require('aws-sdk'); 
var mysql = require('mysql'); 
var json2csv = require('json2csv'); 

exports.handler = function (event, context) { 

    AWS.config = { 
     region: 'us-east-1', 
     apiVersions : { 
      s3: '2006-03-01' 
     } 
    }; 

    var s3 = new AWS.S3({signatureVersion: 'v4'}); 
    var bucket = 'search-dev'; 

    if(event.debug == true) 
    { 
     var connection = mysql.createConnection({ 
          host  : event.database.host, 
          user  : event.database.user, 
          password : event.database.pwd, 
          database : event.database.name 
         }); 
    } 

    connection.connect(function(err) { 
     if (err) { 
      console.error('error connecting: ' + err.stack); 
      context.fail(err); 
     } 
    }); 

    mysqlData(); 

    connection.end(); 

    function mysqlData() { 
     connection.query('SELECT id, keywords, result_count FROM keyword WHERE result_count != ""', function (err, results, fields) { 
      if (err) { 
       console.error('error connecting: ' + err.stack); 
       context.fail(err); 
      } 

      console.log(results.length + " trouvés"); 

      var csvFields = []; 
      for (var i in fields) { 
       csvFields.push(fields[i].name); 
      } 

      var csv = json2csv({ data: results, fields: csvFields }); 

      writeInFile(csv); 
     }); 
    } 

    function writeInFile(dataCsv) 
    { 
     filename = generateFilename(); 
     var params = { 
      ACL: 'public-read', 
      Bucket: bucket, 
      Key: filename+'.csv', 
      Body: dataCsv 
     }; 
     s3.upload(params, function (err, data) { 
      if (err) { 
       console.error(err, err.stack); // an error occurred 
       context.fail(err); 
      } 

      context.succeed({url: data.Location}); 
     }); 

    } 

    function generateFilename() 
    { 
     var date = new Date(); 

     var filename = date.getDate()+'-'+date.getMonth()+'-'+date.getFullYear()+'_'+date.getHours()+':'+date.getMinutes()+':'+date.getSeconds(); 

     return filename; 
    } 

}; 

、問題はありませんが、ここでは、それは私のs3.uploadラムダとのすべての時間のタイムアウトがIAMにS3FullAccessを持っています。

このコードは、ローカルで完全に動作します。

その他の問題は新しいバケットを作成しましたが、ローカルにアップロードすることは不可能[NoSuchBucket: The specified bucket does not exist]他のバケットを作成してアップロードするのは問題ではないのでわかりません。

ありがとうございました

答えて

1

私はあなたのVPCの中にラムダ関数を置いたと思います。ラムダ機能がVPC内に配置されると、VPC内のリソースにのみアクセスできます。 Lambda関数にVPC以外のAWSリソースへのアクセスとインターネットへのアクセスを与えるには、VPCに対してadd a NAT Gatewayが必要です。

S3にアクセスしようとしているだけなので、2番目のオプションはadding a S3 endpoint to your VPCです。

関連する問題