Node.js AWS Lambda SDK-TooManyRequestsException

Node.js AWS Lambda SDK-TooManyRequestsException,node.js,amazon-web-services,gulp,aws-lambda,Node.js,Amazon Web Services,Gulp,Aws Lambda,我有大约50个AWS Lambda函数,我有大量任务来部署它,脚本压缩函数并将其上载到S3,然后使用Lambda JS SDK调用此任务来创建/更新函数: gulp.task('upload', function (callback) { var AWS = require('aws-sdk'); var lambda = Promise.promisifyAll(new AWS.Lambda(), { filter: function (name) { return

我有大约50个AWS Lambda函数,我有大量任务来部署它,脚本压缩函数并将其上载到S3,然后使用Lambda JS SDK调用此任务来创建/更新函数:

gulp.task('upload', function (callback) {
  var AWS = require('aws-sdk');
  var lambda = Promise.promisifyAll(new AWS.Lambda(), {
    filter: function (name) {
      return name.indexOf('Async') === -1;
    }
  });
  var promises = require('./lambda-config.js').lambda.map(function (lambdaConfig) {
    return lambda.getFunctionConfigurationAsync({
      FunctionName: lambdaConfig.FunctionName
    }).then(function () {
      return lambda.updateFunctionCodeAsync({
        FunctionName: lambdaConfig.FunctionName,
        S3Bucket: lambdaConfig.Code.S3Bucket,
        S3Key: lambdaConfig.Code.S3Key
      });
    }).catch(function () {
      return lambda.createFunctionAsync(lambdaConfig);
    });
  });
  Promise.all(promises).then(() => callback()).catch(callback);
});
我收到
TooManyRequestsException错误
,zip大小为13MB,解压版本为50MB。我不认为大小是个问题,但对SDK的并发调用是个问题


在哪里可以找到关于我可以为AWS SDK执行多少并发调用的信息?您建议我如何解决
TooManyRequestsException错误
?非常感谢您提供一个代码示例。

zip的大小似乎不是问题(请参阅)

当超过AWS授权该帐户的Lambda进程数时,我收到TooManyRequestsException。这里有一些要考虑的限制:

  • 您可以从大约100开始。有关详细信息,请参阅。据我所知,这意味着最好的情况是,如果没有其他事情发生,在任何给定的时间内最多只能运行100个Lambda进程

  • Lambda进程结束的时间与进程结束的时间之间存在一个延迟,该延迟被计入您的限制。我不确定是否有明确的指导,以多久的时间是;根据我的经验,时间从几秒钟到一分钟左右不等。因此,如果您有一个使用50个lamda的进程,并且每个lambda需要60秒来运行,那么最好的情况是,在100个限制的情况下,您可以每分钟运行该进程两次,但实际上,它可能会受到比这更大的限制

  • 如果您向Amazon发送服务限额增加请求(支持->创建案例->服务限额增加),您的限额可以增加。您必须提供诸如每秒请求数、请求持续时间等信息

  • 非常重要:Lambda进程可能会自动重试--请参阅,特别是“如果我的帐户超过并发执行的默认限制,会发生什么情况?”和“如果我的Lambda函数在处理事件期间失败,会发生什么情况?”。这意味着,如果您已经超出了限制,并且您继续测试,那么您可能有一个仍在重试(并耗尽了限制)的积压流程

  • 基于此,您可能需要执行以下操作:

  • 自己管理重试,不要使用Amazon内置的重试机制,尤其是用于任何交互式和/或测试目的。e、 g.在节点中:

    var lambda = new AWS.Lambda({
        region: REGION,
        maxRetries:0,
        ....
    });
    
    然后,您可以使用以下方法进行管理:

    lambda.invoke(lambda_params, function(err, obj){
        if(err){
            if(err.toString().match(/TooManyRequestsException/)) ...
    
  • 如果您希望确保停止任何可能仍在失控运行的lambda(无论是由于重试还是因为代码中可能存在错误),请删除lambda函数。e、 g.从控制台:
    
    aws lambda delete函数--函数名my_outofcontrol_func
    

  • 在尝试扩展之前,请大量使用测试功能(AWS Dashboard->Lambda->选择您的功能->测试)。日志也很有用——因此,如果您调用50个lambda进行测试,您可以转到日志,查看这50个lambda发生了什么

  • 当您需要扩展时,请提前向Amazon提出请求。这将需要几天的时间,对我和其他我听说的人来说,他们总是想给你比你要求的少。如果您有使用现有容量的历史记录,则会有所帮助。当心,一旦你达到大约1000个节点,就不需要进行大量的测试,然后你就可以通过免费层并开始为每次使用付费(更多的理由是做大量的#3)


  • 看起来这里的并发性有问题。我也有同样的问题,保存了很多承诺,然后用承诺来执行它们

    这是通过使用Bluebird Promise库解决的,该库具有类似的函数Promise.map,该函数也处理并发性

    代码应与以下内容一致:

    const Promise = require('bluebird');
    
    Promise.map(arrayWithLambdas, lambda => {
    
            //Deploy each lambda
    
        }, { concurrency: 5}) // Control concurrency
        .then(() => {
    
            // Handle successful deploy of lambdas
        })
        .catch(() => {
    
            // Handle unsuccessful deploy of lambdas
        })
    };
    

    感谢您的回答,但这是如果我正在调用(执行)lambda函数,但我现在的问题与部署有关,当我尝试部署使用lambda sdk函数部署的函数时,它返回TooManyRequestsException错误。lambda文档中没有任何内容表明创建或更新函数是否有限制,我注意到我只在eu-west-1区域出现此错误,而在us-east-1区域没有。AWS中没有关于超出任何限制的信息。我明白了。我不知道并发部署的限制,但是还有一些其他方法可以简化cat,包括将多个函数合并为多功能的单个函数(然后使用参数确定要执行的子函数),和/或在上载中使用setTimeout()函数来分隔请求,或者按顺序执行您的请求。部署更新不应如此频繁,以至于性能必须是一个高优先级(如果不是这样,请重新考虑您的设计…)。感谢您的回复,如果您不介意我问一下,频繁部署与性能有什么关系?考虑到我只做开发,每天都在重新部署更改?只是好奇,想从你那里得到更多的澄清。我读到lambda函数确实一直在运行,执行时间取决于您使用该函数的频率,我认为如果某些函数不经常使用,这将是一个问题。显然,您正在尝试同时上载50多个函数,如果成功,除了花费5秒而不是5分钟之外,顺序部署几乎没有什么好处。我想不出软件开发人员有什么理由要求这样做。您真的能够快速编写代码,在5分钟内更新和测试50个函数吗?设计良好的软件不应每隔几分钟重新部署一次。这一要求意味着一个非常不寻常的开发过程,或者只是一个简单的开发过程