【问题标题】:Restarting AWS lambda function to clear cache重新启动 AWS lambda 函数以清除缓存
【发布时间】:2018-11-24 18:16:55
【问题描述】:

我有一个 AWS Lambda 函数,它在冷启动时从 s3 调用创建一个对象。然后我将对象保存在缓存中,而函数是温暖的,以减少加载时间。当 s3 中的文件发生更改时,我有一个触发器来运行 lambda,但并非所有正在运行的 lambda 实例都重新启动并从 s3 中提取。

有没有办法关闭强制完全冷启动的所有 lambda 实例?

另外,我不想用python。

【问题讨论】:

  • 根据您缓存的 s3 对象的大小,也许您可​​以验证 etag 是否仍然匹配以确定是否应该再次拉取该对象。如果对象本身不比 etag 大多少,那么这个策略当然没有意义。
  • 有多个文件夹和文件循环通过以创建对象。 etag 是整个存储桶还是单个文件?对 etag 进行异步检查可能是有意义的。
  • etag 是每个 s3 对象
  • 等一下,现在我很困惑。您的 lambda 触发 s3 更新事件?这意味着每次您的 lambda 运行时,s3 都发生了变化,您需要重新拉动?缓存有什么意义?
  • lambda 是一个路由器,用于重定向流量。路线被更新并存储在 s3 中。为了保持低停机时间,对象被缓存,以便在大多数情况下,当 lambda 运行时,路由已经映射到对象中。 s3 仅在 lambda 冷启动时检查。 s3 有一个调用 lambda 的触发器,但它不会重新启动 lambda 的所有实例。所以一些 lambdas 有一个过时的路线。

标签: amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

我根据@DejanVasic 的评论和验证做出了回答

aws lambda update-function-configuration --function-name "myLambda" --description "foo"

这将强制 lambda 的下一次调用“冷启动”。

验证:

@timestamp, @message | sort @timestamp desc | limit 1000 | filter @message like "cold_start:true"

【讨论】:

  • 天哪,这太疯狂了,为什么它在新代码部署时不刷新热容器...
  • 因为在 S3 中更新的文件不是“新代码部署”;这是一项完全独立的服务。 +
【解决方案2】:

使用UpdateFunctionCode API 端点强制刷新所有容器。 AWS SDKs 将其包装起来,以便您更轻松地使用您的首选语言调用 API。

【讨论】:

  • 请注意,更新将仅适用于新的 Lambda 调用。如果您有一个容器已经在为请求提供服务,它仍将使用其缓存中的内容。尽管如此,所有后续请求都将在冷启动中调用一个全新的容器,从而清除缓存。
  • 我遇到了这个答案,因为我们开始使用预置并发。但是对于预置并发,我们似乎必须对我们的 lambdas 进行版本控制(因为您不能基于 LATEST 进行预置)。但是根据文档,您不能修改已发布版本的代码,只能修改未发布版本。所以我想这个解决方案对我没有帮助(我必须发布一个新版本的 lambda)。
【解决方案3】:

目前,无法强制重启正在运行的 Lambda 容器。

但是,您可以重新部署该函数,以便它从那时起开始使用新容器。

【讨论】:

  • 有没有办法自动重新部署?
  • aws lambda update-function-configuration --function-name "myLambda" --description "foo" 怎么样。这将强制 lambda 的下一次调用“冷启动”?
  • @BakedInhalf 我可以确认您的解决方案完美运行。运行此 cloudwatch 查询:fields @timestamp, @message | sort @timestamp desc | limit 1000 | filter @message like "cold_start:true" 将显示 lambda 日志的冷启动在运行 update-function-configuration 后开始显示。谢谢
  • @DejanVasic 我根据我们的 cmets 做了一个回答
【解决方案4】:

如果您使用的是 Lambda 版本控制系统,另一种方法是发布新版本并使用别名将所有流量定向到该版本。

这是一个例子:

Publish version: aws lambda publish-version --function-name your-function-name-here

Update the alias指向新版本: aws lambda update-alias --function-name your-function-name-here --name alias-name-here --function-version 123(使用上面第一个命令的输出消息中的函数版本)

【讨论】:

    【解决方案5】:

    强制 lambda 丢弃现有容器的唯一方法是用不同的东西重新部署函数。

    在这里查看我的答案:Force Discard AWS Lambda Container

    祝你好运, 萌

    【讨论】:

      【解决方案6】:

      我发现最简单的方法是更改​​基本设置中的某些内容,例如超时:

      我已经提高了+1 秒,保存了,函数刷新了

      【讨论】:

        【解决方案7】:

        除了上面的一些有效答案:我碰巧在(平均)AWS Lambda 实例生命周期上运行了一个实验。我找不到运行时间超过(平均)两个小时的实例:https://xebia.com/blog/til-that-aws-lambda-terminates-instances-preemptively/

        TL;DR:AWS Lambda 在两小时后抢先终止实例(甚至是那些处理流量的实例),标准偏差为 30 分钟。

        【讨论】:

          【解决方案8】:

          只需添加一个新的环境变量和/或更改一个现有的。我创建了一个名为 BOGUS 的设备,并给它一个编号,每当我想强制冷启动时,我都会递增该编号。

          【讨论】:

            【解决方案9】:

            我找到的这个问题最简单的答案是。对函数进行一些更改,例如添加简单的注释行或删除任何空格,然后重新部署函数。

            它会在部署时清除缓存。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-04-13
              • 2011-07-11
              • 2011-08-22
              • 2016-08-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多