本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
设计注意事项
本节介绍了 AWS 分布式负载测试解决方案的重要设计决策和配置选项,包括支持的应用程序、测试类型、计划选项和部署注意事项。
受支持的应用程序
只要您的 AWS 账户与应用程序建立了网络连接,该解决方案就支持测试基于云的应用程序和本地应用程序。该解决方案支持使用 HTTP 或 HTTPS 协议的 API。
测试类型
AWS 上的分布式负载测试支持多种测试类型:简单的 HTTP 终端节点测试、JMeter、k6 和 Locust。除简单的 HTTP 端点外,每种测试类型都可以在任一流量形状模式下运行。有关更多信息,请参阅交通形态模式。
注意
该解决方案将 JMeter、k6 和 Locust 作为第三方组件分发,无需修改。有关安全注意事项、补丁选项和许可证信息,请参阅Third-party 测试框架。
简单的 HTTP 端点测试
Web 控制台提供了 HTTP 端点配置接口,允许您在不编写自定义脚本的情况下测试任何 HTTP 或 HTTPS 端点。您可以定义端点 URL,从下拉菜单中选择 HTTP 方法(GET、POST、PUT、DELETE 等),还可以选择添加自定义请求标头和正文有效负载。此配置使您能够使用自定义授权令牌、内容类型或应用程序要求的任何其他 HTTP 标头和请求正文来测试 API。
当您配置 HTTP 端点时,该解决方案会将您的配置转换为测试计划,该计划由捆绑的 Apache JMeter 二进制文件通过 Taurus 框架执行。简单的 HTTP 端点测试不接受测试存档,因此它们无法覆盖捆绑的 JMeter 二进制文件或插件。如果您需要使用已修补的 JMeter 运行 HTTP 端点测试,请改用 JMeter 测试类型。出于安全考虑,请参阅 Apache JMeter 。
由于该解决方案会为该测试类型生成测试计划,因此简单 HTTP 端点测试只能在标准模式下运行。原生模式需要您上传脚本。有关更多信息,请参阅交通形态模式。
JMeter 测试
使用 Web 控制台创建测试场景时,您可以上传 JMeter 测试脚本。该解决方案将脚本上传到场景 S3 存储桶。当亚马逊 ECS 任务运行时,它们会从 S3 下载 JMeter 脚本并执行测试。
重要
在标准模式下,您的 JMeter 脚本可以定义并发性(虚拟用户)、事务速率 (TPS)、启动时间和其他加载参数。该解决方案将使用您在创建测试期间在 Traffic Shape 屏幕中指定的值覆盖所有值。该配置控制任务数、并发性(每个任务的虚拟用户数)、加速持续时间和测试执行的保持时间。
在原生模式下,该解决方案jmeter -n -t针对您的脚本运行,不传递任何加载参数。您的话题组和计时器完全按照创作方式运行。有关更多信息,请参阅交通形态模式。
如果您有 JMeter 输入文件,则可以将输入文件与 JMeter 脚本一起压缩。创建测试场景时可以选择 zip 文件。
如果您想包含插件,则捆绑的 zip 文件中 /plugins 子目录中包含的任何 .jar 文件都将复制到 JMeter 扩展目录并可用于负载测试。
注意
如果您在 JMeter 脚本文件中包含 JMeter 输入文件,则必须在 JMeter 脚本文件中包含输入文件的相对路径。此外,输入文件必须位于相对路径处。例如,当您的 JMeter 输入文件和脚本文件位于/home/user 目录中且您引用 JMeter 脚本文件中的输入文件时,输入文件的路径必须为。/输入文件。如果您改用/home/user/INPUT_FILES,则测试将失败,因为它无法找到输入文件。
如果您包含 JMeter 插件,则必须将 .jar 文件捆绑到压缩文件根目录下名为 /plugins 的子目录中。相对于压缩文件的根目录,jar 文件的路径必须是。/plugins/BUNDLED_PLUGIN.jar。
有关如何使用 JMeter 脚本的更多信息,请参阅 JMeter 用户手册。
k6 测试
该解决方案支持基于 k6 框架的测试。您可以将 k6 测试文件连同任何必要的输入文件一起上传到存档文件中。当您创建新的 k6 测试时,Web 控制台会显示许可证确认消息。有关许可证和安全性的详细信息,请参阅 Grafana k 6。
重要
在标准模式下,您的 k6 脚本可以定义并发性(虚拟用户)、阶段、阈值和其他负载参数。该解决方案将使用您在创建测试期间在 Traffic Shape 屏幕中指定的值覆盖所有值。该配置控制任务数、并发性(每个任务的虚拟用户数)、加速持续时间和测试执行的保持时间。
在纯模式下,该解决方案根据您的脚本运行k6 run,不传递任何负载参数。k6 完全按照写入的方式应用您的选项块、场景、阶段和阈值。有关更多信息,请参阅交通形态模式。
蝗虫试验
该解决方案支持基于 Locust 框架的测试。您可以将 Locust 测试文件连同任何必要的输入文件一起上传到存档文件中。
重要
在标准模式下,您的 Locust 脚本可以定义并发性(用户数)、生成率和其他加载参数。该解决方案将使用您在创建测试期间在 Traffic Shape 屏幕中指定的值覆盖所有值。该配置控制任务数、并发性(每个任务的虚拟用户数)、加速持续时间和测试执行的保持时间。
在原生模式下,该解决方案locust --headless针对您的脚本运行,不传递任何加载参数。Locust 完全按照写入的方式应用您的LoadTestShape课程和加权任务集。您的脚本不得设置processes,因为只有当 Locust 作为单个进程运行时,解决方案才会计算请求数。有关更多信息,请参阅交通形态模式。
测试脚本命名
当您上传单个.py文件时,解决方案会将其存储在测试 ID 下并直接引用,因此该文件可以有任何名称。当您上传.zip档案时,解决方案会在档案中搜索名为的文件locustfile.py。如果存档包含任何其他名称的 Python 脚本,则在容器启动期间测试将失败,并显示消息No test script (.py) in zip file。
Python 的自定义
负载测试容器包括 Locust 及其依赖项。它不包括第三方 Python 包。如果您的 Locust 脚本导入了容器中不存在的包,则测试将失败。ModuleNotFoundError要提供其他软件包,请在.zip存档的根目录中添加一个requirements.txt文件。容器会在测试开始requirements.txt之前安装中列出的软件包。
您可以通过以下两种方式之一提供依赖关系:
- 从 PyPI 安装
-
仅包括一个
requirements.txt文件。容器在任务启动时安装requirements.txt从 PyPI 中列出的软件包。这需要从运行负载测试任务的子网进行出站互联网访问。 - 使用捆绑的轮子安装(离线)
-
包括一个
requirements.txt文件和一个包含 Python wheel (.whl) 文件的packages子目录。容器只能从捆绑的轮子上安装,不接触 PyPI。此选项适用于没有出站互联网访问的环境。捆绑轮子还固定了确切的软件包版本,因此新的 PyPI 版本无法在两次运行之间更改您的测试环境。
以下示例显示了存档布局:
my-test.zip ├── locustfile.py # Required — must use this name ├── requirements.txt # Optional — packages to install └── packages/ # Optional — wheels, for offline install only └── *.whl
两者requirements.txt以及packages子目录都必须位于存档的根目录下。locustfile.py如果您的脚本仅导入容器已经提供的包,则省略这两者。该packages子目录仅与requirements.txt文件一起生效;它本身会被忽略,也不会安装任何软件包。
传递依赖关系
捆绑轮子时,requirements.txt必须列出依赖项所需的每个包,而不仅仅是直接导入的软件包。离线安装不联系 PyPI。缺少传递依赖关系会导致安装失败并且任务在测试开始之前停止。
为容器准备轮子
负载测试容器在 x86_64 架构上运行 Linux 和 Python 3.11。为不同的操作系统、架构或 Python 版本编译的轮子无法安装。用纯 Python 编写的包作为独立于平台的轮子分发,可以在任何地方使用,但是包含已编译扩展的包需要为容器平台构建的轮子。由于容器不包含编译器,因此它无法在任务启动时构建源代码发行版。
运行以下命令下载与容器平台兼容的轮子。你可以在任何操作系统(包括 macOS 和 Windows)上运行此命令。然后将生成的packages目录包含在您的存档中:
pip download -r requirements.txt \ --dest packages \ --platform manylinux2014_x86_64 \ --python-version 3.11 \ --only-binary=:all:
--platform和--python-version选项的目标是容器,而不是运行命令的计算机。该--only-binary=:all:选项会导致命令失败,而不是静默地回退到容器无法构建的源代码发行版。该manylinux2014标签指定了与 glibc 2.17 及更高版本兼容的轮子,其中包括容器的版本。
要捆绑您自己维护的软件包,请使用包的源目录构建一个轮子pip wheel . --wheel-dir packages,然后将软件包名称添加到requirements.txt。
交通形状模式
每项测试都以两种交通形态模式之一运行,即标准模式或原生模式。该模式决定了三件事:哪一方控制负载、Fargate 任务使用哪个容器镜像以及解决方案向测试框架发送哪个负载参数。有关在创建测试时选择模式的指导,请参阅 “使用解决方案” 部分中的交通形态模式。
标准模式
Fargate 任务使用安装了 Taurus 的镜像。Taurus 从解决方案中接收您的任务数、并发性、加速和保持时长。它将这些值转换为底层框架自己的负载控制。Taurus 优先于您的脚本声明的负载。它会重写或忽略 k6 选项块、Locust 或 JMeter LoadTestShape 线程组。一个区域生成的虚拟用户是任务数乘以每项任务的并发量。每个框架的形状都是一样的。这就是该解决方案在 4.3.0 版本之前进行所有测试的方式。
原生模式
Fargate任务使用测试框架的专用图像,其中不包括金牛座。该解决方案不是编写 Taurus 配置,而是直接调用框架:jmeter -n -tk6 run、或。locust --headless它不传递任何负载参数。您的脚本是其生成的流量的唯一权限。
该设计会带来两个后果,它们都会影响您的测试规模:
-
任务使负荷成倍增加。每个任务都运行一个独立的框架进程,任务之间没有协调。因此,区域会为每项任务生成一份脚本声明负载的完整副本。例如,一个包含 200 个虚拟用户、运行五个任务的 k6 脚本将 1,000 个虚拟用户置于目标上。任务数是该解决方案在此模式下提供的唯一负载控制。它以脚本声明的整数倍移动。
-
安全持续时间限制了跑步的界限。由于脚本决定测试何时结束,因此该解决方案需要长达 24 小时的安全期限。如果持续时间过后测试仍在运行,则解决方案会停止框架。它收集运行部分的结果,并将运行记录为已完成而不是失败。
安排测试
该解决方案为运行负载测试提供了三个执行定时选项:
-
立即运行 -创建后立即运行负载测试
-
运行一次 -在未来的特定日期和时间运行测试
-
按计划运行 -使用 cron 表达式创建定期测试来定义计划
选择 “运行一次” 时,可以指定 24 小时格式的运行时间以及负载测试应开始运行的运行日期。
选择 “按计划运行” 时,您可以手动输入 cron 表达式,也可以从常见 cron 模式(例如每小时、每天在特定时间、工作日或每月)中进行选择。cron 表达式使用细粒度的计划格式,其中包含分钟、小时、月中某天、月、星期几和年的字段。您还必须指定到期日期,该日期定义了预定测试应何时停止运行。有关计划验证规则的更多信息,请参阅本指南的计划限制部分。
注意
-
测试持续时间:计划时考虑测试的总持续时间。例如,一项准备时间为 10 分钟、等待时间为 40 分钟的测试大约需要 80 分钟才能完成。
-
最小间隔:确保预定测试之间的间隔长于估计的测试持续时间。例如,如果测试大约需要 80 分钟,则将其安排为不超过每 3 小时运行一次。
-
每小时限制:即使预计的测试持续时间少于一小时,系统也不允许安排仅相差一小时的测试。
并行测试
每次运行负载测试时,任务运行器 AWS Lambda 函数都会创建一个EcsLoadTesting-<testId>-<region>
在运行测试的每个区域命名的亚马逊 CloudWatch 控制面板。 CloudWatch 控制面板实时显示在 Amazon ECS 集群中运行的所有任务的组合输出:平均响应时间、并发用户数、成功请求数和失败请求数。该解决方案按秒汇总每个指标,并每分钟更新仪表板。
同一测试场景的后续运行会更新相同的控制面板,因此您的账户为每个区域的每个测试场景都包含一个控制面板。测试完成后,这些仪表板仍保留在您的账户中。它们会按月收费,直到您将其删除。当您删除测试方案(例如,通过 Web 控制台)时,该解决方案会删除该场景的仪表板。当您删除解决方案的 CloudFormation 堆栈时,仪表板不会被删除。有关更多信息,请参阅本指南的 “成本” 部分和 “手动删除保留的资源” 部分。
User management
在初始配置期间,您提供用户名和电子邮件地址,Amazon Cognito 使用该用户名和电子邮件地址授予您访问解决方案的 Web 控制台的权限。控制台不提供用户管理。要添加其他用户,您必须使用亚马逊 Cognito 控制台。有关更多信息,请参阅 Amazon Cognito 开发人员指南中的管理用户池中的用户。
有关将现有用户迁移到亚马逊 Cognito 用户池的信息,请参阅 AWS 博客将用户迁移到亚马逊 Cognito 用户池的方法。
身份提供者联合
该解决方案的亚马逊 Cognito 用户池支持使用 SAML 2.0 或 OpenID Connect (OIDCIdPs) 协议与外部身份提供商 () 进行联合。Federation 允许用户使用其现有的公司或组织凭据而不是凭据登录 Web 控制台。 Cognito-native 联合用户获得的访问权限与直接在 Cognito 用户池中创建的用户相同。
该解决方案已经部署了 Cognito 用户池、域、应用程序客户端和托管用户界面。要启用联合,您只需要注册身份提供商并在现有应用程序客户端上启用它即可。
如果您部署可选的 MCP 服务器集成,则联合用户还可以使用相同的 Cognito 用户池凭据访问 MCP 服务器。
先决条件
在配置联邦之前,您需要满足以下条件:
-
支持 SAML 2.0 或 OIDC 的外部身份提供商
-
配置外部 IdP 的管理员权限(设置重定向 URI 或 ACS URL)
-
该解决方案的 Cognito 用户池 ID(可在 CloudFormation 堆栈资源或 Amazon Cognito 控制台中找到)
-
解决方案的 Cognito 域前缀(可在 CloudFormation 堆栈输出或 Cognito 控制台的应用程序集成 > 域下找到)
第 1 步:配置您的身份提供商
使用以下值配置您的外部身份提供商,以便它可以与解决方案的 Cognito 用户池进行通信。
对于 SAML 身份提供商:
-
SP 实体 ID:
urn:amazon:cognito:sp:_<UserPoolId>_ -
ACS 网址:
\https://<cognito-domain>.auth.<region>.amazoncognito.com/saml2/idpresponse
对于 OIDC 身份提供商:
-
重定向 URI:
\https://<cognito-domain>.auth.<region>.amazoncognito.com/oauth2/idpresponse
有关您的 IdP 需求的详细信息,请参阅 Amazon Cognito 开发人员指南中的向用户池添加 SAML 身份提供商或向用户池添加 OIDC 身份提供商。
第 2 步:在 Cognito 中注册身份提供商
使用亚马逊 Cognito 控制台将您的外部身份提供商添加到该解决方案的现有 Cognito 用户池中。
有关分步说明,请参阅 Amazon Cognito 开发人员指南中的通过第三方添加用户池登录。
步骤 3:配置属性映射
在身份提供商的声明和 Cognito 用户池属性之间配置属性映射。至少,将用户来自外部提供商的电子邮件声明映射到 Cognito email 属性。也可以考虑映射,name或者您的身份提供商nickname是否提供映射。
有关说明,请参阅 Amazon Cognito 开发人员指南中的为您的用户池指定身份提供商属性映射。
第 4 步:在应用程序客户端上启用身份提供商
在 Amazon Cognito 控制台中,找到解决方案创建的应用程序客户端,然后在托管用户界面设置下启用您的新身份提供商。
有关说明,请参阅 Amazon Cognito 开发人员指南中的配置用户池应用程序客户端。
注意
该解决方案已经配置了应用程序客户端的回调和注销网址、OAuth 范围和托管的用户界面域。您无需修改这些设置,只需在现有应用程序客户端上启用您的身份提供商即可。
重要
该解决方案故意从 CloudFormation 应用程序客户端配置中省略该SupportedIdentityProviders属性。这允许您在部署后添加身份提供商,而无需触发 CloudFormation 偏差检测。如果在模板中设置了此属性,则在下次堆栈更新时,通过控制台或 CLI 进行的任何手动 IdP 更改都将被覆盖,从而将应用程序客户端恢复为仅模板中列出的提供商。
由于省略了此属性,因此 CloudFormation 无法跟踪或管理应用程序客户端上启用了哪些身份提供商。配置联合后,您负责管理应用程序客户端SupportedIdentityProviders上的内容。要监控未经授权的更改,请启用 AWS CloudTrail 日志记录并创建 A mazon EventBridge 规则,以提醒针对该解决方案的 Cognito 用户池的 UpdateUserPoolClient API 调用。CreateIdentityProvider
注意
-
添加外部身份提供商并不会取消现有 Cognito-native 用户使用其当前凭证登录的能力。
-
联邦用户受到与 Cognito 用户池相同的区域可用性限制。有关更多信息,请参阅区域部署。
-
在将联合登录推广到您的组织之前,先与一小群用户一起测试联合登录。
禁用或删除默认 Cognito 用户
配置联合后,您可能需要禁用或删除堆栈部署期间创建的默认用户。这是可选的——默认用户可以继续使用联合登录。
要禁用用户,请在 Amazon Cognito 控制台中导航到该解决方案的 Cognito 用户池
有关更多详细信息,请参阅 Amazon Cognito 开发人员指南中的管理和搜索用户账户。
区域部署
该解决方案使用亚马逊 Cognito,它仅在特定的 AWS 区域可用。因此,您必须在可用 Amazon Cognito 的地区部署此解决方案。有关各地区的最新服务可用性,请参阅 AWS 区域服务清单