【问题标题】:How to asynchronously make HTTP Requests in AWS Lambda Node.js runtime如何在 AWS Lambda Node.js 运行时异步发出 HTTP 请求
【发布时间】:2022-02-16 12:45:33
【问题描述】:

我创建了一个 API 端点,当它被 HTTP Post 请求成功访问时,它会返回一个整数。我希望 AWS CloudWatch 计划进程每分钟运行一次 AWS Lambda 函数来检查 API 端点,因此请确保该值不为零。我已经设置了计划的 AWS CloudWatch 进程和 AWS Lambda 函数,其中运行时是 Node.js 10。但是,当我查看 AWS CloudWatch 组的流日志时,日志似乎是乱序的。我怀疑这是因为对 API 端点的 HTTP 请求是异步运行的,但我最终不知道。将此 HTTP 请求的值记录到 API 端点所需的时间似乎比处理请求的实际时间长得多。

这是每分钟运行的 Node.js lambda 函数:

exports.handler = async (event) => {

    var datetime = new Date();

    var request = require("request");

    var options = {
        method: 'POST',
        url: 'https://website.com/api/getDataPoints',
        headers: 
            {
                'cache-control': 'no-cache',
                'content-type': 'text/plain'
            },
        body: '{"token" : "yT7g8urUFmEZwQrJNHgQGRDA9zScpNzPM3rb"}'
    };

    await request(options, function (error, response, body) {

        if (error)
        {
            throw new Error(error);
            // Email and SMS message that this is having an error
        }

        if (body == 0)
        {
            // Email and SMS message that this is having an error
            // Restart EC2 server
        }

        console.log(datetime.toString() + " - " + body + " Data Points!");

    });
};

这是 AWS CloudWatch 日志,在该日志中更容易看到记录来自 HTTP 请求的响应的延迟

如果您能深入了解这种感知到的日志延迟的原因或就如何以更有效的方式获得类似结果的建议,我们将不胜感激!谢谢!

【问题讨论】:

标签: node.js amazon-web-services aws-lambda


【解决方案1】:

这是发生的事情:await 立即返回,因为 request 函数没有返回 Promise,所以回调是在 lambda 函数退出后发生的。看到日志有这么长的延迟的原因是当您的 lambda 函数变得空闲时(意味着所有处理函数都已返回,即使有回调等待)AWS 可以暂停任何正在执行的代码,直到函数的新调用。因此,在您的情况下,当下一分钟到来并再次调用 lambda 函数时,AWS 将取消暂停任何正在执行的代码,并且回调立即开始,您会看到上一次调用的日志。

要解决这个问题,您需要确保处理程序函数在所有工作完成之前不会返回(我认为您打算对 await 执行此操作)。因此,将请求调用包装在一个函数中,该函数返回一个在回调中解析的 promise,并在包装​​函数上使用 await。

function doRequest() {
    return new Promise((resolve, reject) => {
         request(options, function (error, response, body) {

                 if (error){
                     throw new Error(error);
                     // Email and SMS message that this is having an error
                 }

                 if (body == 0){
                     // Email and SMS message that this is having an error
                     // Restart EC2 server
                 }

                 console.log(datetime.toString() + " - " + body + " Data Points!");
                 resolve();
          });
    });
}

await doRequest();

【讨论】:

猜你喜欢
  • 2017-10-19
  • 1970-01-01
  • 2018-05-04
  • 2017-10-05
  • 2010-09-12
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多