将 Lambda MicroVM 用作 OpenAI Agents API 的沙盒
对于使用 OpenAI Agents API 构建的代理,您可以将 AWS Lambda MicroVM 用作自托管环境,从而将工作区文件、工具执行和网络访问权限保留在自己控制的基础设施中。OpenAI 负责运行代理 Harness,Lambda MicroVM 则负责执行您的任务。在此示例中,它运行 codex exec-server,后者执行代理的工具调用并保存会话的工作区文件。您可以决定映像内容、执行器可采用的网络路径,以及其执行角色权限范围内的 AWS 资源。
每个 MicroVM 均以 Firecracker 隔离环境的形式运行,该环境从您的映像快照启动。MicroVM 的总生命周期最长为 8 小时,包括运行和暂停时间。在最后一个轮次结束后将其终止,或者在两个轮次之间将其暂停。您构建一个可重用的映像,然后从您的应用程序或 Webhook 启动程序启动 MicroVM。两种方法使用相同的映像和凭证。有关更多详细信息,请查看 Lambda MicroVM 上 OpenAI Agents API 自托管沙盒的参考示例
工作原理
在 Webhook 托管路径中,启动程序 Lambda 函数会在会话首次需要执行器时启动 MicroVM。它会重用现有的 MicroVM,如果其已暂停,则先进行恢复。您的应用程序将在最后一个轮次结束后将其终止。图 1 显示该流程:
-
您的应用程序创建自托管会话,并将输入发送到 Agents API。
-
当会话需要执行器时,OpenAI 会向您账户中的 Amazon API Gateway 端点发送包含
agent.session.action_required操作的environment_connectionWebhook。 -
启动程序 Lambda 函数验证 Webhook 签名,检索当前会话,并且确认处理程序拥有该会话。
-
启动程序使用映像、执行角色、网络连接器以及携带会话连接值的
runHookPayload调用RunMicrovm。 -
MicroVM 的
/run钩子使用其 IAM 执行角色从 AWS Secrets Manager 中检索执行器密钥并启动 Codex。 -
执行器在
https://api.openai.com中向 OpenAI 注册。然后,它会打开指向wss://codex-cloud-environments.chatgpt.com的安全 WebSocket 连接,以此接收工具命令和返回结果。 -
您的应用程序可以通过 MicroVM 已通过身份验证的 HTTPS 端点上传输入文件和下载输出文件。它跟踪会话事件流,并且可以在两个轮次之间暂停 MicroVM。
-
最后一个轮次结束后,您的应用程序会终止 MicroVM。
图 1. 用于 AWS Lambda MicroVM 上 Agents API 沙盒的 Webhook 托管预置。
将应用程序密钥和 Webhook 签名机密保存在 MicroVM 外部。启动程序仅传递执行器密钥的机密 ARN;VM 使用其执行角色检索该密钥。
密钥属性
| 属性 | 优势 |
|---|---|
| Firecracker 隔离 | 每个会话的 MicroVM 的硬件虚拟化边界 |
| 基于快照的启动 | 每个 MicroVM 均从已准备映像的快照启动 |
| 通过执行角色使用 IAM | /run 钩子使用 MicroVM 的执行角色读取执行器密钥;该密钥不存储在映像中 |
| 有状态持续时间 | 每个 MicroVM 最多可运行 8 小时,包括暂停时间 |
| 在轮次之间暂停和恢复 | 内存和磁盘状态得以保留,因此后续轮次可在同一环境中继续运行 |
| 基于用量的计算 | 运行 VM 会产生计算费用。暂停操作将停止产生计算费用;快照存储及读/写操作将单独计费。 |
先决条件
-
具有 Lambda MicroVM 访问权限的 AWS 账户、包括
lambda-microvms的 AWS CLI 版本,以及构建映像和运行 MicroVM 的相应权限。要创建 Amazon Simple Storage Service(Amazon S3)构件存储桶和 AWS Identity and Access Management(IAM)映像构建角色,请参阅创建您的第一个 Lambda MicroVM。 -
用于创建会话和提交输入的 OpenAI 应用程序密钥(
OPENAI_API_KEY)。 -
单独的 OpenAI 执行器密钥(
OPENAI_EXECUTOR_API_KEY),与会话使用相同的组织、项目及用户或服务账户。将其存储在 Secrets Manager 中,例如作为codex/agents-api/executor存储。/run钩子以CODEX_API_KEY的形式将其传递给 Codex。 -
只能读取执行器密钥机密的 microVM 执行角色。如果机密使用客户托管的 AWS Key Management Service(AWS AWS KMS)密钥,请添加解密权限。请参阅安全性和权限。
准备 microVM 映像
构建一个映像,其中包括 Codex CLI、工具依赖项、工作目录(如 /workspace)以及用于生命周期钩子的 HTTP 服务器。
| 钩子 | 行为 |
|---|---|
/aws/lambda-microvms/runtime/v1/ready |
当服务器准备好让 Lambda 拍摄快照时,会返回 HTTP 200。执行器保持断开连接状态。 |
/aws/lambda-microvms/runtime/v1/run |
读取会话连接值和机密 ARN,获取执行器密钥,然后启动执行器。 |
/aws/lambda-microvms/runtime/v1/validate |
可选。检查 Codex 是否正在运行以及工作区是否为可写状态。 |
/aws/lambda-microvms/runtime/v1/suspend |
暂停/恢复所必需。在 AWS 对 VM 拍摄快照之前,停止执行器并刷新写入内容。 |
/aws/lambda-microvms/runtime/v1/resume |
暂停/恢复所必需。再次获取密钥,并且为相同环境重新启动执行器。 |
/aws/lambda-microvms/runtime/v1/terminate |
可选。在终止之前停止执行器并刷新写入内容。 |
将 Dockerfile 和钩子服务器打包到 Amazon S3 构件中,然后构建采用 8 GB 基准内存(4 vCPU 基准)的 codex-executor 映像。在映像配置中启用所选钩子,然后将钩子端口设置为与您的服务器匹配。将会话 ID、凭证和实时执行器连接保留在映像快照外部。有关构建和钩子配置,请参阅MicroVM 映像。
启动后,您的应用程序或启动程序会在 runHookPayload 中将以下值序列化为 JSON:
| 值 | 用途 |
|---|---|
session.environment.id |
标识执行器所连接的环境 |
session.environment.remote_url |
提供执行器的 OpenAI 连接 URL |
| 执行器密钥的机密 ARN | 可让钩子使用 MicroVM 的执行角色检索密钥 |
执行器进程启动后,立即从 /run 钩子返回且无需等待轮次完成,以此避免钩子超时。
启动 MicroVM
您可以从应用程序或 Webhook 启动程序启动 MicroVM。在这两种情况下,请保持会话事件流处于打开状态,直到该轮次结束。
应用程序托管预置
-
创建其工作目录与映像匹配的自托管会话,然后打开其事件流。
-
使用映像 ARN 和版本、执行角色、网络连接器以及
runHookPayload调用RunMicrovm。将返回的microvmId与会话 ID 一起保存。 -
等待
agent.session.environment.connected,然后发送输入并跟踪轮次的结果。 -
按照 结束轮次 中所述,检索输出文件并结束轮次。
Webhook 托管预置
您的应用程序创建会话,打开其流并提交输入。当 Webhook 到达时,启动程序会处理剩余的工作。
-
在 Amazon API Gateway 中部署调用启动程序的
POST /webhook路由。授予启动程序以下权限:读取其凭证,从选取的映像检查、启动、恢复和终止 MicroVM,传递 MicroVM 执行角色,以及使用已配置的网络连接器。 -
针对
agent.session.action_required和agent.session.failed注册端点。使用启动程序的应用程序密钥将端点的签名机密存储在 Secrets Manager 中。 -
在访问会话或启动计算之前,根据原始请求正文验证 Webhook 签名。然后,检索当前会话并确认处理程序拥有该会话,例如通过匹配专用的已保存代理。
-
如果
environment_connection仍处于待处理状态,请使用GetMicrovm检查已记录的 MicroVM。如果其已暂停,请使用ResumeMicrovm进行恢复。仅在未记录任何 VM 时调用RunMicrovm,然后保存其 ID。如果保存失败,请终止您启动的 VM。如果执行器在连接超时之前连接,则等待中的输入将继续执行,无需重新提交。 -
对于
agent.session.failed事件,检索当前会话,并且仅在其状态仍为失败时终止其记录的 MicroVM。忽略已删除的会话、已解决的操作以及由其他处理程序拥有的会话。
参考示例
结束轮次
图 2 展示单个轮次的 MicroVM 生命周期,以及后续轮次的可选暂停与恢复路径。
图 2. 一个 Agents API 轮次的 MicroVM 生命周期。RunMicrovm 启动 MicroVM,/run 钩子启动执行器,环境完成连接,该轮次运行,然后轮次结束。在单个轮次的路径中,您检索文件并调用 TerminateMicrovm。在多个轮次的路径中,MicroVM 在每个轮次结束后暂停,并在下一个连接请求上恢复。
在会话流中,等待主代理的 agent.session.turn.completed、agent.session.turn.failed 或 agent.session.turn.cancelled,其中 event.turn.subagent_id 为 null。子代理共享 MicroVM,因此它们的终端事件不会触发清理。检索所需的文件。在最后一个轮次结束后,调用 TerminateMicrovm 并确认 VM 已到达 TERMINATED 状态。对于后续轮次,请保持其运行或将其暂停。如果您的应用程序遇到错误,请运行清理操作。
轮次结果以流事件的形式送达,而非作为 Webhook 订阅。agent.session.failed Webhook 涵盖会话失败的情况,但并不涵盖每个失败的轮次。因此,不要仅根据 agent.session.idle 就终止,因为它可能在等待输入开始之前就已到达该状态。
若要在清理操作未运行时界定 MicroVM 的生命周期,请在启动时配置以下设置:
| 设置 | 指南 |
|---|---|
maximumDurationInSeconds |
为工作负载设置上限,例如,针对 15 分钟测试可设置为 900。即使工作正在进行中,此限制仍然适用。 |
maxIdleDurationSeconds |
涵盖预期的工作负载。Lambda 衡量入站流量,因此执行器的出站连接不会重置此计时器。 |
suspendedDurationSeconds /
autoResumeEnabled |
对于不会恢复已暂停 MicroVM 的单一轮次模式,请使用 0/false。 |
有关生命周期和空闲控制的信息,请参阅运行和使用 MicroVM。
单独删除会话。删除会话不会停止 MicroVM,也不会发送删除 Webhook 命令。保留映像和执行器密钥机密,以便重复使用。有关处理后续轮次的信息,请参阅沙盒生命周期
在轮次之间暂停和恢复
要在轮次之间保持内存和磁盘状态,请在主代理的轮次结束且所有工具和子代理完成后暂停 MicroVM。当会话下次需要执行器时,恢复同一 MicroVM。
-
设置非零的
suspendedDurationSeconds。MicroVM 暂停期间将收取快照存储费用。 -
启用
/suspend钩子以刷新写入并关闭连接,启用/resume钩子以刷新凭证并重新连接执行器。 -
在应用程序管理的路径中,系统会在发送下一个输入之前恢复 VM。在 Webhook 管理的路径中,提交输入会触发恢复 VM 的连接请求。执行器重新连接后,该轮次即可继续。
注意
maximumDurationInSeconds 将总运行和暂停时间限制为 8 小时。要按需恢复,请调用 ResumeMicrovm。自动恢复需要流向 MicroVM 的入站流量;仅靠 Agents API 输入无法将其恢复。
联网
允许执行器所需的 OpenAI 出站连接以及 Secrets Manager 访问权限。要访问私有资源或应用自定义网络限制,请在启动时附加 VPC 出口连接器。请参阅使用出口网络连接器。
该示例支持通过 MicroVM 的 HTTPS 端点上传和下载文件,并且使用范围限定于服务器端口的身份验证令牌。
监控
运行任一示例,然后确认 hello.txt 下载成功、MicroVM 已到达 TERMINATED 状态,以及已删除的会话返回 HTTP 404。
启动程序日志。在 CloudWatch Logs 中查看启动程序 Lambda 函数的日志:
aws logs tail /aws/lambda/codex-agents-api-webhook --since 10m
运行 MicroVM。将 MICROVM_IMAGE_ARN 设置为您的映像 ARN,使用部署所在的 AWS 区域,并且列出适用于该映像的 MicroVM:
aws lambda-microvms list-microvms \ --image-identifier "$MICROVM_IMAGE_ARN" \ --query 'items[].{id:microvmId,state:state}' --output table
同时记录会话 ID 和 MicroVM ID,以便端到端地跟踪运行情况。请勿将凭证和原始 Webhook 正文写入日志。
问题排查
| 症状 | 检查内容 |
|---|---|
| Webhook 签名被拒绝 | 使用端点的签名机密,并且验证请求正文未经修改。 |
| 无 MicroVM 启动 | 检查 Webhook 订阅、会话所有权筛选条件、待处理的 environment_connection 操作以及启动程序的 IAM 权限。 |
| 映像构建失败 | 检查 Amazon S3 构件、映像构建角色以及 /ready 钩子响应。 |
/run 失败或超时 |
检查机密访问权限和执行器启动情况。在启动该进程后返回,而非在轮次结束后返回。 |
| 执行器无法连接 | 检查环境 ID、远程 URL、密钥所有权和出站网络访问权限。 |
| MicroVM 在某个轮次中停止 | 检查最长生命周期和空闲策略。出站执行器流量不计为入站活动。 |
对于连接失败的情况,请检查 agent.session.environment.failed 事件和执行器日志。有关共享执行器合同的信息,请参阅自托管沙盒