Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs-尝试访问S3.getBucketLocation时aws lambda随机超时_Node.js_Amazon Web Services_Amazon S3_Lambda - Fatal编程技术网

Node.js nodejs-尝试访问S3.getBucketLocation时aws lambda随机超时

Node.js nodejs-尝试访问S3.getBucketLocation时aws lambda随机超时,node.js,amazon-web-services,amazon-s3,lambda,Node.js,Amazon Web Services,Amazon S3,Lambda,对于以下代码,我被要求检查,它在AWS Lambda上运行,执行将文件上载到S3的简单任务,从AWS控制台手动运行时会随机超时,,但在按计划运行时,将始终在第一次尝试时超时,然后在第二次成功运行(第一次失败后立即运行)。调用s3.getBucketLocation后,代码似乎总是挂起,从未到达getBucketLocation的回调(第一次尝试时!) 所有VPC和NAT都已正确设置,这样,当我从代码中删除s3.getBucketLocation并调用s3Upload.upload(参数、cb)时

对于以下代码,我被要求检查,它在
AWS Lambda
上运行,执行将文件上载到
S3
的简单任务,从
AWS控制台手动运行时会随机超时,
,但在按计划运行时,将始终在第一次尝试时超时,然后在第二次成功运行(第一次失败后立即运行)。
调用
s3.getBucketLocation
后,代码似乎总是挂起,从未到达
getBucketLocation
的回调(第一次尝试时!)

所有
VPC
NAT
都已正确设置,这样,当我从代码中删除
s3.getBucketLocation
并调用
s3Upload.upload(参数、cb)时
直接运行时,代码不会超时

我很想理解为什么在尝试从AWS
AWS
检索bucket区域时,第一个函数会失败

"use strict";

var urlHelper = require('url');
var fs = require('fs');
var AWS = require('aws-sdk');

var exp = {};

function saveToFile(path, content, cb) {
    fs.writeFile(path, content, cb);
}

function saveToS3(bucket, key, content, cb) {
  var s3 = new AWS.S3({apiVersion: '2006-03-01'});
  var params = {
    Bucket: bucket
  };
  s3.getBucketLocation(params, function(err, data) {
    console.log('THIS IS NOT REACHED');
    if (err) {
      return cb(err);
    }
    var s3Upload = new AWS.S3({
      apiVersion: '2006-03-01',
      region: data.LocationConstraint
    });
    var params = {
      Bucket: bucket,
      Key: key,
      Body: content,
      ACL: 'public-read',
      ContentType: 'text/xml',
      CacheControl: 'max-age=60'
    };
    s3Upload.upload(params, cb);
  });
}

exp.upload = function(path, content, cb) {
  var url = urlHelper.parse(path);
  switch(url.protocol) {
  case 'file:':
  case null:
    saveToFile(path, content, cb);
    break;
  case 's3:':
    saveToS3(url.host, url.pathname.substring(1), content, cb);
    break;
  default:
    console.log('No matching protocol found for upload!');
    cb(null, null);
  }
};

module.exports = exp;

调用s3.getBucketLocation后,代码似乎总是挂起,从未到达它的回调。从未到达哪个回调?您没有在getBucketLocation回调中写入任何中间日志消息,因此我不确定您如何判断超时的位置。@Michael sqlbot我已编辑了我的问题以澄清您的疑问。当我说永不到达它的回调时,我指的是getBucketLocation,我想这是很清楚的,因为我在那句话中没有提到任何其他函数,我知道它挂起了,因为在要求人们花时间帮助我之前,我已经亲自测试了代码,看看它失败的地方(如我现在为您添加的日志)调用时,您允许函数在超时之前运行多长时间?如果您增加足够的时间,您应该会发现回调最终会触发,可能会出现一个有用的错误。我们最初将其设置为10秒。然后我尝试将其设置为30秒,但仍然没有错误消息。因为Lambda每次运行都会收费,所以我这样做了我真的不想将时间设置为其最大值。而且,执行这样一个简单的请求需要30秒以上也没有什么意义。我将尝试将超时限制提高到lambda允许的最大时间,看看会发生什么。我不是建议您将其设为高值,而是暂时将其调高,看看会发生什么。此外,添加日志在调用
s3.getBucketLocation()之前的新行上的语句
,以验证在实际调用该函数之前没有经过异常的时间。调用s3.getBucketLocation后,代码似乎总是挂起,从未到达它的回调。从未到达哪个回调?您没有在getBucketLocation回调中写入任何中间日志消息,因此我不确定如何执行此操作Michael sqlbot我编辑了我的问题,以澄清您的疑问。当我说永不到达它的回调时,我指的是getBucketLocation,我认为这是清楚的,因为我在那句话中没有提到任何其他函数,我知道它挂起在那一点上,因为在要求人们花时间尝试帮助我,我已经亲自测试了代码,看看它失败的地方(通过添加日志,就像我现在为您做的那样)调用时,您允许函数在超时之前运行多长时间?如果您增加足够的时间,您应该会发现回调最终会触发,可能会出现一个有用的错误。我们最初将其设置为10秒。然后我尝试将其设置为30秒,但仍然没有错误消息。因为Lambda每次运行都会收费,所以我这样做了我真的不想将时间设置为其最大值。而且,执行这样一个简单的请求需要30秒以上也没有什么意义。我将尝试将超时限制提高到lambda允许的最大时间,看看会发生什么。我不是建议您将其设为高值,而是暂时将其调高,看看会发生什么。此外,添加日志在调用
s3.getBucketLocation()
之前的新行上的语句,以验证在实际调用该函数之前没有经过异常的时间。