@hyperframes/aws-lambda

中文文档
0.8.226发布于 2026/11/01TypeScriptES Module构建来源已验证

用于HyperFrames分布式呈现处理程序、客户端SDK和CDK构造的AWS Lambda适配器。

中文使用文档
文档目录9 节
  1. 体系结构
  2. 规划运输选择
  3. Chrome运行时
  4. 回归保护
  5. 构建ZIP
  6. 运行测试
  7. 使用SDK
  8. 使用CDK构造
  9. 前方还有什么

@hyperframes / aws-lambda

用于HyperFrames分布式渲染的AWS Lambda适配器。船只三 共同的东西:

  1. 这个 λ处理程序 包裹了OSS plan / renderChunk / assemble 单个分派边界后面的原语步骤函数 会开车吗?src/handler.ts)。
  2. 一、 客户端SDK - - - - - - renderToLambda, getRenderProgress, deploySite,再加上 validateDistributedRenderConfig 和 computeRenderCost (src/sdk/)。
  3. 一个 aws-cdk-lib L2构造 (HyperframesRenderStack), 提供相同的拓扑结构 examples/aws-lambda/template.yaml 在采用者自己的CDK应用程序(src/cdk/)。

处理程序ZIP和SAM模板仍然驱动维护程序运行的实际aws 烟流;SDK + CDK是采用者支持的公共界面。

体系结构

┌──────────────────────────────────────────────────────────────────┐
│ Step Functions state machine                                     │
│   Plan → Map(N) RenderChunk → Assemble                           │
└──────────────────────────────────────────────────────────────────┘
                              │ dispatches by event.Action
                              ▼
┌──────────────────────────────────────────────────────────────────┐
│ One Lambda function (this package's `dist/handler.zip`)          │
│   handler.mjs                                                    │
│     ├─ Action="plan"        → @hyperframes/producer/distributed  │
│     ├─ Action="renderChunk" → @hyperframes/producer/distributed  │
│     └─ Action="assemble"    → @hyperframes/producer/distributed  │
│   bin/ffmpeg                — ffmpeg-static                      │
│   node_modules/@sparticuz/chromium/ — Lambda-optimised Chromium  │
└──────────────────────────────────────────────────────────────────┘
                              │ pure functions over local paths
                              ▼
┌──────────────────────────────────────────────────────────────────┐
│ S3 bucket — v1 plan tar or v2 manifest/blobs + chunks + output  │
└──────────────────────────────────────────────────────────────────┘

处理程序将来自S3的输入下载到 /tmp称OSS是原始的, 将输出上传到S3,并返回一个适合的小JSON结果 在Step Functions的历史预算范围内(每个块低于200字节)。

规划运输选择

Plan v2是新渲染的默认版本。当 planProtocol 省略了, renderToLambda 发送显式的 PlanProtocol: "v2" SDK和 已部署状态机同意:

await renderToLambda({
  // ...bucket, state machine, project, and config...
});

V2从不重载 PlanS3Uri。计划者回来了 PlanV2ManifestS3Uri 和 PlanV2ArtifactS3Prefix;块工作器获取 只有清单选择的块工件,而汇编程序获取它的 自己的元数据和音频子集。blob是不可变的sha -256寻址 对象,在上传和下载时进行验证,并发布清单 最后的。未知协议和摘要不匹配是终端步骤函数 错误。单片v1传输仍然可用,但已弃用 通过传递实现兼容性 planProtocol: "v1" 明确。

更新订单

此默认值更改了应用程序行为,并且需要一个协调的 基础设施升级。的应用程序升级之前 renderToLambda:

  1. 暂停新的渲染,让现有的步骤函数执行耗尽。
  2. 重新部署Lambda处理程序和SAM模板或CDK构造 相同的新包版本。
  3. 继续渲染,然后升级应用程序/SDK依赖项。

网站是一个 sites/<id>/files.json 旧堆栈无法提供的文件列表 读,在任何计划协议下。在上传任何东西之前, renderToLambda 读取状态机定义 (states:DescribeStateMachine),并以 STACK_TOO_OLD 当 Stack早于这种格式。如果不能首先重新部署基础设施, 在重新部署之前,将应用程序保持在以前的包版本上 完成了。重新部署后,早期版本的站点id仍然可以工作: 当 sites/<id>/files.json 是失踪,渲染使用该网站的 project.tar.gz.

Chrome运行时

该包支持两个Chromium源:

来源默认的大小什么时候采摘
@sparticuz/chromium是~70 MiB压缩λ。解压缩到 /tmp 在运行时;生态系统的其余部分已经将其用于无头铬-in- lambda。
捆绑 chrome-headless-shell否~ 140 MiB回退。如果使用 @sparticuz/chromium 曾经滴 HeadlessExperimental.beginFrame 支持。

在构建时选择源代码:

bun run --cwd packages/aws-lambda build:zip
bun run --cwd packages/aws-lambda build:zip -- --source=chrome-headless-shell

处理程序读取 HYPERFRAMES_LAMBDA_CHROME_SOURCE 在引导。构建 脚本通过Lambda函数配置设置env var examples/aws-lambda/template.yaml.

回归保护

HyperFrames的渲染器通过CDP驱动Chrome HeadlessExperimental.beginFrame 命令—与K8s部署使用的路径相同。 Lambda适配器假定 @sparticuz/chromium的 chrome-headless-shell构建尊重BeginFrame。去证明(再证明) (在每个版本中),该包附带一个Docker探测:

# Build the Lambda-like container and run the probe.
bun run --cwd packages/aws-lambda probe:beginframe:docker

探测靴 @sparticuz/chromium 内部 public.ecr.aws/lambda/nodejs:22 并断言CDP beginFrame 与 screenshot: true 返回一个PNG缓冲区。退出码0 =绿色;非零= 回落到捆绑铬头壳直接通过 --source=chrome-headless-shell.

构建ZIP

bun install                                          # at the monorepo root
bun run --cwd packages/aws-lambda build:zip          # → packages/aws-lambda/dist/handler.zip
bun run --cwd packages/aws-lambda verify:zip-size    # CI gate

构建脚本包 src/handler.ts 通过esbuild, stage @sparticuz/chromium 和 puppeteer-core 下 node_modules/复制 ffmpeg-static进 bin/,并将结果压缩。解压后的布局为 被设计成干净利落地提取到Lambda的 /var/task/.

verify:zip-size 执行:

  • 解压缩≤248 MiB(内部预算;Lambda硬上限为250 MiB解压缩- AWS文档标记为“250 MB”,但使用二进制字节)
  • 压缩≤150 MiB(内部预算;Lambda没有s3部署功能的硬压缩帽)

如果超出任何一个,则CI将使PR失败。

运行测试

bun run --cwd packages/aws-lambda test               # unit tests (no Chrome)
bun run --cwd packages/aws-lambda probe:beginframe   # local probe (Linux only)

使用SDK

在部署堆栈(通过下面的SAM模板、CDK构造)之后,或者 你自己的CFN选择),驱动渲染从节点:

