Skip to content

Commit d9882b2

Browse files
authored
Merge pull request #269 from aws-solutions/release/v4.0.2
Changes for release/v4.0.2
2 parents da9b4a8 + ca8e8da commit d9882b2

File tree

37 files changed

+214
-80
lines changed

37 files changed

+214
-80
lines changed

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [4.0.2] - 2025-12-09
9+
10+
### Changed
11+
12+
- `jetty-http` package has been reverted to a previous version to support [HTTP2](https://github.com/Blazemeter/jmeter-http2-plugin/blob/master/README.md) JMeter plugin.
13+
- Improvements to cron-base scheduling with clarification between UTC and local time zones.
14+
15+
### Fixed
16+
17+
- Resolved issues related to zipped files when migrating from v3 for v4. Load tests created in v3 should now correctly reference the existing zip test script and be downloadable from the test scenario page.
18+
- Fixed a bug where tags would not be saved when creating or updating a scheduled load test.
19+
- Fixed a bug where non-integer http status code responses would fail to render in the results dashboard.
20+
21+
### Security
22+
23+
- Update to address vulnerability in [CVE-2025-66418](https://nvd.nist.gov/vuln/detail/CVE-2025-66418)
24+
- Update to address vulnerability in [CVE-2025-66471](https://nvd.nist.gov/vuln/detail/CVE-2025-66471)
25+
- Upgrade to the latest Amazon Linux base image SHA256 hash
26+
827
## [4.0.1] - 2025-11-21
928

1029
### Security

README.md

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
# Distributed Load Testing on AWS
22

3-
The Distributed Load Testing Solution leverages managed, highly available and highly scalable AWS services to effortlessly create and simulate thousands of connected users generating a selected amount of transactions per second, originating from up to 5 simultaneous AWS regions. As a result, developers can understand the behavior of their applications at scale and at load to identify any bottleneck problems before they deploy to Production. [Launch in the AWS Console](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?&templateURL=https://solutions-reference.s3.amazonaws.com/distributed-load-testing-on-aws/latest/distributed-load-testing-on-aws.template&redirectId=GitHub)
3+
Distributed Load Testing on AWS helps you automate performance testing of your software applications at scale to identify bottlenecks before you release your application. This solution simulates thousands of connected users generating HTTP requests at a sustained rate without the need to provision servers.
4+
5+
* Deploy Amazon ECS on AWS Fargate containers that run independently to test the load capacity of your application.
6+
* Simulate tens of thousands of concurrent users across multiple AWS Regions generating requests at a continuous pace.
7+
* Customize your application tests using [JMeter](https://jmeter.apache.org/), [K6](https://k6.io/), [Locust](https://locust.io/) test scripts, or simple HTTP endpoint configuration.
8+
* Schedule load tests to run immediately, at a future date and time, or on a recurring schedule.
9+
* Run multiple load tests concurrently across different scenarios and regions.
10+
11+
The intended audience for using this solution's features and capabilities in their environment includes IT infrastructure architects, administrators, and DevOps professionals who have practical experience architecting in the AWS Cloud. As a result, developers can understand the behavior of their applications at scale and at load to identify any bottleneck problems before they deploy to Production. [Launch in the AWS Console](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?&templateURL=https://solutions-reference.s3.amazonaws.com/distributed-load-testing-on-aws/latest/distributed-load-testing-on-aws.template&redirectId=GitHub)
412

513
## On this Page
614

@@ -15,35 +23,49 @@ The Distributed Load Testing Solution leverages managed, highly available and hi
1523

1624
![Architecture](architecture.png)
1725

18-
The high-level process flow for the solution components deployed with the AWS CloudFormation template is as follows:
26+
Deploying this solution with the default parameters deploys the following components in your AWS account.
27+
28+
> **Note**: AWS CloudFormation resources are created from AWS Cloud Development Kit (AWS CDK) constructs.
1929
20-
1. A distributed load tester API, which leverages [Amazon API Gateway](https://aws.amazon.com/api-gateway) to invoke the solution's microservices ([AWS Lambda](https://aws.amazon.com/lambda) functions).
30+
The high-level process flow for the solution components deployed with the AWS CloudFormation template is as follows:
31+
32+
1. A distributed load tester API leverages [Amazon API Gateway](https://aws.amazon.com/api-gateway) to invoke the solution's microservices ([AWS Lambda](https://aws.amazon.com/lambda) functions).
2133

2234
2. The microservices provide the business logic to manage test data and run the tests.
2335

24-
3. These microservices interact with [Amazon Simple Storage Service](https://aws.amazon.com/s3) (Amazon S3), [Amazon DynamoDB](https://aws.amazon.com/dynamodb), and [AWS Step Functions](https://aws.amazon.com/step-functions) to provide storage for the test scenario details and results and run test scenarios.
36+
3. These microservices interact with [Amazon Simple Storage Service](https://aws.amazon.com/s3) (Amazon S3), [Amazon DynamoDB](https://aws.amazon.com/dynamodb), and [AWS Step Functions](https://aws.amazon.com/step-functions) to store test scenario details and results and to orchestrate test execution.
37+
38+
4. An [Amazon Virtual Private Cloud](https://aws.amazon.com/vpc) (Amazon VPC) network topology deploys containing the solution's [Amazon Elastic Container Service](https://aws.amazon.com/ecs) (Amazon ECS) containers running on [AWS Fargate](https://aws.amazon.com/fargate).
2539

26-
4. An [Amazon Virtual Private Cloud](https://aws.amazon.com/vpc) (Amazon VPC) network topology is deployed containing the solution\'s [Amazon Elastic Container Service](https://aws.amazon.com/ecs) (Amazon ECS) containers running on [AWS Fargate](https://aws.amazon.com/fargate).
40+
5. The containers use an [Amazon Linux 2023](https://aws.amazon.com/linux/amazon-linux-2023/) base image with the [Taurus](https://gettaurus.org/) load testing framework installed. Taurus is an open-source test automation framework that supports JMeter, K6, Locust, and other testing tools. The container image is [Open Container Initiative](https://opencontainers.org/) (OCI) compliant and hosted by AWS in an [Amazon Elastic Container Registry](https://aws.amazon.com/ecr) (Amazon ECR) public repository. For more information, refer to [Container image customization](https://docs.aws.amazon.com/solutions/latest/distributed-load-testing-on-aws/container-image.html).
2741

28-
5. The containers include the [Amazon Linux 2023](https://aws.amazon.com/linux/amazon-linux-2023/) based [Open Container Initiative](https://opencontainers.org/) (OCI) compliant container image with the Taurus open-source test automation framework installed, which orchestrates load generation using Apache JMeter (default), K6, or Locust. The container image is hosted by AWS in an [Amazon Elastic Container Registry](https://aws.amazon.com/ecr) (Amazon ECR) public repository. For more information about the ECR image repository, refer to [Container image customization](https://docs.aws.amazon.com/solutions/latest/distributed-load-testing-on-aws/container-image.html).
42+
6. A web console powered by [AWS Amplify](https://aws.amazon.com/amplify) deploys into an S3 bucket configured for static web hosting.
2943

30-
6. A web console powered by [AWS Amplify](https://aws.amazon.com/amplify) is deployed it into an Amazon S3 bucket configured for static web hosting.
44+
7. [Amazon CloudFront](https://aws.amazon.com/cloudfront) provides secure, public access to the solution's website bucket contents.
3145

32-
7. [Amazon CloudFront](https://aws.amazon.com/cloudfront) provides secure, public access to the solution\'s website bucket contents.
46+
8. During initial configuration, the solution creates a default administrator role (IAM role) and sends an access invite to a customer-specified user email address.
3347

34-
8. During initial configuration, this solution also creates a default solution administrator role (IAM role) and sends an access invite to a customer-specified user email address.
48+
9. An [Amazon Cognito](https://aws.amazon.com/cognito) user pool manages user access to the console, the distributed load tester API, and the MCP Server.
3549

36-
9. An [Amazon Cognito](https://aws.amazon.com/cognito) user pool manages user access to the console and the distributed load tester API.
50+
10. After you deploy this solution, you can use the web console or APIs to create and run test scenarios that define a series of tasks.
3751

38-
10. After you deploy this solution, you can use the web console to create a test scenario that defines a series of tasks.
52+
11. The microservices use this test scenario to run ECS tasks on Fargate in the specified Regions.
3953

40-
11. The microservices use this test scenario to run Amazon ECS on AWS Fargate tasks in the Regions specified.
54+
12. When the test completes, the solution stores results in S3 and DynamoDB and logs output in [Amazon CloudWatch](https://aws.amazon.com/cloudwatch).
4155

42-
12. In addition to storing the results in Amazon S3 and DynamoDB, once the test is complete the output is logged in [Amazon CloudWatch](https://aws.amazon.com/cloudwatch).
56+
13. If you enable the live data option, the solution sends CloudWatch logs from the Fargate tasks to a Lambda function during the test for each Region where the test runs.
4357

44-
13. If you select the live data option, the solution sends the Amazon CloudWatch logs for the AWS Fargate tasks to a Lambda function during the test, for each Region in which the test was run.
58+
14. The Lambda function publishes the data to the corresponding topic in [AWS IoT Core](https://aws.amazon.com/iot-core) in the Region where the main stack was deployed. The web console subscribes to the topic and displays real-time data while the test runs.
4559

46-
14. The Lambda function then publishes the data to the corresponding topic in [AWS IoT Core](https://aws.amazon.com/iot-core) in the Region where the main stack was deployed. The web console subscribes to the topic, and you can see the data while the test runs in the web console.
60+
### MCP Server Integration (Optional)
61+
62+
> **Note**: The following steps describe the optional MCP Server integration for AI-assisted load testing analysis. This component is only deployed if you select the MCP Server option during solution deployment.
63+
64+
15. An MCP client (AI development tool) connects to the [AWS AgentCore Gateway](https://aws.amazon.com/bedrock/agentcore/) endpoint to access the Distributed Load Testing solution's data through the Model Context Protocol. AgentCore Gateway validates the user's Cognito authentication token to ensure authorized access to the MCP server.
65+
66+
16. Upon successful authentication, AgentCore Gateway forwards the MCP tool request to the DLT MCP Server Lambda function. The Lambda function returns the structured data to AgentCore Gateway, which sends it back to the MCP client for AI-assisted analysis and insights.
67+
68+
17. The Lambda function processes the request and queries the appropriate AWS resources (DynamoDB tables, S3 buckets, or CloudWatch logs) to retrieve the requested load testing data.
4769

4870
## Deployment
4971

@@ -96,6 +118,9 @@ A NodeJS Lambda function that checks if the Amazon ECS tasks are running or not.
96118
**source/webui**<br/>
97119
React-based single page application that provides the web console interface for the solution. Built with Cloudscape Design System, Redux for state management, and AWS Amplify for authentication. Authenticated through Amazon Cognito, this dashboard allows users to create tests and view results.
98120

121+
**source/mcp-server**<br/>
122+
A TypeScript package that implements the Model Context Protocol (MCP) server for AI-assisted load testing analysis. Provides structured access to DLT data through AWS AgentCore Gateway.
123+
99124
## Local Development
100125

101126
For developers working on the solution locally, this section provides step-by-step instructions for setting up and deploying DLT from source code.

VERSION.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.0.1
1+
4.0.2

architecture.png

-691 KB
Loading

deployment/ecr/distributed-load-testing-on-aws-load-tester/Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM public.ecr.aws/amazonlinux/amazonlinux:2023-minimal@sha256:c69a151043b0e0e7d0362ab283299267580f5a5a4cf08131eb61b9528eaec882
1+
FROM public.ecr.aws/amazonlinux/amazonlinux:2023-minimal@sha256:3f6c5a2858113e9bb6710dfccdace7dc698e83f7a012240a1d07b3a46d273999
22

33
RUN dnf upgrade -y --refresh && \
44
dnf install -y python3.11 python3.11-pip java-21-amazon-corretto bc procps jq findutils unzip && \
@@ -36,5 +36,10 @@ RUN rm -rf /tmp/jmeter-plugins-manager-1* && \
3636
# Add settings file to capture the output logs from bzt cli
3737
RUN mkdir -p /etc/bzt.d && echo '{"settings": {"artifacts-dir": "/tmp/artifacts"}}' > /etc/bzt.d/90-artifacts-dir.json
3838

39+
# Temporary fix for CVE-2025-66418 and CVE-2025-66471 in urllib3 2.5.0
40+
# This must be upgraded after bzt setup to satisfy bzt requirements.txt
41+
# https://github.com/Blazemeter/taurus/blob/647dd34ab318b5d3060a8c6ce2e5b047a0efddd2/requirements.txt
42+
RUN $PIP_INSTALL 'urllib3>=2.6.0'
43+
3944
WORKDIR /bzt-configs
4045
ENTRYPOINT ["./load-test.sh"]

deployment/ecr/distributed-load-testing-on-aws-load-tester/jar_updater.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"dnsjava": "dnsjava/dnsjava/3.6.1/dnsjava-3.6.1.jar",
6969
"xstream": "com/thoughtworks/xstream/xstream/1.4.21/xstream-1.4.21.jar",
7070
"http2-hpack": "org/eclipse/jetty/http2/http2-hpack/11.0.26/http2-hpack-11.0.26.jar",
71-
"jetty-http": "org/eclipse/jetty/jetty-http/12.0.25/jetty-http-12.0.25.jar",
71+
"jetty-http": "org/eclipse/jetty/jetty-http/11.0.26/jetty-http-11.0.26.jar",
7272
"http2-common": "org/eclipse/jetty/http2/http2-common/11.0.26/http2-common-11.0.26.jar",
7373
"kotlin-stdlib": "org/jetbrains/kotlin/kotlin-stdlib/2.1.0/kotlin-stdlib-2.1.0.jar",
7474
"commons-lang3": "org/apache/commons/commons-lang3/3.18.0/commons-lang3-3.18.0.jar",

deployment/ecr/distributed-load-testing-on-aws-load-tester/load-test.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,11 @@ if [ "$TEST_TYPE" != "simple" ]; then
106106
exit 1
107107
fi
108108

109-
sed -i -e "s|$TEST_ID.zip|$TEST_SCRIPT|g" test.json
109+
# Update test.json to reference the test script extracted from the zip.
110+
# Prior to v4.0, zipped test scripts were stored with their framework's expected extension (e.g. JMeter zip would be ABCDE12345.jmx instead of ABCDE12345.zip).
111+
# test.json may reference $TEST_ID.$EXT (legacy to support .jmx) or $TEST_ID.zip (current).
112+
# The two sed replacements ensure either file name is correctly updated to the actual test script value.
113+
sed -i -e "s|$TEST_ID.$EXT|$TEST_SCRIPT|g" -e "s|$TEST_ID.zip|$TEST_SCRIPT|g" test.json
110114

111115
# copy bundled plugin jars to jmeter extension folder to make them available to jmeter
112116
BUNDLED_PLUGIN_DIR=`find $PWD -type d -name "plugins" | head -n 1`

solution-manifest.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
id: SO0062
22
name: distributed-load-testing-on-aws
3-
version: v4.0.1
3+
version: v4.0.2
44
cloudformation_templates:
55
- template: distributed-load-testing-on-aws.template
66
main_template: true

source/api-services/lib/scenarios/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,9 @@ const scheduleTest = async (event, context) => { // NOSONAR
699699

700700
//Update DynamoDB if table was not already updated by "create" schedule step
701701
if (config.scheduleStep || !recurrence) {
702+
// Validate and normalize tags
703+
const validatedTags = validateTags(config.tags);
704+
702705
const updateDBData = {
703706
testId,
704707
testName: config.testName,
@@ -714,6 +717,7 @@ const scheduleTest = async (event, context) => { // NOSONAR
714717
fileType: config.fileType,
715718
cronValue,
716719
cronExpiryDate,
720+
tags: validatedTags,
717721
};
718722
let data = await updateTestDBEntry(updateDBData);
719723
console.log(`Schedule test complete: testId=${testId}, status=scheduled`);

source/api-services/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)