ITADN
awslabs/llrt
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

LLRT CI LLRT Release

LLRT(Low Latency Runtime)是一个轻量级 JavaScript 运行时,旨在满足对快速且高效的 Serverless 应用日益增长的需求。与其他运行在 AWS Lambda 上的 JavaScript 运行时相比,LLRT 的启动速度可提升 10 倍以上,整体成本可降低 2 倍。

它使用 Rust 构建,采用 QuickJS 作为 JavaScript 引擎,确保高效的内存使用和快速的启动。

[!WARNING] LLRT 是一个实验性软件包。它可能会发生变化,仅用于评估目的。

LLRT - DynamoDB Put, ARM, 128MB: DynamoDB Put LLRT

Node.js 20 - DynamoDB Put, ARM, 128MB: DynamoDB Put Node20

HTTP 基准测试以冷启动的往返时间进行测量(为什么?

配置 Lambda 函数以使用 LLRT

https://github.com/awslabs/llrt/releases 下载最新的 LLRT 版本

选项 1:自定义运行时(推荐)

选择 Custom Runtime on Amazon Linux 2023,并将 LLRT bootstrap 二进制文件与您的 JS 代码一起打包。

选项 2:使用层

选择 Custom Runtime on Amazon Linux 2023,将 llrt-lambda-arm64.zipllrt-lambda-x64.zip 作为层上传并添加到您的函数中

选项 3:将 LLRT 打包到容器镜像中

参见我们的 AWS SAM 示例 或:

FROM --platform=arm64 busybox
WORKDIR /var/task/
COPY app.mjs ./
ADD https://github.com/awslabs/llrt/releases/latest/download/llrt-container-arm64 /usr/bin/llrt
RUN chmod +x /usr/bin/llrt

ENV LAMBDA_HANDLER "app.handler"

CMD [ "llrt" ]

选项 4:AWS SAM

以下示例项目设置了一个使用包含 llrt 运行时的层进行插桩的 lambda。

选项 5:AWS CDK

你可以使用cdk-lambda-llrt construct library通过 AWS CDK 部署 LLRT Lambda 函数。

import { LlrtFunction } from "cdk-lambda-llrt";

const handler = new LlrtFunction(this, "Handler", {
  entry: "lambda/index.ts",
});

请参阅 Construct Hub 及其示例](https://github.com/tmokmss/cdk-lambda-llrt/tree/main/example) 以获取更多详细信息。

就是这样 🎉

[!IMPORTANT] 尽管 LLRT 支持 ES2023,但它并非 Node.js 的直接替代品。请参阅 兼容性矩阵API 以获取更多详细信息。 所有依赖项都应针对 browser 平台进行打包,并将包含的 @aws-sdk 包标记为外部依赖。

测试与确保兼容性

确保您的代码与 LLRT 兼容的最佳方法是编写测试并使用内置的测试运行器执行它们。测试运行器目前支持 Jest/Chai 断言。您可以创建三种主要类型的测试:

单元测试

  • 适用于在隔离环境中验证特定模块和函数
  • 允许对单个组件进行集中测试

端到端 (E2E) 测试

  • 验证与 AWS SDK 的整体兼容性以及 WinterTC 合规性
  • 测试所有组件之间的集成
  • 从最终用户角度确认预期行为
  • 有关 E2E 测试以及如何运行它们的更多信息,请参阅 此处

Web 平台测试 (WPT)

  • 适用于验证 LLRT 相对于标准化浏览器 API 和运行时预期的行为
  • 确保与 Web 标准和跨运行时环境的兼容性
  • 帮助验证与 WinterTC 及更广泛的 JavaScript 生态系统的对齐
  • 有关设置说明和如何在 LLRT 中运行 WPT,请参阅 此处

测试运行器

测试运行器使用轻量级的类 Jest API,并支持 Jest/Chai 断言。有关如何为 LLRT 实现测试的示例,请参阅本仓库的 /tests 文件夹。

要运行测试,请执行 llrt test 命令。LLRT 会扫描当前目录及子目录中以 *.test.js*.test.mjs 结尾的文件。你也可以通过使用 llrt test -d <directory> 选项提供特定的测试目录进行扫描。

测试运行器还支持过滤器。使用过滤器只需添加额外的命令行参数,例如:llrt test crypto 将仅运行文件名包含 crypto 的测试。

兼容性矩阵

[!NOTE] LLRT 仅支持 Node.js API 的一小部分。它不是 Node.js 的直接替代品,也永远不会是。以下是部分支持的 API 和模块的高层概述。更多详情请参阅 API 文档

Node.js APINode.jsLLRT
node:assert✔︎✔︎️⚠️
node:async_hooks✔︎✔︎️⚠️
node:buffer✔︎✔︎️⚠️
node:child_process✔︎✔︎⚠️
node:cluster✔︎
node:console✔︎✔︎⚠️
node:crypto✔︎✔︎⚠️
node:dgram✔︎
node:diagnostics_channel✔︎
node:dns✔︎✔︎⚠️
node:events✔︎✔︎⚠️
node:fs✔︎✔︎⚠️
node:fs/promises✔︎✔︎⚠️
node:http✔︎✘⏱
node:http2✔︎
node:https✔︎✘⏱
node:inspector✔︎
node:inspector/promises✔︎
node:module✔︎✔︎⚠️

| node:net | ✔︎ | ✔︎⚠️ | | node:os | ✔︎ | ✔︎⚠️ | | node:path | ✔︎ | ✔︎⚠️ | | node:perf_hooks | ✔︎ | ✔︎⚠️ | | node:process | ✔︎ | ✔︎⚠️ | | node:querystring | ✔︎ | ✘ | | node:readline | ✔︎ | ✘ | | node:readline/promises | ✔︎ | ✘ | | node:repl | ✔︎ | ✘ | | node:sqlite | ✔︎ | ✘ | | node:stream | ✔︎ | ✔︎* | | node:stream/promises | ✔︎ | ✔︎* | | node:stream/web | ✔︎ | ✔︎⚠️ | | node:string_decoder | ✔︎ | ✔︎ | | node:test | ✔︎ | ✘ | | node:timers | ✔︎ | ✔︎⚠️ | | node:tls | ✔︎ | ✘⏱ | | node:tty | ✔︎ | ✔︎⚠️ | | node:url | ✔︎ | ✔︎⚠️ | | node:util | ✔︎ | ✔︎⚠️ |

| node:v8 | ✔︎ | ✘** | | node:vm | ✔︎ | ✘ | | node:wasi | ✔︎ | ✘ | | node:worker_threads | ✔︎ | ✘ | | node:zlib | ✔︎ | ✔︎⚠️ |

LLRT APINode.jsLLRT
llrt:codec✔︎
llrt:qjs✔︎
llrt:util✔︎
llrt:xml✔︎
Web Platform APILLRT
COMPRESSION✘⏱
CONSOLE✔︎⚠️
DOM✔︎⚠️
ECMASCRIPT✔︎⚠️
ENCODING✔︎⚠️
FETCH✔︎⚠️
FILEAPI✔︎⚠️
HR-TIME✔︎
HTML✔︎⚠️
STREAMS✔︎⚠️
URL✔︎
URLPATTERN✘⏱
WASM-JS-API-2
WASM-WEB-API-2
WEBCRYPTO✔︎⚠️
WEBIDL✔︎⚠️
XHR✔︎⚠️
其他特性LLRT
async/await✔︎
esm✔︎
cjs✔︎
Intl✔︎⚠️
Temporal✔︎⚠️

⚠️ = 在 LLRT 中部分支持
⏱ = 计划部分支持
* = 非原生
** = module.registerHooks() API 允许你模拟某些功能。另请参阅 example/register-hooks

在 LLRT 中使用 node_modules(依赖项)

由于 LLRT 旨在用于性能关键型应用,不建议在未进行打包、压缩和 tree-shaking 的情况下部署 node_modules

LLRT 可以与你选择的任何打包器配合使用。以下是一些流行打包器的配置示例:

[!WARNING] LLRT 实现了与以下外部包高度兼容的原生模块。 通过在打包器的 alias 函数中实现以下转换,你的应用可能会更快,但由于它们并非完全兼容,我们建议你进行彻底测试。

Node.jsLLRT
fast-xml-parserllrt:xml

ESBuild

esbuild index.js --platform=browser --target=es2023 --format=esm --bundle --minify --external:@aws-sdk --external:@smithy

Rollup

import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import terser from "@rollup/plugin-terser";

export default {
  input: "index.js",
  output: {
    file: "dist/bundle.js",
    format: "esm",
    sourcemap: true,
    target: "es2023",
  },
  plugins: [resolve(), commonjs(), terser()],
  external: ["@aws-sdk", "@smithy"],
};

Webpack

import TerserPlugin from "terser-webpack-plugin";
import nodeExternals from "webpack-node-externals";

export default {
  entry: "./index.js",
  output: {
    path: "dist",
    filename: "bundle.js",
    libraryTarget: "module",
  },
  target: "web",
  mode: "production",
  resolve: {
    extensions: [".js"],
  },
  externals: [nodeExternals(), "@aws-sdk", "@smithy"],
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          ecma: 2023,
        },
      }),
    ],
  },
};