import { deploySite, getRenderProgress, renderToLambda } from "@hyperframes/aws-lambda";

// One-time upload per project version.
const site = await deploySite({
  projectDir: "./my-composition",
  bucketName: "hyperframes-render-bucket",
});

// Start a render. Returns immediately — does NOT poll.
const handle = await renderToLambda({
  siteHandle: site,
  bucketName: site.bucketName,
  stateMachineArn: "arn:aws:states:us-east-1:123:stateMachine:hyperframes-render",
  config: {
    fps: 30,
    width: 1920,
    height: 1080,
    format: "mp4",
    chunkSize: 240,
    maxParallelChunks: 16,
    runtimeCap: "lambda",
  },
});

// Poll progress + cost on your own cadence.
const progress = await getRenderProgress({ executionArn: handle.executionArn });
console.log(progress.overallProgress, progress.costs.displayCost);
if (progress.status === "SUCCEEDED" && progress.outputFile) {
  console.log("Render landed at", progress.outputFile.s3Uri);
}

renderToLambda 通过验证配置客户端 validateDistributedRenderConfig 抛出一个类型 InvalidConfigError 在步进函数开始执行之前,因此形状错误会出现 同步而不是不透明 ExecutionFailed 结果。

getRenderProgress 报告近似的每次渲染成本 (accruedSoFarUsd 加上一个格式化的 displayCost)衍生自Lambda 计费时长×内存× us-east-1按需速率加上Step 功能转换价格。数学是记录在 src/sdk/costAccounting.ts;数字是最好的选择,不包括S3 转移。

使用CDK构造

import { App, Stack } from "aws-cdk-lib";
import { HyperframesRenderStack } from "@hyperframes/aws-lambda/cdk";

const app = new App();
const stack = new Stack(app, "MyApp");
const render = new HyperframesRenderStack(stack, "Render", {
  // optional: reservedConcurrency: 8,
  // optional: lambdaMemoryMb: 10240,
  // optional: chromeSource: "sparticuz",
});

// Re-export so an adopter app can wire dashboards / SNS topics.
new CfnOutput(stack, "RenderBucketName", { value: render.bucket.bucketName });
new CfnOutput(stack, "StateMachineArn", { value: render.stateMachine.stateMachineArn });

aws-cdk-lib 和 constructs 是 可选的对等依赖项: SDK-only 消费者不会在运行时拉出它们。构造本身从 @hyperframes/aws-lambda/cdk.

前方还有什么

  • hyperframes lambda CLI(部署/站点创建/渲染/进度/销毁)- PR 6.5。
  • IAM引导子命令(policies role | user | validate) -第6.9节。
  • Lambda-local regression harness (--mode=lambda-local) -第6.6页。
  • 面向采用者的迁移指南——PR 6.8。

版本与发布记录

@hyperframes/aws-lambda 共发布 441 个版本,首次发布于 2026/05/18;过去 12 个月发布了 441 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.8.226latest2026/11/012 天前
0.8.2252026/11/012 天前
0.8.2242026/11/012 天前
0.8.2232026/10/313 天前
0.8.2222026/10/313 天前
0.8.2212026/10/304 天前

其他发布通道:alpha → 0.7.67-alpha.0,desktop → 0.8.53-desktop.0,hdr → 0.8.190-hdr.1。

关于 @hyperframes/aws-lambda 的常见问题

@hyperframes/aws-lambda 是什么?

用于HyperFrames分布式呈现处理程序、客户端SDK和CDK构造的AWS Lambda适配器。

如何安装 @hyperframes/aws-lambda?

在项目目录运行 npm install @hyperframes/aws-lambda,或使用 pnpm add / yarn add / bun add。

@hyperframes/aws-lambda 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@hyperframes/aws-lambda 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@hyperframes/aws-lambda 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@hyperframes/aws-lambda 可以商用吗?

@hyperframes/aws-lambda 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@hyperframes/aws-lambda 还在维护吗?

最新版本 0.8.226 发布于 2026/11/01(2 天前);至今共发布 441 个版本,其中过去 12 个月发布了 441 个;首次发布于 2026/05/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。