【问题标题】:Nodejs Lamba, how to asynchronously execute certain part of the block and return api call back early on?Nodejs Lamba,如何异步执行块的某些部分并尽早返回api回调?
【发布时间】:2020-04-10 16:39:57
【问题描述】:

我正在研究 Nodejs Lambda 函数。它是获取远程视频文件上传到s3。虽然它适用于小文件,但大文件因 API 网关的时间限制(29 秒)而失败。

当代码在 lambda 上运行时,有没有办法让我提前收到对请求的 api 回调?

我用 Async 封装了这个函数,但它需要同样的时间。可能我在 Nodejs 中设置异步作业时错了。

下面是代码。


'use strict';

const fetch = require('node-fetch');
const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies

const s3 = new AWS.S3();

module.exports.save = (event, context, callback) => {

  const url = "some_url";
  const Bucket = "recorded-video";
  const key = "some_key.mp4"

  fetch(url)
  .then((response) => {
    if (response.ok) {
      return response;
    }
    return Promise.reject(new Error(
          `Failed to fetch ${response.url}: ${response.status} ${response.statusText}`));
  })
  .then(response => response.buffer())
  .then(buffer => (
    {
      s3.putObject({
        Bucket: process.env.BUCKET,
        Key: key,
        Body: buffer,
      }).promise();   

      // then give permission.
    }
  ))

};


【问题讨论】:

    标签: node.js lambda


    【解决方案1】:

    我不这么认为,但我能想到几种方法来做到这一点,

    1. 您可以创建另一个 lambda 来执行复制并从当前 lambda 异步调用该 lambda。这会给你 15 分钟(lambda 可以运行长达 15 分钟)。
    2. 您可以设置 docker 任务并设置 AWS 批处理。然后从您的 lambda 提交批处理作业。此方法没有时间限制。

    【讨论】:

    • 这里是异步运行代码的方法。 stackoverflow.com/questions/39126606/…
    • for 1,但第一个 lambda 仍然必须使用 Gateway 触发,这意味着它需要等待第二个 lambda 给出结果。
    • 不可以异步运行。这意味着,您无需等待完成。
    • 我明白你的意思。我按照你指示我的方式实施。在第一个 lambda 中,我将第二个作为函数异步调用。它成功了。谢谢(:!
    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 2016-02-07
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多