使用 AWS SDK (v3) 配合 LLRT

LLRT 运行时内置了许多 AWS SDK 客户端和工具,直接集成在可执行文件中。这些 SDK 客户端经过专门优化,旨在提供最佳性能,同时不牺牲兼容性。LLRT 使用原生实现替代了 AWS SDK 中使用的某些 JavaScript 依赖项,例如哈希计算和 XML 解析。 未包含在以下列表中的 V3 SDK 包必须与您的源代码一起打包。关于如何使用未包含的 SDK 的示例,请参阅 此示例构建脚本 (buildExternalSdkFunction)

LLRT 默认支持以下三种捆绑包。捆绑包类型和后缀如下。

捆绑包类型后缀用途
no-sdk*-no-sdk适用于不使用 @aws-sdk 的工作负载。
std-sdk(无)适用于使用主要 @aws-sdk 的工作负载。
full-sdk*-full-sdk适用于使用任意 @aws-sdk 的工作负载。

各捆绑包类型所支持的包之间的关系如下。

分析no-sdkstd-sdkfull-sdk
@aws-sdk/client-athena✔︎
@aws-sdk/client-firehose✔︎
@aws-sdk/client-glue✔︎
@aws-sdk/client-kinesis✔︎
@aws-sdk/client-opensearch✔︎
@aws-sdk/client-opensearchserverless✔︎
应用集成no-sdkstd-sdkfull-sdk
@aws-sdk/client-eventbridge✔︎✔︎
@aws-sdk/client-scheduler✔︎
@aws-sdk/client-sfn✔︎✔︎
@aws-sdk/client-sns✔︎✔︎
@aws-sdk/client-sqs✔︎✔︎
业务应用no-sdkstd-sdkfull-sdk
@aws-sdk/client-ses✔︎✔︎
@aws-sdk/client-sesv2✔︎
计算服务no-sdkstd-sdkfull-sdk
@aws-sdk/client-auto-scaling✔︎
@aws-sdk/client-batch✔︎
@aws-sdk/client-ec2✔︎
@aws-sdk/client-lambda✔︎
容器no-sdkstd-sdkfull-sdk
@aws-sdk/client-ecr✔︎
@aws-sdk/client-ecs✔︎
@aws-sdk/client-eks✔︎
@aws-sdk/client-servicediscovery✔︎
数据库no-sdkstd-sdkfull-sdk
@aws-sdk/client-dynamodb✔︎✔︎
@aws-sdk/client-dynamodb-streams✔︎
@aws-sdk/client-elasticache✔︎
@aws-sdk/client-rds✔︎
@aws-sdk/client-rds-data✔︎
开发者工具no-sdkstd-sdkfull-sdk
@aws-sdk/client-xray✔︎✔︎
前端 Web 和移动服务no-sdkstd-sdkfull-sdk
@aws-sdk/client-amplify✔︎
@aws-sdk/client-appsync✔︎
@aws-sdk/client-location✔︎
机器学习 (ML) 和人工智能 (AI)no-sdkstd-sdkfull-sdk
@aws-sdk/client-bedrock✔︎
@aws-sdk/client-bedrock-runtime✔︎
@aws-sdk/client-bedrock-agent✔︎
@aws-sdk/client-bedrock-agent-runtime✔︎
@aws-sdk/client-polly✔︎
@aws-sdk/client-rekognition✔︎
@aws-sdk/client-textract✔︎
@aws-sdk/client-translate✔︎
管理与治理no-sdkstd-sdkfull-sdk
@aws-sdk/client-appconfig✔︎
@aws-sdk/client-appconfigdata✔︎
@aws-sdk/client-cloudformation✔︎
@aws-sdk/client-cloudwatch✔︎
@aws-sdk/client-cloudwatch-events✔︎✔︎
@aws-sdk/client-cloudwatch-logs✔︎✔︎
@aws-sdk/client-service-catalog✔︎
@aws-sdk/client-ssm✔︎✔︎
媒体no-sdkstd-sdkfull-sdk
@aws-sdk/client-mediaconvert✔︎
网络与内容分发no-sdkstd-sdkfull-sdk
@aws-sdk/client-api-gateway✔︎
@aws-sdk/client-apigatewayv2✔︎
@aws-sdk/client-elastic-load-balancing-v2✔︎
安全、身份和合规性no-sdkstd-sdkfull-sdk
@aws-sdk/client-acm✔︎
@aws-sdk/client-cognito-identity✔︎✔︎
@aws-sdk/client-cognito-identity-provider✔︎✔︎
@aws-sdk/client-iam✔︎
@aws-sdk/client-kms✔︎✔︎
@aws-sdk/client-secrets-manager✔︎✔︎
@aws-sdk/client-sso✔︎
@aws-sdk/client-sso-admin✔︎
@aws-sdk/client-sso-oidc✔︎
@aws-sdk/client-sts✔︎✔︎
@aws-sdk/client-verifiedpermissions✔︎
存储no-sdkstd-sdkfull-sdk
@aws-sdk/client-efs✔︎
@aws-sdk/client-s3✔︎✔︎
其他捆绑包no-sdkstd-sdkfull-sdk
@aws-crypto✔︎✔︎
@aws-sdk/credential-providers✔︎✔︎
@aws-sdk/lib-dynamodb✔︎✔︎
@aws-sdk/lib-storage✔︎✔︎
@aws-sdk/s3-presigned-post✔︎✔︎
@aws-sdk/s3-request-presigner✔︎✔︎
@aws-sdk/util-dynamodb✔︎✔︎
@aws-sdk/util-user-agent-browser✔︎✔︎
@smithy✔︎✔︎

