Summary
LocalStack 4.1 delivers major enhancements to its local AWS emulation platform, featuring a new Managed Service for Apache Flink provider, improved Step Functions capabilities with Variables and JSONata transformations, and a preview release of the LocalStack SDK for Java. The update includes significant improvements to existing services, such as composite alarm support in CloudWatch and a Python-based Event Rule engine. Other enhancements revolve around services like Glue, S3, and the Web Application, with new Web Application features and a RedShift Resource Browser.
AWS Features
- Support for [Managed Service for Apache Flink (MSAF)](https://docs.aws.amazon.com/managed-flink/latest/java/what-is.html) is now available to run Flink applications locally with several [AWS-compatible API operations](https://docs.localstack.cloud/references/coverage/coverage_kinesisanalyticsv2/?__hstc=181257784.1b0556d5a8929e33692c656cf7023b8e.1729592971125.1738057154353.1738221865743.49&__hssc=181257784.35.1738221865743&__hsfp=3213767220). This service was previously known as Kinesis Data Analytics v2. (🌟 pro)
- LocalStack now supports AWS Step Functions Workflow Variables and JSONata transformations, enabling local emulation of enhanced state management and data transformations.
- LocalStack now provides basic support for CloudWatch composite alarms, allowing alarm storage and limited evaluation with OR logic, ARN-based references, and SNS notifications.
Enhancements
- LocalStack now uses a Python-based Event Rule engine for event pattern matching in EventBridge, Pipes, and Lambda Event Source Mapping, replacing the Java-based AWS event ruler.
- LocalStack’s CloudFormation provider now includes these enhancements:
- Added support for the `CREATE`, and `DELETE` operations on the `AWS::MWAA::Environment`, `AWS::KinesisAnalyticsV2::Application`, and `AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption` resource type. (🌟 pro)
- Support for the `NoEcho` attribute in CloudFormation parameters was included to improve parity.
- Improved error messages on template parse or deploy failures.
- LocalStack’s Step Functions provider now includes the following enhancements:
- Step Functions interpreter now correctly parses `Comment` fields within choice rule composite statements (And/Or/Not), matching existing preprocessor behavior.
- Step Functions interpreter now correctly parses and evaluates `ContextObject` path bindings in `ErrorPath` and `CausePath` fields, resolving parse errors.
- Step Functions interpreter now supports cross-account task invocations via Credentials blocks. We have also enhanced sync callback handling for optimized service integrations to prevent `States.Runtime` exceptions.
- Step Functions interpreter now correctly handles `Output` blocks in choice rules and properly processes `Output`/`Assign` blocks sequentially.
- Improved request encoding in Step Functions for better handling of parameters when using Boto.
- Fixed nested Map state execution in Step Functions to process multiple levels correctly.
- Corrected retrieval of State Machine definitions in CloudFormation during stack updates.
- Ensured Step Functions use State Machine role credentials for service integrations.
- Step Functions now provides clearer error messages for JSONPath operations.
- Improved handling of `ItemsPath` in Distributed Map states.
- Enhanced timestamp validation in Step Functions.
- Allowed AWS-SDK integrations to retain specific error names for better error handling.
- Fixed parsing of version tokens in Step Functions to prevent conflicts.
- LocalStack’s Glue provider now includes the following enhancements: (🌟 pro)
- Support for Glue 5.0 along with the appropriate versioned JAR files.
- Support for Snowflake drivers in Glue jobs.
- Support for the `-extra-jars` option in AWS Glue within LocalStack. This option allows users to specify additional JAR files that can be included during Glue job execution. These JAR files can be used to extend the functionality of Glue jobs by providing custom libraries or dependencies.
- LocalStack’s S3 provider now includes the following enhancements:
- S3 `PutObject` operations now support the CRC64NVME checksum algorithm and include ChecksumType field, for enhanced data integrity features [as released by AWS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html).
- S3 now supports `FULL_OBJECT` checksum type for Multipart Uploads using CRC algorithms, enabling simplified checksum validation without tracking individual part checksums. This includes enhanced validation, proper error messaging, and checksum combination logic for parts verification.
- S3 `PutObject` and `CompleteMultipartUpload` now supports the [new Conditional Write feature](https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-s3-functionality-conditional-writes/) with the `IfMatch` parameter, also known as Compare-and-Swap.
- LocalStack container logs are now properly displayed when running with Podman.
- LocalStack now supports [Cognito User pool deletion protection](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-deletion-protection.html).
- Transparent Endpoint Injection is now supported for the [Batch provider](https://docs.localstack.cloud/user-guide/aws/batch/?__hstc=181257784.1b0556d5a8929e33692c656cf7023b8e.1729592971125.1738057154353.1738221865743.49&__hssc=181257784.35.1738221865743&__hsfp=3213767220). This feature enables your code to connect to other emulated AWS resources without needing to modify the code running in your local Batch jobs.
- The [`DescribeListenerAttributes`](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/API_DescribeListenerAttributes.html) operations are now supported in the [Elastic Load Balancing (ELB) provider](https://docs.localstack.cloud/user-guide/aws/elb/?__hstc=181257784.1b0556d5a8929e33692c656cf7023b8e.1729592971125.1738057154353.1738221865743.49&__hssc=181257784.35.1738221865743&__hsfp=3213767220).
- You can now use the `SNS_SES_SENDER_ADDRESS` configuration variable to customize the sender of SNS email notifications, defaulting to `adminlocalstack.com` if not configured.
- [Node.js 22 runtime Lambda runtime](https://aws.amazon.com/blogs/compute/node-js-22-runtime-now-available-in-aws-lambda/) is now supported in LocalStack.
- Error messages from failed ECS task containers now appear in LocalStack logs, removing the need for inspecting the container logs manually using the `ECS_REMOVE_CONTAINERS=0` configuration variable.
- Failed events from Lambda functions with Amazon Kinesis and Amazon DynamoDB event source mappings (ESMs) can now be sent to S3 buckets as a destination, in addition to the existing SNS and SQS options, [as supported by AWS](https://aws.amazon.com/about-aws/whats-new/2024/11/aws-lambda-s3-failed-event-destination-stream-event-sources/). Unlike with SNS and SQS failure destinations, a complete event payload data is written to S3.
- ELB endpoints are now accessible via `http://localhost:4566/_aws/elb/<elb-id>` path routing, enabling usage without subdomains in Ephemeral Instances or any other environment where subdomains are not supported.
- SageMaker provider now supports [multiple Production Variants](https://docs.aws.amazon.com/sagemaker/latest/dg/model-ab-testing.html) of deployments for A/B testing.
- EKS now supports using Minikube as the local cluster to start the Kubernetes cluster backing EKS. This can be achieved by setting the configuration variable `EKS_K8S_PROVIDER=local` and mounting the `$HOME/.kube/config` file, which contains the Minikube configuration, into the LocalStack container.
- SNS Filter Policy engine has been enhanced, and the support for [`cidr` operator](https://docs.aws.amazon.com/sns/latest/dg/string-value-matching.html#string-address-matching) has been added.
- AppSync VTL resolver function logs (via `$util.log`) now appear in LocalStack console for improved debugging experience.
- ECS is now supported as a target for EventBridge.
- Support for adding custom IDs for IAM roles and policies has been added to the IAM provider.
- Support for EventBridge API destinations and connections has been added.
- Extended [`ListFirewallRules` API](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_ListFirewallRules.html) in Route 53 Resolver to support filtering by action and priority parameters.
- Default Bedrock model has been switched to `smollm2:360m` to handle text model invocations.
- ELB rules now support all available [conditions](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html#options).
LocalStack Features
- Support for the official [LocalStack SDK for Java](https://docs.localstack.cloud/user-guide/tools/localstack-sdk/java/) is now available, enabling interaction with our proprietary features through our internal developer endpoints.
- LocalStack Web Application now includes a [Redshift](https://docs.localstack.cloud/user-guide/aws/redshift/) Resource Browser, offering a visual interface to manage local Redshift clusters.
- Users will now see a link to the Web Application every time they start LocalStack from the command line interface (CLI).
- Installed extensions will now appear at the top of the list on the Extensions Manager dashboard, making them easier to view and manage.
- [Chaos Engineering dashboard](https://app.localstack.cloud/inst/default/chaos-engineering) has been relocated to the Instance Management tab, where it now appears alongside other features to consolidate management tools for easier access.
- Support has been added for a new restart button on the Web Application, located under the instance name.
- Support has been added for a new Swagger UI button in the instance controls, which links to [`/_localstack/swagger`](https://localhost.localstack.cloud:4566/_localstack/swagger) for convenient access to API documentation.
Deprecations
- The `EVENT_RULE_ENGINE` configuration variable to set the Java rule engine has been deprecated. It is recommended to remove this legacy configuration.
What's Changed
Exciting New Features 🎉
* Add test for EventBridge Scheduler TagResource API and UntagResource API by kakakakakku in https://github.com/localstack/localstack/pull/11976
* Feature/Eventbridge v2: Support extending available targets by maxhoheiser in https://github.com/localstack/localstack/pull/11407
* Cloudwatch: add basic composite alarm support by tiurin in https://github.com/localstack/localstack/pull/11828
* Bump moto-ext to 5.0.22.post1 by viren-nadkarni in https://github.com/localstack/localstack/pull/12003
* StepFunctions: Base Support for Task Credentials by MEPalma in https://github.com/localstack/localstack/pull/11987
* Replicator implement cfn read for supported resources by cloutierMat in https://github.com/localstack/localstack/pull/12017
* StepFunctions: Fix Evaluation of Nested Map Runs by MEPalma in https://github.com/localstack/localstack/pull/12033
* StepFunctions: Fix Boto Request Encoding by MEPalma in https://github.com/localstack/localstack/pull/12035
* Refactor/events: Custom api destination and connection tests by maxhoheiser in https://github.com/localstack/localstack/pull/11999
* CloudFormation, Fix Retrieval of State Machine Definitions On Stack Update by MEPalma in https://github.com/localstack/localstack/pull/12044
* StepFunctions: Migration to String Expressions by MEPalma in https://github.com/localstack/localstack/pull/12028
* add replicator to Advanced section by cloutierMat in https://github.com/localstack/localstack/pull/12052
* add read/list methods for ec2 security-groups resource provider by pinzon in https://github.com/localstack/localstack/pull/12034
* Cfn support layer version read list by cloutierMat in https://github.com/localstack/localstack/pull/12060
* Bugfix/eventbridge/transformer issue with nested key by maxhoheiser in https://github.com/localstack/localstack/pull/11998
* StepFunctions: Ensure Service Integrations Assume State Machine Role Credentials by MEPalma in https://github.com/localstack/localstack/pull/12089
* allow setting of customId for IAM Roles by pinzon in https://github.com/localstack/localstack/pull/12077
* lambda layer enable deterministic layer version creation by cloutierMat in https://github.com/localstack/localstack/pull/12098
* Bugfix/eventbridge/process to all matching rules by maxhoheiser in https://github.com/localstack/localstack/pull/12090
* Add s3 as ESM failure destination for Kinesis and DynamoDB stream sources by tiurin in https://github.com/localstack/localstack/pull/12087
* StepFunctions: Better Error Messages For JSONPath Operations by MEPalma in https://github.com/localstack/localstack/pull/12094
* Bugfix/eventbridge/event bus desciption not asigned on create by maxhoheiser in https://github.com/localstack/localstack/pull/12100
* Refactor/events/custom api destination by maxhoheiser in https://github.com/localstack/localstack/pull/12057
* StepFunctions, improve the use of ItemsPath declarations in Distributed Map states by MEPalma in https://github.com/localstack/localstack/pull/12117
* add cc methods for lambda function resource provider by pinzon in https://github.com/localstack/localstack/pull/12111
* StepFunctions: Improvements to Timestamp Validation by MEPalma in https://github.com/localstack/localstack/pull/12074
* StepFunctions: Stateless evaluation of EvalComponents by MEPalma in https://github.com/localstack/localstack/pull/12068
* [ESM] Handle polling of batches exceeding SQS message limits by gregfurman in https://github.com/localstack/localstack/pull/12118
* StepFunctions: Support for Escape Sequences in JSONata String Literals by MEPalma in https://github.com/localstack/localstack/pull/12072
* StepFunctions: AWS-SDK Integration Retain Specific Error Names by MEPalma in https://github.com/localstack/localstack/pull/12161
* Remove deprecated Java-based event ruler by joe4dev in https://github.com/localstack/localstack/pull/12158
* StepFunctions: Clean-up legacy JSONata unit tests by MEPalma in https://github.com/localstack/localstack/pull/11921
* Step Functions, Support for Output Blocks in Choice Rules, Improvments to JSONata Choice Defaults by MEPalma in https://github.com/localstack/localstack/pull/12075
* StepFunctions: Fix Parsing of Version Tokens as Soft Keywords by MEPalma in https://github.com/localstack/localstack/pull/12190
* S3: implement new checksum algorithm CRC64NVME add ChecksumType for PutObject by bentsku in https://github.com/localstack/localstack/pull/12182
* S3: implement new data integrity for MultipartUpload by bentsku in https://github.com/localstack/localstack/pull/12183
Other Changes
* fix ASF code generation for recursive structures with keywords by alexrashed in https://github.com/localstack/localstack/pull/11972
* fix postgres install in pro test pipeline by alexrashed in https://github.com/localstack/localstack/pull/11974
* SNS: improve SNS Filter Policy engine and implement `cidr` operator by bentsku in https://github.com/localstack/localstack/pull/11979
* upgrade outdated github action in ASF update workflow by alexrashed in https://github.com/localstack/localstack/pull/11975
* Reject events larger than the max size allowed by xocasdashdash in https://github.com/localstack/localstack/pull/11623
* Events: EventRuleEngine: improve `cidr` to support ipv6 and better validation by bentsku in https://github.com/localstack/localstack/pull/11981
* fix SNS test with region replacement by bentsku in https://github.com/localstack/localstack/pull/11984
* Remove legacy event filtering implementation by joe4dev in https://github.com/localstack/localstack/pull/11985
* fix transformation for matching operations in aws::events::rule by pinzon in https://github.com/localstack/localstack/pull/11811
* [ESM] Handle Lambda TCP socket connection timeouts by gregfurman in https://github.com/localstack/localstack/pull/11977
* [ESM] Raise exception when setting DestinationConfig.OnSuccess by gregfurman in https://github.com/localstack/localstack/pull/11989
* added sql plugin validated test by erikmichel-dev in https://github.com/localstack/localstack/pull/11971
* apigw clean up the invalid json parser by cloutierMat in https://github.com/localstack/localstack/pull/11968
* [EventsBridge] Add validation for malformed Detail value by gregfurman in https://github.com/localstack/localstack/pull/11990
* [SFN] Correctly record failed EventsBridge PUT requests by gregfurman in https://github.com/localstack/localstack/pull/11991
* fix StringSplit regex escape by cloutierMat in https://github.com/localstack/localstack/pull/11995
* make SNS `SigningCertURL` configurable even if not resolvable by bentsku in https://github.com/localstack/localstack/pull/11993
* Update CODEOWNERS by localstack-bot in https://github.com/localstack/localstack/pull/12001
* Events: fix `numeric` operator string handling and provider validation for TestEventPattern by bentsku in https://github.com/localstack/localstack/pull/11994
* Allow usage of additional runtimes with the Lambda SnapStart feature enabled by dfangl in https://github.com/localstack/localstack/pull/12006
* Clarify usage counter descriptions by joe4dev in https://github.com/localstack/localstack/pull/12009
* enable localstack instance creation override for testing by cloutierMat in https://github.com/localstack/localstack/pull/11988
* Print web app URL in start command by gtsiolis in https://github.com/localstack/localstack/pull/12016
* fix APIGW test with hardcoded region by bentsku in https://github.com/localstack/localstack/pull/12020
* upgrade cryptography and amazon-kclpy by alexrashed in https://github.com/localstack/localstack/pull/12005
* [ESM] Validate filter criteria and unskip tests by gregfurman in https://github.com/localstack/localstack/pull/12018
* fix APIGW transformers to not do value replacement on port by bentsku in https://github.com/localstack/localstack/pull/12021
* add validation before creating an s3 bucket for scenario testing by pinzon in https://github.com/localstack/localstack/pull/12013
* APIGW: ParameterMapping skip if invalid input by bentsku in https://github.com/localstack/localstack/pull/12023
* apigw fix openapi request parameters by cloutierMat in https://github.com/localstack/localstack/pull/12027
* add silv-io as default reviewer for upgrade PRs by alexrashed in https://github.com/localstack/localstack/pull/12029
* fix `echo_http_server_post` returning double slash path by bentsku in https://github.com/localstack/localstack/pull/12032
* [ESM] Handle DynamoDB-local Invalid ShardID exception by gregfurman in https://github.com/localstack/localstack/pull/12036
* Unskip fixed event filtering tests by joe4dev in https://github.com/localstack/localstack/pull/11992
* Update CODEOWNERS by localstack-bot in https://github.com/localstack/localstack/pull/12039
* Unskip supported Lambda and ESM tests by joe4dev in https://github.com/localstack/localstack/pull/12012
* Bug fix: Dynamodb update_table missing table entries in output by IreneLime in https://github.com/localstack/localstack/pull/11938
* DynamoDB: Fix empty replicas list in response by viren-nadkarni in https://github.com/localstack/localstack/pull/12047
* bump minimum version of cbor by alexrashed in https://github.com/localstack/localstack/pull/12051
* feat(cloudformation): Add partial `NoEcho` parameter support by rominf in https://github.com/localstack/localstack/pull/11897
* fix client factory for bypassing DNS server by bentsku in https://github.com/localstack/localstack/pull/12059
* fix(11576): fixing bug in standardqueue put message by kshitijkohli in https://github.com/localstack/localstack/pull/11717
* Improve type safety of `container_exists` by martinfrancois in https://github.com/localstack/localstack/pull/12053
* Fix MacOS -> macOS by zuyu in https://github.com/localstack/localstack/pull/12055
* Fix swagger endpoint from ephemeral instance by giograno in https://github.com/localstack/localstack/pull/12026
* Upgrade lambda runtime init to version v0.1.31-pre by dfangl in https://github.com/localstack/localstack/pull/12050
* DDB: parity fix for JS clients by giograno in https://github.com/localstack/localstack/pull/12083
* LDR: selectable local mounts by simonrw in https://github.com/localstack/localstack/pull/12092
* allow setting of customId on IAM Policies by pinzon in https://github.com/localstack/localstack/pull/12073
* Improve error message for a missing parameter value - provide its name by asomov in https://github.com/localstack/localstack/pull/12086
* CFn: improve error messages by simonrw in https://github.com/localstack/localstack/pull/11591
* fix template body when using CFN create-stack by pinzon in https://github.com/localstack/localstack/pull/12097
* Update CODEOWNERS by localstack-bot in https://github.com/localstack/localstack/pull/12105
* remove references to the discuss forum by HarshCasper in https://github.com/localstack/localstack/pull/12106
* Relax healthcheck time constraints by displaylink-kstrzemp in https://github.com/localstack/localstack/pull/12067
* Add tests to source package exclusions in MANIFEST.in by silv-io in https://github.com/localstack/localstack/pull/12108
* Docker client: support lists for entrypoints by simonrw in https://github.com/localstack/localstack/pull/12093
* Bump moto-ext to 5.0.26.post1 by viren-nadkarni in https://github.com/localstack/localstack/pull/12079
* fix KMS DeriveSharedSecret by alvertogit in https://github.com/localstack/localstack/pull/12071
* DynamoDB: Disable Scalable Vector Extensions in JRE by viren-nadkarni in https://github.com/localstack/localstack/pull/12112
* Ship StepFunction JSONata dependency by default by joe4dev in https://github.com/localstack/localstack/pull/12110
* DynamoDB: fix GlobalSecondaryIndexes parity in Create and DescribeTable by bentsku in https://github.com/localstack/localstack/pull/12119
* Fix SSM parameter handling with paths and queries by ARN by dfangl in https://github.com/localstack/localstack/pull/12116
* Docker Utils: Utility method to create file in container by bblommers in https://github.com/localstack/localstack/pull/12122
* Update CODEOWNERS by localstack-bot in https://github.com/localstack/localstack/pull/12126
* Bump moto-ext to 5.0.26.post2 by viren-nadkarni in https://github.com/localstack/localstack/pull/12134
* Add tests for KMS resource tagging and untagging by k-a-il in https://github.com/localstack/localstack/pull/12121
* Match an empty prefix by groves in https://github.com/localstack/localstack/pull/12147
* Feature: filtering for ListFirewallRules in Route53Resolver by ecukalla in https://github.com/localstack/localstack/pull/11742
* Fix events cron regex for schedule-expression param validation by anisaoshafi in https://github.com/localstack/localstack/pull/12156
* Add validation for tags in kms service by k-a-il in https://github.com/localstack/localstack/pull/12142
* Fix legacy test that broke pipeline after eventbridge cron update by anisaoshafi in https://github.com/localstack/localstack/pull/12160
* S3: fix SSE-C parity error message by bentsku in https://github.com/localstack/localstack/pull/12162
* EventBridge: fix empty conditions in event rule engine by bentsku in https://github.com/localstack/localstack/pull/12154
* fix pre-signed URL with JS SDK, enable test_presigned_url_v4_x_amz_in_qs by bentsku in https://github.com/localstack/localstack/pull/12164
* fix cfn template join with noValue by pinzon in https://github.com/localstack/localstack/pull/12163
* APIGW: fix OpenAPI import StatusCode string casting by bentsku in https://github.com/localstack/localstack/pull/12137
* S3: fix trailing slash logic by bentsku in https://github.com/localstack/localstack/pull/12166
* Skip flaky StepFunction timeout test by joe4dev in https://github.com/localstack/localstack/pull/12173
* S3: fix exception from ObjectLock retention by bentsku in https://github.com/localstack/localstack/pull/12165
* update kinesis-mock from 0.4.7 to 0.4.8 by alexrashed in https://github.com/localstack/localstack/pull/12178
* S3: fix ContentEncoding with aws-chunked by bentsku in https://github.com/localstack/localstack/pull/12167
* Update cbor 2 requirement to 5.5 by hammer498 in https://github.com/localstack/localstack/pull/11704
* SNS: fix Subscribe non existent topic exception by bentsku in https://github.com/localstack/localstack/pull/12175
* Fix missing symbol in HTML generation of metrics coverage report by vignesh1507 in https://github.com/localstack/localstack/pull/11668
* Fix: validate schedule_expression for EventBridge Scheduler by anisaoshafi in https://github.com/localstack/localstack/pull/12191
* CFN/EC2: fix KeyError for EC2:Instance PublicIpAddress by bentsku in https://github.com/localstack/localstack/pull/12176
* Add docker stats functionality to docker clients by silv-io in https://github.com/localstack/localstack/pull/12170
* Fix wrong dash symbol in README by odlot in https://github.com/localstack/localstack/pull/12058
* SNS : fix Message Signature typo and add Lambda URL fixture by bentsku in https://github.com/localstack/localstack/pull/12181
* adjust --follow arg positioning to be compatible with docker and podman by cfeller in https://github.com/localstack/localstack/pull/12200
* fix: Explicitly stop ESM workers on LocalStack shutdown by gregfurman in https://github.com/localstack/localstack/pull/12203
New Contributors
* xocasdashdash made their first contribution in https://github.com/localstack/localstack/pull/11623
* kakakakakku made their first contribution in https://github.com/localstack/localstack/pull/11976
* erikmichel-dev made their first contribution in https://github.com/localstack/localstack/pull/11971
* tiurin made their first contribution in https://github.com/localstack/localstack/pull/11828
* IreneLime made their first contribution in https://github.com/localstack/localstack/pull/11938
* rominf made their first contribution in https://github.com/localstack/localstack/pull/11897
* kshitijkohli made their first contribution in https://github.com/localstack/localstack/pull/11717
* martinfrancois made their first contribution in https://github.com/localstack/localstack/pull/12053
* zuyu made their first contribution in https://github.com/localstack/localstack/pull/12055
* asomov made their first contribution in https://github.com/localstack/localstack/pull/12086
* displaylink-kstrzemp made their first contribution in https://github.com/localstack/localstack/pull/12067
* alvertogit made their first contribution in https://github.com/localstack/localstack/pull/12071
* k-a-il made their first contribution in https://github.com/localstack/localstack/pull/12121
* groves made their first contribution in https://github.com/localstack/localstack/pull/12147
* ecukalla made their first contribution in https://github.com/localstack/localstack/pull/11742
* hammer498 made their first contribution in https://github.com/localstack/localstack/pull/11704
* odlot made their first contribution in https://github.com/localstack/localstack/pull/12058
* cfeller made their first contribution in https://github.com/localstack/localstack/pull/12200
**Full Changelog**: https://github.com/localstack/localstack/compare/v4.0.3...v4.1.0