关于 aws-lambda-managed-instances
aws-lambda-managed-instances 是运行 Lambda Event Functions 于用户账户 EC2 实例上的指导技能,涵盖适用性、成本比较、配置、迁移与故障排查;基础设施运维由 AWS 管理。
主要功能
- 01评估工作负载适用性
- 02指导成本比较
- 03介绍实例与并发配置
- 04提供迁移和基础设施指导
- 05列出故障排查要点
适用场景
- 01评估稳定流量或长时运行的 Lambda 工作负载
- 02比较 Lambda Managed Instances 成本
- 03配置容量提供方和实例规格
- 04迁移前检查并发安全准备情况
MCP 相关
该技能建议使用 AWS MCP 服务进行沙盒化 CLI 执行和审计记录,也支持 AWS CLI 或 SAM CLI。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aws/ agent-toolkit-for-aws --skill aws-lambda-managed-instances安装后在 Claude Code 中输入/aws-lambda-managed-instances确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/sqs-processor/template.yamlreferences/configuration-guide.mdcost-comparison.mdinfrastructure-setup.mdmigration-patterns.mdthread-safety.mdtroubleshooting.md详细介绍
AWS Lambda 托管实例(LMI)
在用户账户的 EC2 实例上运行 Lambda Event Functions,同时由 AWS 管理资源预置、补丁、扩缩容、路由和负载均衡。结合 Lambda 的开发体验与 EC2 的定价和硬件选项。
最适合搭配 AWS MCP 服务,用于沙箱化 CLI 执行和审计日志记录。所有指导也适用于标准 AWS CLI 或 SAM CLI。
注意: 在生产部署前,请根据当前 AWS 文档确认区域可用性、配额和实例类型选项。
快速判断:LMI 适合此工作负载吗?
| 信号 | LMI 非常适合 | Lambda Event Functions 更合适 |
|---|---|---|
| 流量 | 稳定、可预测,每月 5,000 万次以上请求 | 流量突发、不可预测,且长时间没有流量 |
| 执行时长 | 超过 15 分钟的长时间运行异步任务/ESM 作业(LMI 最长可达 90 分钟):ETL/数据处理、媒体转码、ML 推理、金融计算、网页抓取 | 短时调用;需要超过 15 分钟的同步工作(任何 Lambda 均不支持) |
| 成本 | 大规模运行时长带来的高额开支 | 调用量低或零星 |
| 冷启动 | 不可接受(LMI 可消除预置容量的冷启动) | 可以接受 |
| 计算 | 最新 CPU、特定系列、高网络带宽、GPU 需求 | Lambda Event Functions 的内存/CPU 已足够 |
| 隔离 | 用户账户中的专用 EC2 实例,完全控制 VPC | 可以接受共享的 Firecracker micro-VM |
| 缩容至零 | 无法缩容至零,但可使用 AWS 提供的解决方案创建自定义计划 | 必须支持(空闲时无需付费) |
| 代码就绪情况 | 线程安全(Node.js/Java/.NET)或任何 Python 代码 | 非线程安全代码,且改造成本高 |
路由
仅阅读与用户任务匹配的单个参考文件。不要预先加载多个参考文件。
| 用户需求 | 操作 |
|---|---|
| 成本比较、定价分析、Savings Plans、Reserved Instances | 阅读 cost-comparison.md |
| 实例类型、内存规格、vCPU 比例、扩缩容调优、容量提供程序配置 | 阅读 configuration-guide.md |
| 线程安全、并发模型、代码审查清单、多并发就绪情况 | 阅读 thread-safety.md |
| 改造前后代码示例、特定运行时迁移、连接池 | 阅读 migration-patterns.md |
| IAM 角色、VPC 设置、CLI 命令、SAM 模板、CDK 示例 | 阅读 infrastructure-setup.md |
| 错误、限流、调试、部署卡住 | 阅读 troubleshooting.md |
故障排除速查(诊断问题时始终提及):
- 容量提供程序卡在 CREATING → 最常见的原因是私有子网缺少 NAT 网关路由(实例需要出站互联网连接来拉取映像并与 Lambda 服务通信)
- 函数未扩缩容 → 检查是否已发布版本(PublishToLatestPublished: true)
- 内存错误 → LMI 最低要求为 2048 MB
工作流
步骤 1:评估工作负载
在提出建议前,收集以下信息:
- 流量模式:稳定还是突发?每秒请求数是多少?
- 当前成本:每月 Lambda 支出是多少?是否已有 Savings Plans?
- 运行时:Node.js、Java、.NET 还是 Python?
- 内存/CPU:需要多少内存?工作负载是受 CPU 限制还是受 I/O 限制?
- 执行时长:平均值和 P99 分别是多少?
- 并发准备情况:是否线程安全?是否使用共享的
/tmp路径?是否为每次调用创建数据库连接? - VPC:是否已位于 VPC 中?是否需要访问私有资源?
超过 15 分钟的长时间运行异步/ESM 作业非常适合 LMI —— LMI 支持异步和事件源映射调用的函数超时时间最长达 90 分钟(5400s),适用于 ETL/数据处理、媒体转码、ML 推理、金融计算和网页抓取。时长是这里的关键差异点,而不仅仅是成本。
推荐 LMI 时,务必提及:为确保 AZ 弹性,至少需要 3 个执行环境(生产环境中不能少于 3 个)。
步骤 2:进行成本比较
必须先进行成本比较,再推荐 LMI。
经验法则:在流量稳定且每月请求量达到 5,000 万至 1 亿次以上时,LMI 开始具备成本竞争力。请使用 LMI 定价计算器进行准确比较。
步骤 3:配置部署
- 实例系列(400 多种类型,.large 及以上):C 系列(计算型)、M 系列(通用型)、R 系列(内存型)。ARM(Graviton)可实现最佳性价比。
- 使用 Graviton 实例时,必须在函数配置中设置
Architectures: [arm64],以确保匹配。 - 内存与 vCPU 比例:2:1(计算型)、4:1(通用型,默认值)、8:1(内存型)。最小 2 GB,最大 32 GB。
- 每个 vCPU 的多并发上限:Node.js 为 64,Java 为 32,.NET 为 32,Python 为 16。这些是系统上限 —— 实际设置项为 PerExecutionEnvironmentMaxConcurrency(针对每个执行环境,而非每个 vCPU)。
- 对于受 I/O 限制的工作负载:使用运行时默认值或更高的 PerExecutionEnvironmentMaxConcurrency(例如 Node.js 设为 10),因为每个请求在等待网络时只使用少量 CPU。
- 对于受 CPU 限制的工作负载:将 PerExecutionEnvironmentMaxConcurrency 设为每个 vCPU 1–2,因为每个请求都会占满 CPU。
- 扩缩:MinExecutionEnvironments(默认值为 3)、MaxVCpuCount(可选,默认值为 400 —— 最佳实践是显式设置)和 TargetResourceUtilization。
- 函数超时时间最长可设为 5400s(90 分钟) —— 通过现有的
Timeout字段设置(CLI 使用update-function-configuration --timeout 5400,SAM/CFN 使用Timeout: 5400,或通过控制台设置)。使用现有的Timeout字段 —— 不需要单独的 API、属性、标签或代码更改。仅适用于异步和 ESM 调用;同步和按需调用仍限制为 15 分钟(即使Timeout设置得更高;GetFunctionConfiguration仍会报告配置值)。Init 阶段仍限制为 15 分钟。Durable Functions:每个步骤最长可运行 90 分钟;多步骤工作流最长可持续 1 年。
步骤 4:迁移代码
检查代码的并发安全性。LMI 会在每个执行环境中并发运行多个调用:
- Python:基于进程的隔离 —— 全局变量不会共享。无需进行线程安全方面的更改。重点关注
/tmp冲突和内存配置。 - Node.js:使用 Worker 线程 —— 同一 worker 内共享全局变量。需要确保异步安全。
- Java/.NET:使用 OS 线程/Tasks —— 处理程序会在线程间共享。需要确保全面的线程安全。
步骤 5:设置基础设施
- 创建两个 IAM 角色:执行角色(供函数使用)和操作员角色(用于管理容量提供程序 EC2)
- 配置 VPC,并在 3 个或更多 AZ 中设置子网
- 创建容量提供程序,并配置 VPC 和扩缩限制
- 创建一个关联容量提供程序的新函数
- 发布一个版本(触发实例预置)
步骤 6:验证并切换
- 先部署到非生产环境
- 监控 CloudWatch:CPU 利用率、内存、并发数、限流率
- 在调用服务或路由层逐步切换流量(10% → 50% → 100%)
- 使用 1-2 周的生产数据比较成本
- 稳定后停用 Lambda Event Function
最佳实践
定价(讨论成本时务必提及)
- 三个组成部分:EC2 实例时长 + 15% 管理费 + 每 100 万次请求 $0.20
- Savings Plans:Compute Savings Plans 适用于 EC2 部分(最高可享 60-72% 折扣)
- 15% 管理费:在 EC2 成本之外收取,用于支付 AWS 在配置、修补、扩缩容和生命周期管理方面的服务
扩缩容(讨论扩缩容或流量时务必提及)
- LMI 可立即吸收 50% 的流量峰值,并在 5 分钟内将容量翻倍——如果流量增长速度更快且超过当前容量的两倍,请求就会被限流
- Lambda Event Functions 可立即突增至 3000;LMI 无法达到这一水平
- 对于已知的流量峰值,可通过 MinExecutionEnvironments 预热
- MaxVCpuCount(默认值为 400)——明确设置为成本上限
- 形状调整:降低 MinExecutionEnvironments,以在非高峰时段降低容量(为确保 AZ 弹性,最低为 3)
实例规格
- 每个实例预留 1 个 vCPU + 1 GB 用于操作系统开销(函数无法使用)
- 可用容量 = 总容量 - 开销
配置
- 从 4:1 比率和运行时默认并发数开始
- 除非存在 x86 依赖,否则使用 ARM(Graviton)
- 除非需要特定硬件,否则让 Lambda 选择实例类型
- 设置 MaxVCpuCount 以控制成本上限
- 切勿将 MinExecutionEnvironments 设为低于 3(会破坏 AZ 弹性)
迁移
- 从 I/O 密集型函数开始(最能从多并发中受益)
- 将函数关联到容量提供程序之前,检查代码的并发安全性
- 在调用服务或路由层逐步切换流量
- 在所有日志语句中包含请求 ID
- 在处理程序之外初始化数据库连接池和 SDK 客户端
运维
- 针对限流率 > 1% 和 CPU > 80% 设置 CloudWatch 告警
- 为 14 天的实例轮换(自动执行)做好计划
- 切勿手动终止 LMI EC2 实例(应删除容量提供程序)
- 始终发布一个版本——未发布的函数无法在 LMI 上运行
长时调用(异步调用/ESM 最长 90 分钟)
- SQS:队列可见性超时 MUST ≥ 函数超时时间(对于 90 分钟的函数,≥ 5400s)。ESM 会在创建和更新时验证此项——但 ESM 创建后,SQS 可见性超时和函数超时时间可以分别更改(在 ESM API 之外),从而绕过检查并再次导致二者不匹配,使消息重新出现并触发重复调用。
- Kinesis / DynamoDB Streams:启用 部分批次失败报告(
ReportBatchItemFailures),并调整最大批处理窗口和并行化因子——否则,一条记录失败就会导致整个批次重试,重新执行长达约 80 分钟的已完成工作。 - 异步调用:失败或超时的调用会遵循重试策略(默认最多重试 2 次),之后路由到 DLQ / 失败目标。
- 并非所有 ESM 来源都符合条件:Amazon MQ 和 Amazon DocumentDB ESM 仍限制为 15 分钟;只有 SQS、Kinesis 和 DynamoDB Streams ESM(以及异步调用)支持 90 分钟。
- 可观测性保持不变:CloudWatch、CloudTrail(完成/超时时产生一个 Invoke 事件)和 X-Ray(单条跟踪)的行为均相同。使用 X-Ray 子分段查找接近 90 分钟上限时的缓慢阶段。
长时间运行的网络连接(函数现在会运行数十分钟)
- NAT Gateway 空闲超时 — 通过 NAT Gateway 建立的长连接 TCP 连接应定期发送保活数据包。
- 空闲连接超时(RDS、ElastiCache、外部 API)— 为可能在计算过程中变为空闲状态的连接添加连接健康检查/重连逻辑。
- DNS TTL — 定期重新解析外部主机名;AWS SDK 会执行此操作,但自定义 HTTP 客户端可能会缓存超过 TTL 的时间。
- 凭证 — 使用执行角色的临时凭证(由运行时自动刷新)。对于非 IAM 密钥(数据库密码、API 密钥),请通过 SDK 缓存和定期刷新,从 AWS Secrets Manager 或 SSM Parameter Store 中获取;切勿在代码或环境变量中嵌入长期有效的凭证。
限制速查
| 资源 | 限制 |
|---|---|
| 内存 | 最低 2 GB,最高 32 GB |
| 异步/ESM 调用超时 | 90 min(5400s),通过现有的 Timeout 字段设置 |
| 同步 + 按需调用超时 | 15 min |
| 初始化阶段 | 15 min |
| ESM 源的上限为 15 min | Amazon MQ、Amazon DocumentDB(SQS/Kinesis/DynamoDB Streams 为 90 min) |
| 执行环境 | 最少 3 个(MinExecutionEnvironments、AZ 弹性) |
| 实例生命周期 | 14 天(自动替换) |
| 并发数/vCPU | 64(Node.js)、32(Java/.NET)、16(Python) |
| 运行时 | Node.js 22+、Java 21+、.NET 8+、Python 3.13+、Rust(provided.al2023) |
| 实例系列 | C、M、R(.large 及以上) |
| 扩缩容 | 突发余量等于 TargetResourceUtilization 的未使用容量;新实例会在几分钟内启动 |
安全注意事项
- 操作员角色范围:在信任策略中添加
aws:SourceAccount和aws:SourceArn条件,以防止混淆代理攻击。 - VPC 出站流量:将安全组出站范围限定为 VPC 端点安全组或 AWS 前缀列表,而不是 0.0.0.0/0。
- 凭证:使用 AWS Secrets Manager 或 Parameter Store 存储数据库凭证;切勿将机密存放在环境变量中。
- 加密:为任何静态数据启用 SQS SSE、CloudWatch Logs 加密(KMS)和 S3 默认加密。
- 日志记录:设置 CloudWatch Log 组保留策略。避免记录 PII 或凭证。为 Lambda 启用 CloudTrail 数据事件。
- 实例轮换:14 天自动轮换可确保应用安全补丁,无需手动干预。
- 参考资料:Lambda 安全最佳实践、IAM 最佳实践
文件
| 文件 | 内容 |
|---|---|
| cost-comparison.md | 定价分析、盈亏平衡计算、Savings Plans/RI 的影响 |
| configuration-guide.md | 实例选择、内存比例、扩缩容调优、容量提供程序配置 |
| thread-safety.md | 各运行时的并发模型、代码审查清单、Powertools 兼容性 |
| migration-patterns.md | 各运行时的迁移前后代码、连接池、渐进式切换 |
| infrastructure-setup.md | IAM 角色、VPC 设置、SAM 模板、CLI 命令 |
| troubleshooting.md | 常见错误、限流、调试、卡住的部署 |