[!TIP] LLRT 现在支持流式 SDK 响应(自 0.9 版本起)。您可以将响应体作为流进行消费,或使用便捷方法:

const response = await client.send(command);

// Option 1: Stream the response body
for await (const chunk of response.Body) {
  // process chunk
}

// Option 2: Collect as string or bytes
const str = await response.Body.transformToString();
// or
const bytes = await response.Body.transformToByteArray();

使用 LLRT 运行 TypeScript

使用 TypeScript 时,适用与依赖项相同的原理。TypeScript 必须被打包并转译为 ES2023 JavaScript。

[!NOTE] LLRT 不支持在未转译的情况下运行 TypeScript。这是出于性能原因的设计决定。转译需要消耗 CPU 和内存,这会在执行期间增加延迟和成本。如果在部署时提前完成,可以避免这种情况。

理由

鉴于已有 Node.jsBunDeno 等现有选项,引入另一个 JavaScript 运行时的理由是什么?

Node.js、Bun 和 Deno 代表了高度成熟的 JavaScript 运行时。然而,它们的设计初衷是面向通用应用程序。这些运行时并未针对 Serverless 环境的需求进行专门定制,该环境以短生命周期的运行时实例为特征。它们各自依赖一个(即时编译器 (JIT) 用于执行期间的动态代码编译和优化。虽然 JIT 编译提供了显著的长期性能优势,但它伴随着计算和内存开销。

相比之下,LLRT 通过不集成 JIT 编译器来区别于其他运行时,这一战略决策带来了两个显著优势:

A) JIT 编译是一个相当复杂的技术组件,它增加了系统复杂性,并显著增加了运行时的整体大小。

