本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用亚马逊 Bedrock 自动生成 Lambda 测试事件 AgentCore
亚马逊网络服务的 Ishita Gupta 和 Kriti Gupta
Summary
这种模式提供了一 AI-powered 种使用 Amazon Bedrock 的生成式 AI 功能自动为 AWS Lambda 函数生成全面测试用例的方法。该模式实现了部署在 Amazon Bedrock 上的三代理架构(分析器、生成器和验证器), AgentCore 该架构分析实际的 Lambda 函数代码以提取 input/output 模式,并使用真实数据生成正、负和边缘测试场景。
该架构建立了一个智能工作流程,分析器代理使用 Amazon Bedrock 获取和分析 Lambda 代码,生成器代理根据学习的模式创建测试用例,验证器代理通过重复数据删除和排名确保质量。亚马逊 DynamoDB-based 内存存储支持从用户反馈中持续学习,随着时间的推移提高测试生成的准确性。亚马逊 Cognito 通过基于 JSON 网络令牌 (JWT) 的 API 授权提供安全的用户身份验证。Amazon Bedrock Guardrails 为所有亚马逊 Bedrock API 调用提供即时攻击筛选、敏感信息编辑和内容安全执法功能。关键功能:
Multi-Language 支持:Python、Java JavaScript/TypeScript、C# 和 Ruby Lambda 函数
智能代码分块:自动将大型代码库拆分为可管理的区块以供分析
并行处理:并行 Amazon Bedrock API 要求更快地生成测试(5 个并行工作程序用于代码分析,并行生成每区块测试)
Target-Specific 分析:重点关注 Lambda 代码中的特定函数、类或文件
模式学习:具有特定目标和全局模式存储的亚马逊 DynamoDB-based 内存存储
避免拒绝:从被拒绝的测试用例中学习,避免常见错误
延续机制:通过自动延续处理不完整的亚马逊 Bedrock 响应。
忽略模式:从分析中排除测试文件、依赖关系和非代码文件。
无服务器部署:通过身份验证在 Amazon Bedrock AgentCore 上运行 Cognito-based
安全护栏:Amazon Bedrock Guardrails 用于即时攻击筛选、个人身份信息 (PII) 编辑、内容安全以及拒绝屏蔽所有 AI 通话的话题
这种模式非常适合希望加速 Lambda 测试、提高测试覆盖率并通过 AI-assisted 测试生成保持高代码质量的开发团队和组织。这种模式使用 AWS 托管服务来简化测试创建,通过学习提高质量,并进行扩展以满足不断变化的测试需求。
先决条件和限制
先决条件
要成功实现此模式,请确保满足以下条件:
活跃的 AWS 账户 -有权访问 Lambda 函数、调用亚马逊基岩模型、创建 DynamoDB 表、管理 Cognito 用户池和部署亚马逊基岩代理的 AWS 账户。 AgentCore
亚马逊 Bedrock 模型访问权限 -您的 AWS 区域启用了 Anthropic Claude Sonnet 4 (us.anthropic.claude-sonnet-4-6)。有关设置说明,请参阅 Amazon Bedrock 文档中的模型访问权限。
开发环境包括:
- 用于克隆存储库的
Git AWS Lambda 函数 -至少部署了一个带有可访问源代码以供分析的 Lambda 函数。该函数必须在部署包中包含源文件(.py、.js、.js、.java、.cs、.rb),而不仅仅是编译后的字节码。
支持的 Lambda 运行时:
-Python 3.x(所有版本)
- Node.js (JavaScript/TypeScript)
-Java 8、11、17、21(需要部署包中包含.java 源文件)
-.NET Core/.NET 6+ (C#)(需要部署包中的 .cs 源文件)
-Ruby 2.7、3.2
限制
这需要在美国东部一区访问亚马逊 Bedrock 模型才能获得 Claude Sonnet 4.6。AWS Lambda 函数可以位于任何区域。
Amazon DynamoDB 中的模式数据将在 90 天后过期(可通过生存时间 (TTL) 进行配置),以保持相关性并控制成本。
Java 和 C# Lambda 函数必须在部署包中包含源文件(.java、.cs)。 Compiled-only 无法分析软件包(.class,.dll)。
系统实现了内存中每个用户的速率限制(每 60 秒 5 个请求)。对于具有多个 AgentCore 实例的分布式部署,为了保持一致性,需要将速率限制移至 DynamoDB 或 Redis。
某些 AWS 服务并非在所有 AWS 区域都可用。有关区域可用性,请参阅按区域划分的 AWS 服务
。有关特定端点,请参阅服务端点和配额页面,然后选择相应服务的链接。
产品版本
人类学克劳德十四行诗 4(us.anthropic.claude-sonnet-4-6)
bedrock-agentcore 1.4.7 或更高版本
bedrock-agentcore-starter-toolkit 0.3.3 或更高版本
架构
目标架构
下图显示了该模式的架构和工作流程:

在此工作流程中:
用户提供输入:开发人员与本地运行的 Streamlit UI (app.py) 进行交互,提供 Lambda 函数名称、用于生成测试的可选自定义指令、目标筛选器以关注特定 functions/classes /文件,忽略模式以排除测试文件或依赖关系。
Cognito 身份验证:应用程序使用 Cognito 对请求进行身份验证并将 JWT(ID/Access 令牌)返回给 Streamlit。
AgentCore API 调用:Streamlit 使用不记名令牌 + 负载(函数名称、过滤器、指令、忽略模式)调用 AgentCore API。
JWT 验证: AgentCore API 使用 Cognito 令牌签名验证 JWT。
请求路由:AgentCore API 将请求路由到 Lambda 测试生成器工作流程(AgentCore 运行时)。
代码分析请求:分析器代理发起请求以获取目标 Lambda 函数的代码和元数据。
用于 Lambda 访问的 AWS 身份验证:Boto3 使用 AgentCore 执行角色向 AWS 进行身份验证,请求读取访问权限。
AWS Lambda 代码检索和处理:IAM 角色授权访问 Lambda 函数代码并将其作为 ZIP 文件获取,提取源文件,过滤掉依赖关系(node_modules、venv 等)和非代码文件,应用用户定义的忽略模式,并将代码分块成可管理的部分。
亚马逊基岩身份验证:Boto3 亚马逊 Bedrock 客户端使用 AWS IAM 进行身份验证以获取亚马逊 Bedrock 访问权限,请求调用模型权限以使用 Anthropic Claude Sonnet 4.6。
AI-Powered 代码分析:IAM 角色使用 Anthropic Claude Sonnet 4(us.anthropic.claude-sonnet-4-6)授权代码块并将其发送到亚马逊 Bedrock(us-east-1),应用亚马逊基岩护栏进行即时攻击过滤和内容安全。Amazon Bedrock 执行 Regex + LLM 增强分析,从代码中提取实际的输入模式(例如,事件 ['正文']、标头 ['授权'])、输出模式(例如 StatusCode、响应正文结构)、依赖关系、错误处理模式和边缘案例。
分析结果已打包:Analyzer Agent 将分析结果打包成一个包含代码块、输入模式、输出模式、依赖关系、错误模式和元数据的 AnalysisResult 对象,然后将其传递给 Generator 代理。
测试生成过程开始:Generator Agent 接收分析结果并发起生成测试用例的请求,首先查询 DynamoDB 内存存储以获取历史模式以供学习。
用于内存访问的亚马逊 DynamoDB 身份验证:Boto 3 DynamoDB 客户端向 AWS IAM 进行身份验证,以获取读取访问权限,以检索存储的模式。
历史模式从数据库中检索:IAM 角色授权和查询 DynamoDB 内存存储表(lambda-testcase-memory),以获取特定 Lambda 函数先前接受的模式和拒绝的模式(因拒绝原因而失败的测试)。
用于生成测试的亚马逊基岩身份验证:Boto3 亚马逊基岩客户端再次使用 AWS IAM 进行身份验证,以获得亚马逊 Bedrock 访问权限以生成测试用例。
AI 测试用例生成:IAM 角色授权分析结果并将结合内存模式的分析结果发送到亚马逊 Bedrock。Amazon Bedrock 根据实际代码模式生成带有真实输入事件的测试用例架构,创建阳性测试(35%)、负面测试(35%)和边缘案例(30%)。为了提高效率,逐块并行生成,应用从内存中学到的模式,避免被拒绝的模式,并在需要时生成大代码库。所有 Bedrock converse () 调用都包括用于即时攻击过滤、个人身份信息编辑和拒绝话题强制执行的 GuardrailConfig。
测试验证开始:Generator Agent 将生成的候选测试用例传递给验证器代理,进行质量控制、重复数据删除和最终选择。
验证过程已配置:Validator Agent 接收考生并启动验证流程,请求访问 DynamoDB 内存存储进行评分和验证。
用于验证的 DynamoDB 身份验证:B oto3 DynamoDB 客户端使用 AWS IAM 进行身份验证,以获取对查询内存模式的读取权限,以进行验证评分。
评估测试质量:IAM 角色授权并使用 DynamoDB 内存存储根据先前的模式成功率、功能覆盖率和代码复杂性对测试用例进行评分。Validator 执行结构验证,使用模式哈希进行重复数据删除,自信地对处理函数和错误处理进行质量评分,进行多样性选择以涵盖不同的区块和测试类型,并选择前 N 个质量最高、最多样化的测试用例。
最终测试用例返回至 AgentCore:Validator Agent 将最终经过验证的测试用例以及元数据(置信度分数、描述、输入事件、类别)返回给主协调器,由主协调器对其进行格式化并将其返回给 Amazon Bedrock API AgentCore
结果传送到 UI: AgentCore API 将生成的测试返回到 Streamlit 用户界面,以显示分析摘要、生成元数据和测试用例详细信息。
用户评论并提供反馈:开发人员审阅 Streamlit UI 中显示的测试用例,评估每项测试的质量和相关性,接受良好的测试用例或拒绝带有特定拒绝原因(missing_auth_headers、wrong_status_code、不真实的数据、missing_required_fields、incorrect_event_source 等)和解释拒绝情况的可选自定义注释,然后提交反馈。
反馈提交给系统:Streamlit 用户界面将收集的反馈(accepted/rejected 状态、拒绝原因、自定义备注)发送到 AgentCore API(save_feedback)。
AgentCore 路由反馈: AgentCore API 调用验证器代理,该代理包含在 DynamoDB 中存储反馈的逻辑。
反馈存储过程开始:验证器代理启动存储反馈的过程。
DynamoDB 写入权限已通过身份验证:Boto3 DynamoDB 客户端使用 AWS IAM(AgentCore 执行角色)进行身份验证,以获得存储反馈模式的写入访问权限。
存储学习模式:IAM 角色授权用户反馈并将其存储在 DynamoDB 内存存储表中。每个模式都使用复合分区键(function_name #target_function 或 function_name #GLOBAL)、复合排序键(FEEDBACK# accepted/rejected #PATTERN #hash)、用于重复数据删除的模式哈希、测试类型、输入模式结构、反馈状态、拒绝原因(如果被拒绝)、自定义备注、使用次数、成功率、时间戳以及 90 天自动清理的 TTL 进行存储。这些存储的数据使系统能够从用户反馈中学习并改进未来的测试生成。
自动化和扩展
此模式使用 AWS 托管服务自动扩展。Amazon Bedrock 按需处理 AI 推理,具有 20 万个代币上下文窗口,每次调用 6.4 万个代币输出,而 Amazon DynamoDB 使用按需计费,可自动根据流量模式进行调整。该系统使用并行处理来提高速度,分析器代理同时进行 5 次基岩调用来分析代码块(max_workers=5),而生成器代理ThreadPoolExecutor 与 5 个并行工作程序并行处理区块。延续机制通过自动重试请求来处理不完整的响应。速率限制(每位用户每 60 秒 5 个请求)可防止因过多 Bedrock API 调用而滥用成本。
成本优化包括删除超过 90 天的模式的 TTL-based 清理、使用 begins_with () 进行即时查找而无需进行表扫描的复合键查询,以及将DynamoDB写入操作减少大约 90% 的 BatchWriteItem 操作。性能取决于函数大小,小型函数(低于 10 个文件)在 30—60 秒内生成 10 个测试用例,中型函数(10—50 个文件)需要 1—3 分钟,大型函数(50 多个文件)需要 3—5 分钟,尽管使用目标筛选器专注于特定的代码段可将时间缩短 50-70%。
工具
AWS 服务
亚马逊 Bedrock
— 通过 Anthropic Claude Sonnet 4 提供生成式 AI 功能,用于代码分析、测试生成、验证和拒绝汇总。始终使用 us-east-1 区域进行模型访问。 Amazon Bedrock AgentCore — 提供无服务器代理运行时间,用于部署和托管具有自动扩展、 OAuth-based 授权和 CloudWatch 可观察性的测试生成后端。
Amazon Bedrock Guardrails
— 对所有 Bedrock API 调用提供 ML-based 安全筛选,包括即时攻击检测(高强度)、内容过滤、个人身份信息匿名化(电子邮件、电话、姓名)、封锁 AWS 访问 keys/private keys/JWT 令牌和拒绝主题执行(漏洞代码生成、原始源代码输出)。通过... CloudFormation 部署 AWS CloudFormation
— 自动完成基础设施配置,包括 DynamoDB 表、Cognito 用户池、带版本控制的亚马逊基岩护栏以及的 IAM 执行角色。 AgentCore Amazon Cognito — 通过基于电子邮件的注册、JWT 令牌发行和后端安全 API 授权来提供用户身份验证。 AgentCore
Amazon DynamoDB
— 存储已接受和拒绝的测试模式,并提供使用情况统计信息,以便持续学习和改进。使用复合键(function_target、pattern_sk)进行零扫描查询和特定目标模式存储。 AWS Lambda
— 用于分析的函数代码来源, GetFunction API 检索代码和配置。该工具支持 Python Node.js、Java、.NET 和 Ruby 运行时。
其他工具
Python 3.11+
— 用于应用程序和代理编排的运行时环境。 Streamlit
— 用于身份验证、测试生成、反馈收集和系统状态监控的 Web-based 用户界面。 Boto3 — 适用于 Python 的 AWS 开发工具包,用于与 Lambda、亚马逊 Bedrock、DynamoDB 和 Cognito 服务进行交互。
代码存储库
此模式的代码可在 Github- Lambda 测试事件生成器
最佳实践
此模式实现了以下最佳实践:
对 AWS Lambda(只读)、亚马逊 Bedrock(调用)、亚马逊 DynamoDB()和亚马逊 Cognito(身份验证query/write)访问使用最低权限 IAM 策略。
实施具有全局回退功能的特定目标模式学习,以提高测试准确性。
启用 DynamoDB TTL 以自动清理旧模式(90 天),以控制存储成本。
使用带有复合键(function_target、pattern_sk)的零扫描查询来快速检索模式。
应用忽略模式将测试文件、依赖关系和非代码文件排除在分析之外。
通过抽象语法树 (AST) 解析 (Python) 和正则表达式模式(Java、C#、JS、Ruby)使用多语言代码分块。
使用实际值(而不仅仅是结构)存储模式,以实现真正的重复数据消除。
在 Amazon Bedrock 上部署后端 AgentCore ,实现无服务器扩展和托管基础设施。
通过对每个 API 请求进行 JWT 令牌验证,通过 Amazon Cognito 对用户进行身份验证。
对所有 converse () 调用应用亚马逊 Bedrock Guardrails,以进行即时攻击过滤、个人身份信息编辑、敏感数据封锁(AWS 密钥、私钥、JWT)和拒绝主题执行。
在返回给用户之前对分析结果进行清理——所有原始源代码块都将从响应中移除,从而确保 Lambda 源代码永远不会离开运行时 AgentCore 边界。
使用正则表达式模式和长度限制(函数名称最多 170 个字符,自定义指令最多 2000 个字符,最多 50 个忽略模式)验证所有 API 输入,以防止注入和滥用。
实施每用户速率限制(每 60 秒 5 个请求),以防止因过多 Bedrock API 调用而滥用成本。
在返回给用户之前对错误消息进行清理-内部文件路径、AWS SDK 详细信息和基础设施信息永远不会在错误响应中暴露。
考虑以下其他最佳实践:
在拒绝测试用例时提供具体的反馈理由,以提高学习准确性。
对同一功能进行迭代(2-3 次)生成测试,以允许系统学习和改进。
当您需要特定的测试场景或数据格式时,提供自定义说明。
启用 IAM 访问分析器来监控资源权限并识别意外访问。
在分析大型代码库之前,先从小型 Lambda 函数开始了解系统。
定期查看 IAM 政策并删除未使用的权限。
使用强密码策略并启用 Cognito AdvancedSecurityMode 进行威胁检测。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
克隆存储库。 | 将 GitHub 存储库克隆到本地系统并导航到项目目录:
该存储库包含 Python 应用程序、 CloudFormation 模板和配置文件。 | 应用程序开发人员 |
配置 AWS 证书。 | 配置您的 AWS 证书,以使 AWS CLI 能够与您的 AWS 账户进行交互,并使应用程序能够访问您要测试的 Lambda 函数。 您可以使用 AWS CLI 配置命令执行此操作:
当系统提示时,请提供以下信息:
| 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
使用部署基础架构 CloudFormation。 |
创建了什么:
注意堆栈创建所有必需的资源。在继续下一步之前,请确保 CloudFormation 模板成功完成。 | 应用程序开发人员 |
导出配置变量。 | 将 CloudFormation 堆栈输出中的所有值导出为环境变量:
这些变量将在后续步骤中用于 AgentCore 配置和创建 .env 文件。 | AWS 管理员 |
| Task | 说明 | 所需技能 |
|---|---|---|
创建虚拟环境。 |
| 应用程序开发人员 |
配置和部署 AgentCore。 |
| 应用程序开发人员 |
为本地开发创建 .env 文件。 | 在项目根目录中创建包含所有配置值的 .env 文件:
测试与 AWS 服务的连接:
这两个命令都应返回成功的响应。如果您遇到权限错误,请验证 IAM 策略的配置是否正确。 | 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
创建新的 Cognito 用户。 | 出于安全考虑,Cognito 用户池配置为仅限管理员创建的用户,因此用户无法自行注册。使用从 CloudFormation 堆栈输出中导出的 Cognito 池 ID 和客户端 ID 通过 AWS CLI 创建用户。创建新用户(
设置永久密码(至少 8 个字符,必须包含大写、小写和数字):
在下一步中,使用这些凭据通过 Streamlit 用户界面登录。 | 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
启动 Streamlit 用户界面。 | 启动应用程序:
用户界面将在您的默认浏览器中打开,网址为 使用在上一步中创建的凭据登录 | 应用程序开发人员 |
配置生成选项 | 在 UI 中,配置以下选项:
| 应用程序开发人员 |
生成测试用例。 | 单击 “生成测试用例” 按钮。系统将:
| 应用程序开发人员 |
查看生成的测试。 | 查看每个生成的测试用例,其中包括:
| DevOps 工程师,应用程序开发人员 |
提供反馈。 | 对于每个测试用例,提供反馈: 要接受测试用例,请执行以下操作:
要拒绝测试用例,请执行以下操作:
| 测试工程师 |
将反馈保存到存储器中。 | 查看所有测试用例后:
| 测试工程师 |
反复进行改进。 | 为同一功能再生成 2-3 次测试以提高质量:
注意反复使用学习系统会变得更加有效。每个反馈周期都有助于 AI 了解您的测试偏好,并为您的 Lambda 函数生成更相关的测试用例。 | 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
直接调用 AgentCore API。 | 要实现自动化和集成,请使用带有 Cognito 身份验证的 API 调用直接调用 AgentCore 后端。 获取 Cognito 代币:
调用测试生成:
或者使用 curl:
| 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|---|---|
监控 DynamoDB 模式并跟踪成本。 |
注意定期监控有助于识别成本优化机会,并确保系统继续有效地学习。您的 DynamoDB 表上的 TTL 配置会自动清理旧模式,从而帮助管理一段时间内的存储成本。 | AWS 管理员 |
| Task | 说明 | 所需技能 |
|---|---|---|
删除已部署的资源。 | 要删除所有已部署的资源,请执行以下操作: 删除代 AgentCore 理:
删除 CloudFormation 堆栈(删除 DynamoDB 表、Cognito 用户池和 IAM 角色):
| AWS 管理员 |
问题排查
| 问题 | 解决方案 |
|---|---|
获取 Lambda 代码时出现 “访问被拒绝” 错误 |
|
“DynamoDB 写入错误” |
|
未生成测试用例 | 可能的原因和解决方案:
|
Java/C# Lambda 显示 “未找到源代码” | Java 和 C# Lambda 需要部署包中的源文件: Java(Maven):
C# (.NET):
|
DynamoDB 写入错误 |
|
测试生成速度慢 | 优化生成速度:
|
AgentCore: “未找到代理” | 验证代理是否已部署:
|
AgentCore: 运行时出现 “权限被拒绝” | 验证执行角色的策略是否正确:
|
Cognito: “用户名或密码无效” | 验证您的凭证是否正确。您可以使用 Streamlit 用户界面的 “创建账户” 流程或通过 AWS CLI 创建新用户:
|
日志中的 “未配置基岩护栏” 警告 | 验证 检查 CloudFormation 输出:
|
“超出速率限制” 错误 | 系统将每位用户每 60 秒限制为 5 个请求。等待指定的时间再重试。对于具有更高吞吐量需求的生产用途,请在 main.py 中进行调整 |
相关资源
AWS 文档