【问题标题】:AWS nodejs lambda function, change dynamically the value of environment variableAWS nodejs lambda函数,动态改变环境变量的值
【发布时间】:2021-01-08 04:23:51
【问题描述】:

我在 AWS 上运行一个需要很长时间才能执行的 lambda 函数(大数据)。 它超过了 lambda 中允许的最大 900 秒(15 分钟),因此函数超时。

使用 context.getRemainingTimeInMillis(),我想在超时之前触发一个新的 lambda 实例。但是,似乎没有办法停止 lambda 的执行,一旦它启动,这意味着如果我犯了任何错误,我们可以进入无限循环并且 lambda 将永远运行? 无论如何,为了避免这种情况,我正在考虑设置一个名为“stopExecution”的环境变量,默认为false,但如果由于某种原因我需要停止执行,请将其设置为true。

基本上在我的 nodejs 代码中,我读取了变量 process.env.stopExecution。现在,我的问题是,lambda 中的环境变量是动态的吗?如果我在执行期间更改值,lambda 将读取新值并因此停止?还是只在函数启动时读取环境变量,在执行过程中保持相同的值,所以读取新值的唯一方法是等待它们停止并再次启动?

另外,如果有人遇到和我一样的问题并想提出更好的解决方案,请随意。

【问题讨论】:

  • 不,显然它们不是动态的。任何其他 lambda 实例都不会看到更改的 env 变量。在一次执行中,您可以更改 env 变量,但您不应该这样做,如果您真的需要,只需使用“普通”全局变量即可。但只需使用 EC2 / ECS 而不是将任务硬塞到 lambda 中。如果某件事的时间超过 15 分钟(或接近 15 分钟),则 lambda 不适合。
  • 如果您遇到超时并想要调用不同的 lambda,为什么不重构应用程序并使用 Step Functions (aws.amazon.com/step-functions/…)?
  • 我同意@OleksiiDonoha 的观点,AWS Step Functions 是通过将处理分成多个 lambda 执行来处理长时间运行的任务的合适机制。
  • 因此,使用 Step 函数,我们将触发一个 lambda,获取 executionId,然后在另一个步骤中,定期检查 lambda 是否完成(通过它的 executionId),并在此重新启动一个新实例案子?你所建议的逻辑越来越少了吗?
  • @fgonzalez lambda 应该处理一个“批处理”工作,您可以微调批处理的大小以获得合理的单个 lambda 执行时间。您可以使用“光标”指定上次执行停止处理的位置。信息可以从 lambda 返回,也可以存储在外部存储中。 Lambda 响应可以包含信息是否已完成处理,或者是否需要从“光标”点继续处理。 Step Function 状态机然后可以决定是终止状态机,还是再次调用 lambda 以继续处理。

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


【解决方案1】:

不过,要回答这个问题,有很多方法可以让 Lambda 在本质上更具动态性,方法是将状态存储在 DynamoDB、S3、参数存储中并刷新状态。但是,我不会用它来解决您的问题。我以前亲自去过那里,事情确实开始变得复杂起来。我要么尝试执行更 map-reduce 类型的方法(有时也很复杂),要么使用运行后终止的 EC2(KISS 方法)。

【讨论】:

    【解决方案2】:

    我建议你使用new AWS BATCH serverless 来执行你的脚本,如果你需要变量试试参数存储。

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 2019-07-16
      • 2018-09-14
      • 1970-01-01
      • 2020-09-02
      • 2018-07-07
      • 2017-08-01
      • 2018-04-30
      • 2020-02-09
      相关资源
      最近更新 更多