B) 没有 JIT 开销,LLRT 节省了 CPU 和内存资源,这些资源可以更高效地分配给代码执行任务,从而减少应用程序的启动时间。

局限性

在许多情况下,与基于 JIT 的运行时相比,LLRT 表现出明显的性能劣势,例如处理大型数据、蒙特卡洛模拟或执行包含数十万甚至数百万次迭代的任务。LLRT 在应用于较小的 Serverless 函数时最为有效,这些函数专门用于数据转换、实时处理、AWS 服务集成、授权、验证等任务。它旨在补充现有组件,而非作为所有事物的全面替代方案。值得注意的是,由于其支持的 API 基于 Node.js 规范,转回其他解决方案所需的代码调整极少。

从源代码构建

  1. 克隆代码并 cd 到目录
git clone git@github.com:awslabs/llrt.git
cd llrt
  1. 安装 git 子模块
git submodule update --init --checkout
  1. 安装 rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y
source "$HOME/.cargo/env"
  1. 安装依赖
# MacOS
brew install zig make cmake zstd node corepack

# Ubuntu
sudo apt -y install make zstd
sudo snap install zig --classic --beta

# Windows WSL2 (requires systemd to be enabled*)
sudo apt -y install cmake g++ gcc make zip zstd
sudo snap install zig --classic --beta

