【问题标题】:Lambda Snapstart with Serverless framework使用无服务器框架的 Lambda Snapstart
【发布时间】:2022-12-09 09:12:57
【问题描述】:

所以 AWS 最近宣布了Lambda Snapstart,我试着试一试,因为我的应用程序冷启动时间约为 4 秒。

我能够通过在 resources 下添加以下内容来做到这一点:

- extensions:
      NodeLambdaFunction:
        Properties:
          SnapStart:
            ApplyOn: PublishedVersions

现在,当我真正去到所说的 lambda 时,这就是我所看到的:

到目前为止,一切都很好! 但是,问题是当我检查我的 Cloudwatch 日志时,没有 Restore Time 的踪迹,而是旧的 Init Duration 用于冷启动,这意味着 Snapstart 无法正常工作。

我挖得更深,所以 Snapstart 仅适用于版本化的 ARN。但事情已经是 Serverless claims 了:

默认情况下,框架为每个部署创建函数版本。

在检查日志时,我看到日志流有前缀:2022/11/30/[$LATEST]

当我检查控制台中的“版本”选项卡时,我看到了版本号240.所以我希望 240 是这个 lambda 函数的最新版本,这是每次调用的函数版本。

但是,单击版本号打开一个 lambda 函数240附加到其 ARN 并使用 Snapstart 测试该功能工作得很好。

所以我很困惑,如果最新的版本和版本号240(在我的例子中),这些有什么不同吗?

  • 如果不是,那么为什么 Snapstart 没有自动为 LATEST 激活?
  • 如果是,我如何确保它们相同?

【问题讨论】:

    标签: amazon-web-services aws-lambda serverless-framework


    【解决方案1】:

    SnapStart 仅适用于 Lambda 函数的已发布版本。它不能与$LATEST 一起使用。

    对于 Serverless Framework、SAM、CDK 以及当今基本上任何其他 IaC 工具来说,使用 Versions 是相当困难的,因为默认情况下它们都将使用 $LATEST 来与 API Gateway、SNS、SQS、DynamoDB、EventBridge 等集成。

    在 Lambda 部署完成后,您需要更新与 API 网关(或您正在使用的任何服务)的集成以指向您发布的 Lambda 版本。使用无服务器框架(和其他工具)不容易做到这一点。您可以使用此 traffic-shifting plugin 实现此目的。

    【讨论】:

      【解决方案2】:

      如果您使用 stepFuntions 调用您的 lambda 函数,您可以在中设置 useExactVersion: true

      stepFunctions:
        stateMachines:
          yourStateMachine:
            useExactVersion: true
            ...
            definition:
              ...

      这将引用您刚刚部署的函数的最新版本

      【讨论】:

        【解决方案3】:

        这一定是我很长时间以来见过的最糟糕的功能发布之一。 AWS 团队如何投入所有所需的时间和精力将此功能推向市场,同时又使其变得无用,因为我们无法编写脚本,这超出了我的理解范围。

        我们准备着手解决这个问题并开始将应用程序迁移到 lambda,但现在我们又回到了困境。即使知道有一个解决方案即将到来也是一件好事。希望来自 AWS lambda 团队的人可以提供一些见解......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-07
          • 2018-09-17
          • 2017-02-12
          • 2017-11-20
          • 2021-03-10
          • 2022-06-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多