v4.1.0
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) is now available to run Flink applications locally with several AWS-compatible API operations. 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
, andDELETE
operations on theAWS::MWAA::Environment
,AWS::KinesisAnalyticsV2::Application
, andAWS::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.
- Added support for the
- 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 inErrorPath
andCausePath
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 processesOutput
/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.
- Step Functions interpreter now correctly parses
- 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. - 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
andCompleteMultipartUpload
now supports the new Conditional Write feature with theIfMatch
parameter, also known as Compare-and-Swap.
- S3
- LocalStack container logs are now properly displayed when running with Podman.
- LocalStack now supports Cognito User pool deletion protection.
- Transparent Endpoint Injection is now supported for the Batch provider. 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
operations are now supported in the Elastic Load Balancing (ELB) provider. - You can now use the
SNS_SES_SENDER_ADDRESS
configuration variable to customize the sender of SNS email notifications, defaulting to[email protected]
if not configured. - Node.js 22 runtime Lambda runtime 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. 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 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 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 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.
LocalStack Features
- Support for the official LocalStack SDK for Java is now available, enabling interaction with our proprietary features through our internal developer endpoints.
- LocalStack Web Application now includes a 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 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
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 #11976
- Feature/Eventbridge v2: Support extending available targets by @maxhoheiser in #11407
- Cloudwatch: add basic composite alarm support by @tiurin in #11828
- Bump moto-ext to 5.0.22.post1 by @viren-nadkarni in #12003
- StepFunctions: Base Support for Task Credentials by @MEPalma in #11987
- Replicator implement cfn read for supported resources by @cloutierMat in #12017
- StepFunctions: Fix Evaluation of Nested Map Runs by @MEPalma in #12033
- StepFunctions: Fix Boto Request Encoding by @MEPalma in #12035
- Refactor/events: Custom api destination and connection tests by @maxhoheiser in #11999
- CloudFormation, Fix Retrieval of State Machine Definitions On Stack Update by @MEPalma in #12044
- StepFunctions: Migration to String Expressions by @MEPalma in #12028
- add replicator to Advanced section by @cloutierMat in #12052
- add read/list methods for ec2 security-groups resource provider by @pinzon in #12034
- Cfn support layer version read list by @cloutierMat in #12060
- Bugfix/eventbridge/transformer issue with nested key by @maxhoheiser in #11998
- StepFunctions: Ensure Service Integrations Assume State Machine Role Credentials by @MEPalma in #12089
- allow setting of customId for IAM Roles by @pinzon in #12077
- lambda layer enable deterministic layer version creation by @cloutierMat in #12098
- Bugfix/eventbridge/process to all matching rules by @maxhoheiser in #12090
- Add s3 as ESM failure destination for Kinesis and DynamoDB stream sources by @tiurin in #12087
- StepFunctions: Better Error Messages For JSONPath Operations by @MEPalma in #12094
- Bugfix/eventbridge/event bus desciption not asigned on create by @maxhoheiser in #12100
- Refactor/events/custom api destination by @maxhoheiser in #12057
- StepFunctions, improve the use of ItemsPath declarations in Distributed Map states by @MEPalma in #12117
- add cc methods for lambda function resource provider by @pinzon in #12111
- StepFunctions: Improvements to Timestamp Validation by @MEPalma in #12074
- StepFunctions: Stateless evaluation of EvalComponents by @MEPalma in #12068
- [ESM] Handle polling of batches exceeding SQS message limits by @gregfurman in #12118
- StepFunctions: Support for Escape Sequences in JSONata String Literals by @MEPalma in #12072
- StepFunctions: AWS-SDK Integration Retain Specific Error Names by @MEPalma in #12161
- Remove deprecated Java-based event ruler by @joe4dev in #12158
- StepFunctions: Clean-up legacy JSONata unit tests by @MEPalma in #11921
- Step Functions, Support for Output Blocks in Choice Rules, Improvments to JSONata Choice Defaults by @MEPalma in #12075
- StepFunctions: Fix Parsing of Version Tokens as Soft Keywords by @MEPalma in #12190
- S3: implement new checksum algorithm CRC64NVME add ChecksumType for PutObject by @bentsku in #12182
- S3: implement new data integrity for MultipartUpload by @bentsku in #12183
Other Changes
- fix ASF code generation for recursive structures with keywords by @alexrashed in #11972
- fix postgres install in pro test pipeline by @alexrashed in #11974
- SNS: improve SNS Filter Policy engine and implement
cidr
operator by @bentsku in #11979 - upgrade outdated github action in ASF update workflow by @alexrashed in #11975
- Reject events larger than the max size allowed by @xocasdashdash in #11623
- Events: EventRuleEngine: improve
cidr
to support ipv6 and better validation by @bentsku in #11981 - fix SNS test with region replacement by @bentsku in #11984
- Remove legacy event filtering implementation by @joe4dev in #11985
- fix transformation for matching operations in aws::events::rule by @pinzon in #11811
- [ESM] Handle Lambda TCP socket connection timeouts by @gregfurman in #11977
- [ESM] Raise exception when setting DestinationConfig.OnSuccess by @gregfurman in #11989
- added sql plugin validated test by @erikmichel-dev in #11971
- apigw clean up the invalid json parser by @cloutierMat in #11968
- [EventsBridge] Add validation for malformed Detail value by @gregfurman in #11990
- [SFN] Correctly record failed EventsBridge PUT requests by @gregfurman in #11991
- fix StringSplit regex escape by @cloutierMat in #11995
- make SNS
SigningCertURL
configurable even if not resolvable by @bentsku in #11993 - Update CODEOWNERS by @localstack-bot in #12001
- Events: fix
numeric
operator string handling and provider validation for TestEventPattern by @bentsku in #11994 - Allow usage of additional runtimes with the Lambda SnapStart feature enabled by @dfangl in #12006
- Clarify usage counter descriptions by @joe4dev in #12009
- enable localstack instance creation override for testing by @cloutierMat in #11988
- Print web app URL in start command by @gtsiolis in #12016
- fix APIGW test with hardcoded region by @bentsku in #12020
- upgrade cryptography and amazon-kclpy by @alexrashed in #12005
- [ESM] Validate filter criteria and unskip tests by @gregfurman in #12018
- fix APIGW transformers to not do value replacement on port by @bentsku in #12021
- add validation before creating an s3 bucket for scenario testing by @pinzon in #12013
- APIGW: ParameterMapping skip if invalid input by @bentsku in #12023
- apigw fix openapi request parameters by @cloutierMat in #12027
- add silv-io as default reviewer for upgrade PRs by @alexrashed in #12029
- fix
echo_http_server_post
returning double slash path by @bentsku in #12032 - [ESM] Handle DynamoDB-local Invalid ShardID exception by @gregfurman in #12036
- Unskip fixed event filtering tests by @joe4dev in #11992
- Update CODEOWNERS by @localstack-bot in #12039
- Unskip supported Lambda and ESM tests by @joe4dev in #12012
- Bug fix: Dynamodb update_table missing table entries in output by @IreneLime in #11938
- DynamoDB: Fix empty replicas list in response by @viren-nadkarni in #12047
- bump minimum version of cbor by @alexrashed in #12051
- feat(cloudformation): Add partial
NoEcho
parameter support by @rominf in #11897 - fix client factory for bypassing DNS server by @bentsku in #12059
- fix(11576): fixing bug in standardqueue put message by @kshitijkohli in #11717
- Improve type safety of
container_exists
by @martinfrancois in #12053 - Fix MacOS -> macOS by @zuyu in #12055
- Fix swagger endpoint from ephemeral instance by @giograno in #12026
- Upgrade lambda runtime init to version v0.1.31-pre by @dfangl in #12050
- DDB: parity fix for JS clients by @giograno in #12083
- LDR: selectable local mounts by @simonrw in #12092
- allow setting of customId on IAM Policies by @pinzon in #12073
- Improve error message for a missing parameter value - provide its name by @asomov in #12086
- CFn: improve error messages by @simonrw in #11591
- fix template body when using CFN create-stack by @pinzon in #12097
- Update CODEOWNERS by @localstack-bot in #12105
- remove references to the discuss forum by @HarshCasper in #12106
- Relax healthcheck time constraints by @displaylink-kstrzemp in #12067
- Add tests to source package exclusions in MANIFEST.in by @silv-io in #12108
- Docker client: support lists for entrypoints by @simonrw in #12093
- Bump moto-ext to 5.0.26.post1 by @viren-nadkarni in #12079
- fix KMS DeriveSharedSecret by @alvertogit in #12071
- DynamoDB: Disable Scalable Vector Extensions in JRE by @viren-nadkarni in #12112
- Ship StepFunction JSONata dependency by default by @joe4dev in #12110
- DynamoDB: fix GlobalSecondaryIndexes parity in Create and DescribeTable by @bentsku in #12119
- Fix SSM parameter handling with paths and queries by ARN by @dfangl in #12116
- Docker Utils: Utility method to create file in container by @bblommers in #12122
- Update CODEOWNERS by @localstack-bot in #12126
- Bump moto-ext to 5.0.26.post2 by @viren-nadkarni in #12134
- Add tests for KMS resource tagging and untagging by @k-a-il in #12121
- Match an empty prefix by @groves in #12147
- Feature: filtering for ListFirewallRules in Route53Resolver by @ecukalla in #11742
- Fix events cron regex for schedule-expression param validation by @anisaoshafi in #12156
- Add validation for tags in kms service by @k-a-il in #12142
- Fix legacy test that broke pipeline after eventbridge cron update by @anisaoshafi in #12160
- S3: fix SSE-C parity error message by @bentsku in #12162
- EventBridge: fix empty conditions in event rule engine by @bentsku in #12154
- fix pre-signed URL with JS SDK, enable test_presigned_url_v4_x_amz_in_qs by @bentsku in #12164
- fix cfn template join with noValue by @pinzon in #12163
- APIGW: fix OpenAPI import StatusCode string casting by @bentsku in #12137
- S3: fix trailing slash logic by @bentsku in #12166
- Skip flaky StepFunction timeout test by @joe4dev in #12173
- S3: fix exception from ObjectLock retention by @bentsku in #12165
- update kinesis-mock from 0.4.7 to 0.4.8 by @alexrashed in #12178
- S3: fix ContentEncoding with aws-chunked by @bentsku in #12167
- Update cbor 2 requirement to 5.5 by @hammer498 in #11704
- SNS: fix Subscribe non existent topic exception by @bentsku in #12175
- Fix missing symbol in HTML generation of metrics coverage report by @vignesh1507 in #11668
- Fix: validate schedule_expression for EventBridge Scheduler by @anisaoshafi in #12191
- CFN/EC2: fix KeyError for EC2:Instance PublicIpAddress by @bentsku in #12176
- Add docker stats functionality to docker clients by @silv-io in #12170
- Fix wrong dash symbol in README by @odlot in #12058
- SNS : fix Message Signature typo and add Lambda URL fixture by @bentsku in #12181
- adjust --follow arg positioning to be compatible with docker and podman by @cfeller in #12200
- fix: Explicitly stop ESM workers on LocalStack shutdown by @gregfurman in #12203
New Contributors
- @xocasdashdash made their first contribution in #11623
- @kakakakakku made their first contribution in #11976
- @erikmichel-dev made their first contribution in #11971
- @tiurin made their first contribution in #11828
- @IreneLime made their first contribution in #11938
- @rominf made their first contribution in #11897
- @kshitijkohli made their first contribution in #11717
- @martinfrancois made their first contribution in #12053
- @zuyu made their first contribution in #12055
- @asomov made their first contribution in #12086
- @displaylink-kstrzemp made their first contribution in #12067
- @alvertogit made their first contribution in #12071
- @k-a-il made their first contribution in #12121
- @groves made their first contribution in #12147
- @ecukalla made their first contribution in #11742
- @hammer498 made their first contribution in #11704
- @odlot made their first contribution in #12058
- @cfeller made their first contribution in #12200
Full Changelog: v4.0.3...v4.1.0