# Windows WSL2 (If Node.js is not yet installed)
sudo curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
nvm install --lts

* 参见 Microsoft Devblogs

  1. 安装 Node.js 包
corepack enable
yarn
  1. 安装生成库并设置 rust 目标 & 工具链
make stdlib && make libs

[!NOTE] 如果这些命令退出时出现错误,提示 can't cd to zstd/lib, 说明你未递归克隆此仓库。运行 git submodule update --init 以下载子模块,然后再次运行上述命令。

  1. 为 Lambda 构建二进制文件(按所需的捆绑类型和架构)
# for arm64, use
make llrt-lambda-arm64.zip
make llrt-lambda-arm64-no-sdk.zip
make llrt-lambda-arm64-full-sdk.zip
# or for x86-64, use
make llrt-lambda-x64.zip
make llrt-lambda-x64-no-sdk.zip
make llrt-lambda-x64-full-sdk.zip
  1. 为容器构建二进制文件(按所需的捆绑类型和架构)
# for arm64, use
make llrt-container-arm64
make llrt-container-arm64-no-sdk
make llrt-container-arm64-full-sdk
# or for x86-64, use
make llrt-container-x64
make llrt-container-x64-no-sdk
make llrt-container-x64-full-sdk
  1. 可选:为你的本地机器(Mac 或 Linux)进行构建
make release
make release-no-sdk
make release-full-sdk

你现在应该已经拥有了 llrt-lambda-arm64*.zipllrt-lambda-x64*.zip。你可以手动将其上传为 Lambda 层,或通过你的 Infrastructure-as-code 流水线使用它

加密和 TLS 后端选项

LLRT 支持多种加密后端,适用于 crypto 模块和 TLS 连接。这些可以通过 Cargo features 进行配置。

加密提供者特性

FeatureDescription
crypto-rust (default)使用 RustCrypto crates 的纯 Rust 加密
crypto-ring仅 Ring 加密(有限的算法支持)
crypto-ring-rust使用 Ring 进行哈希/HMAC,其余使用 RustCrypto
crypto-graviola仅 Graviola 加密(有限的算法支持)
crypto-graviola-rust使用 Graviola 进行哈希/HMAC/AES-GCM,其余使用 RustCrypto
crypto-openssl基于 OpenSSL 的加密

TLS 后端特性

FeatureDescription
tls-ring (default)使用 ring 加密的 rustls
tls-aws-lc使用 AWS-LC 加密的 rustls(针对 AWS 优化)
tls-graviola使用 graviola 加密的 rustls
tls-openssl用于 TLS 的 OpenSSL

使用不同后端进行构建

# Default (crypto-rust + tls-ring)
cargo build --release

# Using AWS-LC for TLS
cargo build --release --no-default-features --features "macro,tls-aws-lc"

# Using OpenSSL for both crypto and TLS
cargo build --release --no-default-features --features "macro,crypto-openssl,tls-openssl"

# Using Graviola for both crypto and TLS
cargo build --release --no-default-features --features "macro,crypto-graviola-rust,tls-graviola"

运行 Lambda 模拟器

请注意,为了运行示例,您需要:

  • 通过 ~/.aws/credentials 或环境变量提供有效的 AWS 凭证。
