node.js - AWS Lambda 随机超时

标签 node.js amazon-web-services lambda

我们创建了一个基于 NodeJS 的 Lambda 函数,名为 - execInspector,每天都会触发一次。该函数是基于NodeJS中的AWS Lambda蓝图-->“inspector-scheduled-run”创建的。

我们看到的问题是计划的作业有一天或另一天随机失败。我们仅从 cloudwatch 日志流中获取以下日志。

在一周内,它随机运行 =~ 4/5 次并在剩余几天内失败。根据日志,它的执行只消耗很少的内存/时间,但不确定为什么它会随机失败。它还会在被杀死之前重试 3 次。

从下面的日志中我们还可以发现该作业平均只需要 35 MB。平均仅需 60 秒即可完成。我们尝试修改 NodeJS 运行时、增加内存、超时远远超出此限制,但没有任何效果。

您能否帮助提供一些替代方法来自动处理这些故障以及是否有人了解其发生原因?

其他输入: 我们已经给出了 5 分钟的最大超时时间,但它没有显示“300 秒后超时”。

我的意思是,触发检查器的任务平均只需要不到 30 秒。由于它是基于 PaaS 的解决方案,我不能指望这总是在 30 秒内完成。但是 60 秒应该足以处理它能够在 30 秒内完成的工作。

CloudWatch 成功日志示例:

18:01:00 开始请求 ID:12eb468a-4174-11e7-be7b-6d0faaa584aa 版本:$LATEST 18:01:03 2017-05-25T18:01:02.935Z 12eb468a-4174-11e7-be7b-6d0faaa584aa {assessmentRunArn:'arn:aws:检查器:us-east-1:102461617910:目标/0-Ly60lmEP/模板/0-POpZxSLA/运行/0-MMx30fLl' } 2017-05-25T18:01:02.935Z 12eb468a-4174-11e7-be7b-6d0faaa584aa {assessmentRunArn:'arn:aws:检查器:us-east-1:102461617910:目标/0-Ly60lmEP/模板/0-POpZxSLA/运行/0-MMx30fLl' } 18:01:03 结束请求 ID:12eb468a-4174-11e7-be7b-6d0faaa584aa 结束请求 ID:12eb468a-4174-11e7-be7b-6d0faaa584aa 18:01:03 报告请求 ID:12eb468a-4174-11e7-be7b-6d0faaa584aa 持续时间:2346.37 毫秒 计费持续时间:2400 毫秒 内存大小:128 MB 最大使用内存:33 MB 报告请求 ID:12eb468a-4174-11e7-be7b-6d0faaa584aa 持续时间:2346.37 毫秒 计费持续时间:2400 毫秒 内存大小:128 MB 最大使用内存:33 MB

Cloudwatch 日志:

下面的类似日志重复了 3 次,这似乎是一次重试尝试

06:32:52 开始请求 ID:80190395-404a-11e7-845d-1f88a00ed4f3 版本:$LATEST 06:32:56 2017-05-24T06:32:55.942Z 80190395-404a-11e7-845d-1f88a00ed4f3 执行开始... 06:33:52 结束请求 ID:80190395-404a-11e7-845d-1f88a00ed4f3 06:33:52 报告请求 ID:80190395-404a-11e7-845d-1f88a00ed4f3 持续时间:60000.88 毫秒 计费持续时间:60000 毫秒 内存大小:128 MB 使用的最大内存:32 MB 06:33:52 2017-05-24T06:33:52.437Z 80190395-404a-11e7-845d-1f88a00ed4f3 任务在 60.00 秒后超时 2017-05-24T06:33:52.437Z 80190395-404a-11e7-845d-1f88a00ed4f3 任务在 60.00 秒后超时

Lambda 代码:

'use strict';

/**
 * A blueprint to schedule a recurring assessment run for an Amazon Inspector assessment template.
 *
 * This blueprint assumes that you've already done the following:
 * 1. onboarded with the Amazon Inspector service https://aws.amazon.com/inspector
 * 2. created an assessment target - what hosts you want to assess
 * 3. created an assessment template - how you want to assess your target
 *
 * Then, all you need to do to use this blueprint is to define an environment variable in the Lambda console called
 * `assessmentTemplateArn` and provide the template arn you want to run on a schedule.
 */

const AWS = require('aws-sdk');

const inspector = new AWS.Inspector();

const params = {
    assessmentTemplateArn: process.env.assessmentTemplateArn,
};

exports.handler = (event, context, callback) => {
    try {
        // Inspector.StartAssessmentRun response will look something like:
        // {"assessmentRunArn":"arn:aws:inspector:us-west-2:123456789012:target/0-wJ0KWygn/template/0-jRPJqnQh/run/0-Ga1lDjhP"
        inspector.startAssessmentRun(params, (error, data) => {
            if (error) {
                console.log(error, error.stack);
                return callback(error);
            }

            console.log(data);
            return callback(null, data);
        });
    } catch (error) {
        console.log('Caught Error: ', error);
        callback(error);
    }
};

最佳答案

日志显示您的请求在 60 秒后超时。你可以按照这个https://aws.amazon.com/blogs/aws/aws-lambda-update-python-vpc-increased-function-duration-scheduling-and-more/设置最高5分钟如果您的任务大约需要 60 秒并且超时为 60 秒,那么可能有些任务超时了。这就是日志向我建议的内容。否则,发布函数中的一些代码

关于node.js - AWS Lambda 随机超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44198782/

相关文章:

node.js - GraphicsMagick:toBuffer() 流产生空缓冲区

node.js - MongoDB:按两个具有不同值的字段重新分组

python - 无法使用 Bitbucket 管道部署到 EB

amazon-web-services - AWS CDK部署: require argument if there is more than a single stack

c# - 如何在 LINQ 中获取类的属性

javascript - 销毁nodejs中对象的事件或回调

javascript - 了解 AudioBuffer 到 ArrayBuffer 的转换

amazon-web-services - AWS ElasticSearch 从账户 "A"中的 lambda 写入账户 "B"

c# - 访问封闭范围之外的 lambda 表达式

node.js - 事件循环作为语言构造公开的其他语言(框架)?