export AWS_ACCESS_KEY_ID=XXX
export AWS_SECRET_ACCESS_KEY=YYY
export AWS_REGION=us-east-1
  • 一个 DynamoDB 表(以 id 作为分区键)位于 us-east-1
  • 该表上的 dynamodb:PutItem IAM 权限。您可以使用此策略(别忘了修改 <YOUR_ACCOUNT_ID>):
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "putItem",
      "Effect": "Allow",
      "Action": "dynamodb:PutItem",
      "Resource": "arn:aws:dynamodb:us-east-1:<YOUR_ACCOUNT_ID>:table/quickjs-table"
    }
  ]
}

在单独的终端中启动 lambda-server.js

node lambda-server.js

然后运行 llrt:

make run

环境变量

LLRT_ASYNC_HOOKS=value

当使用异步钩子时,QuickJS 内部的钩子函数会被激活。由于担心其对性能产生重大影响,此功能默认处于禁用状态。

通过将此环境变量设置为 1,可以启用异步钩子函数,从而允许您使用 async_hooks 模块来跟踪异步处理。

LLRT_EXTRA_CA_CERTS=file

从 PEM 编码文件中加载额外的证书颁发机构

LLRT_GC_THRESHOLD_MB=value

设置垃圾回收的内存阈值(单位:MB)。默认阈值为 20MB

LLRT_HTTP_VERSION=value

扩展 HTTP 请求版本。默认情况下,仅启用 HTTP/1.1。指定 '2' 将启用 HTTP/1.1 和 HTTP/2。

LLRT_LOG=[target][=][level][,...]

使用 = 按目标模块、级别或两者同时过滤日志输出。日志级别不区分大小写,并且也会启用任何更高优先级的日志。

按优先级降序排列的日志级别:

  • Error
  • Warn | Warning
  • Info
  • Debug
  • Trace

示例过滤器:

  • warn 将启用所有警告和错误日志
  • llrt_core::vm=trace 将启用 llrt_core::vm 模块中的所有日志
  • warn,llrt_core::vm=trace 将启用 llrt_core::vm 模块中的所有日志以及其他模块中的所有警告和错误日志

LLRT_NET_ALLOW="host[ ...]"

空格分隔的主机或套接字路径列表,这些主机或路径应被允许进行网络连接。对于此列表中缺失的任何主机或套接字路径,网络连接将被拒绝。设置为空列表以拒绝所有连接

LLRT_NET_DENY="host[ ...]"

以空格分隔的主机或套接字路径列表,这些主机或路径应被拒绝用于网络连接

LLRT_NET_POOL_IDLE_TIMEOUT=value

为保持空闲套接字的连接设置超时时间(以秒为单位)。默认超时时间为 15 秒

LLRT_PLATFORM=value

用于显式指定 Node.js 包解析器的首选平台。默认值为 browser。如果指定了 node,则 "node" 在搜索路径中优先。如果指定了除 browsernode 以外的值,其行为将如同指定了 "browser" 一样。

LLRT_REGISTER_HOOKS=file

如果你想启用一个与 Node.js 的 module.registerHooks() 基本兼容的钩子机制,请在此环境变量中指定 js 文件名。

我们在 example/register-hooks 中提供了一个具体示例。

[!NOTE] 此环境变量仅在 AWS Lambda 上运行时有效。 使用 LLRT CLI 时,必须使用 --import 选项而非此环境变量来指定钩子文件。

LLRT_SDK_CONNECTION_WARMUP=1

在函数初始化期间并行初始化 TLS 连接,从而显著减少冷启动时间。默认启用,可通过值 0false 禁用

LLRT_TLS_VERSION=value

设置用于网络连接的 TLS 版本。默认情况下仅启用 TLS 1.2。通过将此变量设置为 1.3 也可以启用 TLS 1.3。

基准测试方法

尽管 Lambda 报告的 Init Duration](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html) 通常用于理解冷启动对整体请求延迟的影响,但该指标不包括将代码复制到 Lambda 沙箱所需的时间。

Init Duration 的技术定义(来源):

对于处理的第一次请求,运行时加载函数并执行 handler 方法之外的代码所花费的时间。

测量往返请求持续时间可以更全面地了解面向用户的冷启动延迟。

Lambda 调用结果(λ 标记的行)报告 Init Duration + Function Duration 的总和。

安全

更多信息请参阅 CONTRIBUTING

许可证

本库根据 Apache-2.0 许可证授权。请参阅 LICENSE 文件。