Summary
LocalStack v4.8 brings one-click Lambda debugging with the AWS Toolkit for VS Code, a new CloudFormation engine, and an ECS-based Batch provider. The release also adds Kubernetes support for Redis, Route 53 β S3 website routing, and several enhancements to other AWS services like RDS Data, CloudFront, EKS, SQS, and CodeBuild, alongside major upgrades to the LocalStack Toolkit for VS Code.
AWS Features
- LocalStack integrates with the AWS Toolkit for VS Code, enabling one-click remote debugging of Lambda functions. You can set breakpoints, step through code, and inspect variables directly in your IDE. Debugger instrumentation is now automatic for Python, Node.js, and Java runtimes, eliminating the need for manual setup or boilerplate code. Check out our blog for more information.
- LocalStack introduces a new CloudFormation engine with improved parity for
UPDATE
operations and closer alignment with AWS. The legacy engine remains available (PROVIDER_OVERRIDE_CLOUDFORMATION=engine-legacy
) for backwards compatibility, but all new features and fixes will target the new engine. Learn more in the documentation. - LocalStack now ships with a new Batch provider built on top of the ECS runtime, replacing the previous custom implementation. Kubernetes execution is available via
ECS_TASK_EXECUTOR=kubernetes
. The legacy provider can still be used withPROVIDER_OVERRIDE_BATCH=legacy
. Learn more in the documentation. (π ultimate)
Enhancements
- LocalStack now supports running Redis in ElastiCache & MemoryDB as Kubernetes pods, providing consistent behaviour across local and cluster environments and removing the need for separate Docker-based execution. Enable it by setting
REDIS_CONTAINER_MODE=1
andCONTAINER_RUNTIME=kubernetes
. (π enterprise) - LocalStack now offers CRUD support for EKS Addons. The following API calls are now supported: (π ultimate)
- LocalStack now supports routing Route 53 domains to S3 static website endpoints, enabling custom domains to resolve directly to S3-hosted websites and improving parity with AWS. (π base)
- LocalStack's RDS Data provider now includes the following enhancements: (π base)
- Added support for
oid
type in Postgres via the RDS Data API. - Added support for array types in Postgres via the RDS Data API, with fixes for array handling in Redshift Data.
- Added support for returning
numberOfRecordsUpdated
in Postgres databases, improving parity with AWS responses.
- Added support for
- LocalStack's CloudFront provider now includes the following enhancements: (π base)
- Improved parity for header propagation in Lambda@Edge.
- Improved parity by propagating status code changes for request event types (
viewer-request
,origin-request
) in Lambda@Edge. - Proper handling of
3XX
redirects for request events, ensuring responses like302
are correctly propagated in Lambda@Edge. CustomOriginConfig.HTTPPort
andCustomOriginConfig.HTTPSPort
are now properly set, ensuring requests correctly use configured custom ports instead of defaulting to port 80/443, with fallbacks to LocalStackβs edge port (4566
) when necessary.
- Enhanced Lambda hot-reload to returnΒ
file://
Β URIs for code locations instead of arbitrary strings, making them easier to parse and understand. - Support for customΒ SSM DocumentsΒ withΒ
SendCommand
Β is now available, including parameter substitution. Only theΒaws:runShellScript
Β plugin is supported. (π base) - ImplementedΒ FISΒ actionΒ
aws:ecs:stop-task
, enabling fault injection experiments to stop running ECS tasks. (π ultimate) - EnabledΒ API GatewayΒ VPC endpoint routing, allowing API invocation viaΒ
.vpce.execute-api
Β URLs using theΒx-apigw-api-id
Β header. - SNSΒ now supports passingΒ
MessageGroupId
Β to non-FIFO topics, aligning with SQS Fair Queues behavior and ensuring the attribute is propagated correctly to SQS messages. - ImplementedΒ SESΒ
SetIdentityHeadersInNotificationsEnabled
Β API, enabling configuration of header inclusion in bounce, complaint, and delivery notifications. - Added support forΒ Lambda Function URLsΒ withΒ
ResponseStream
Β invoke mode, enabling streaming responses via theΒInvokeMode
Β parameter. - Added Java 24 support in the Trino installer, enabling upgrades from Trino 389 to 476 and improving module installation command generation. (π ultimate)
- IncreasedΒ SQSΒ message and batch size limit to 1 MiB, matching the recent AWS update.
- Added support forΒ EFSΒ
DeleteFileSystemPolicy
Β operation. (π ultimate) - Added support inΒ CodePipelineΒ for theΒ
CODEBUILD_RESOLVED_SOURCE_VERSION
Β environment variable, ensuring CodeBuild actions receive the correct commit ID or S3 version ID for the source. (π ultimate) - Added support forΒ IcebergΒ table metadata format v2 andΒ
s3a://
Β filesystem support in Hive, improving compatibility with Iceberg tables created using theΒiceberg-go
Β SDK. (π ultimate) - Added Kubernetes owner references toΒ GlueΒ pods, enabling proper cleanup of child containers when the LocalStack pod is terminated. (π enterprise)
- Added support inΒ CodeBuildΒ for resolving environment variables from Secrets Manager and SSM Parameter Store using ARNs, in addition to names. (π base)
- Added tagging support for theΒ CodeConnectionsΒ service, enabling resource tag operations. (π base)
- ImprovedΒ EKSΒ CloudFormation support forΒ
AWS::EKS::FargateProfile
Β with idempotency handling, improved parameter validation, and proper support for profiles created without subnets. (π ultimate) - Updated DNS handling to allowΒ
checkip.amazonaws.com
Β to resolve upstream by default by adding it toΒDEFAULT_SKIP_PATTERNS
. - The Traefik ingress controller and k3d load balancer are no longer started automatically when creating anΒ EKSΒ cluster. SetΒ
EKS_START_K3D_LB_INGRESS=1
Β to restore the previous behavior. (π ultimate)
LocalStack Features
-
The LocalStack Toolkit for VS Code now features a guided setup wizard, status bar integration, and improved logging, making it easier to install, configure, and run LocalStack seamlessly within your IDE. Learn more in the documentation.
-
LocalStack AWS Replicator can now describe KMS keys using their alias ARN. When an alias ARN is provided, the
key_id
is returned asalias/<alias_name>
, improving compatibility in cross-account replication scenarios. (π ultimate) -
LocalStack AWS Replicator now provides initial support for replicating groups of resources. For example, you can now replicate all SSM parameters under a given path (e.g.,
/dev/front-end/*
) with a single command: (π ultimate)localstack replicator start \ --replication-type BATCH \ --resource-type AWS::SSM::Parameter \ --resource-identifier /dev/front-end/
Batch replication is currently limited to a max concurrency of 10 to prevent issues with large sets of resources.
-
Improved Cloud Pod persistence handling by streaming pod data and state instead of loading entire files into memory, and by writing large pod files (>64 MiB) to the host file system. These changes prevent memory exhaustion and container storage issues when importing or loading large pods. (π base)
-
Enabled automatic state restoration whenΒ
EAGER_SERVICE_LOADING
Β is set, ensuring the persisted state is loaded at startup instead of only on request. (π base)
Deprecations
- The new CloudFormation engine will soon fail deployments containing unsupported resource types by default. The legacy engine is unaffected. Users can setΒ
CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES
Β to maintain the current behavior where unsupported resources are ignored. - Starting with LocalStack 4.9, the base image will upgrade from Debian Bookworm / Python 3.11 to Debian Trixie / Python 3.13. This may impact custom extensions or init scripts that rely on specific OS packages or Python 3.11.
What's Changed
Exciting New Features π
- SES: implement SetIdentityHeadersInNotificationsEnabled API by @YelynnOh in #12823
- add testing for Fn::Transform in CFn v2 by @pinzon in #12689
- add support for Exports/Imports in CFn v2 by @pinzon in #12906
- implement string replacement feature in CFn v2 by @pinzon in #12911
- support ResponseStream mode for functionUrl by @pinzon in #12935
- Eventstudio: Move fixtures to make them available in Pro by @maxhoheiser in #12962
- CFNV2: support CDK bootstrap and deployment by @simonrw in #12967
- add(utils/archives): Support .whl files in download_and_extract by @gregfurman in #12978
- CFNV2: remove/rescope CFNV2:Validation errors by @simonrw in #12970
- Allow stack traces in HTTP responses only if
INCLUDE_STACK_TRACES_IN_HTTP_RESPONSE
is enabled by @sannya-singal in #12938 - CFNV2: improve parity with describe operations by @simonrw in #12980
- CFNV2: fix EC2 VPCEndpoint test by @simonrw in #12971
- Improve handling of LDM shutdowns during invocations by @MEPalma in #13002
- CFNV2: handle AWS::NoValue by @simonrw in #13000
- Publish service provider mapping on startup by @silv-io in #12740
- CFNV2: fix remaining transform tests by @simonrw in #13010
- CFNV2: finish URL replacements for API Gateway by @simonrw in #13012
- CFNV2: Implement Fn::Length for language extensions by @simonrw in #13033
- CFNV2: Implement Fn::ForEach and Fn::ToJsonString for language extensions by @simonrw in #13034
- CFNV2: correct state modelling of failed stacks by @simonrw in #13040
- Raise DockerNotAvailable exception if port checking is impossible by @joe4dev in #13038
- Bump moto-ext to 5.1.11.post1 by @viren-nadkarni in #12964
- increase sqs message size limit to 1MiB by @SethPyle376 in #12957
- Use file URI scheme for hotreload presigned URL by @joe4dev in #13060
- capture k8s env var by @cloutierMat in #13066
- SNS: create inital v2 provider in CI by @baermat in #13069
- CFNV2: Switch provider defaults to new engine by @simonrw in #13098
- Fix ContinuationSequenceNumber in SubscribeToShard by @NigelRook in #12981
- Support Additional Parameters for S3 UploadPartCopy by @aidehn in #13105
Other Changes
- fix partial coverage reporting by @alexrashed in #12939
- SQS: fix DelaySeconds behavior for FIFO queues on message level by @kn1ves in #12941
- Update version in README by @alexrashed in #12942
- Ec2/fix/vpc endpoint dns entries by @cloutierMat in #12927
- Apigw/enable vpce routing by @cloutierMat in #12937
- Reduce image size by properly avoiding duplicated java installation by @dfangl in #12940
- merge CFn V1 and CFnV2 tests by @pinzon in #12944
- [Testing] Update test durations by @localstack-bot in #12946
- mitigate issues with pip-tools 7.5.0 with dependency limit by @alexrashed in #12947
- CFNV2: defer deletions for correcting deploy order by @simonrw in #12936
- Replicator/support x account kms by @cloutierMat in #12950
- CFNv2: support resolve:ssm: and resolve:secretsmanager: strings by @simonrw in #12965
- KMS: fix HMAC key import and add validated tests for HMAC and ECC key specs by @sannya-singal in #12952
- CFnv2: implement SSM parameter resolving by @simonrw in #12934
- Add pyupgrade rules to ruff by @giograno in #12953
- add java 24 support in java installer for trino by @macnev2013 in #12963
- CFNV2: fix delete change set by @simonrw in #12977
- [Testing] Update test durations by @localstack-bot in #12986
- SES: fix infinite loop with SNS event destination by @bentsku in #12972
- add support for nested Fn in FnSelect for CFn by @pinzon in #12955
- CFNV2: fix select in mapping test by @simonrw in #12993
- Step Functions: Fix Batch error handling by @nik-localstack in #12988
- Re-enabling ruff rule E721 by @giograno in #12968
- Re-enabling ruff rule C408 by @giograno in #12969
- add transformation function with key skip by @baermat in #12976
- fix unit test reporting by @alexrashed in #12996
- CFNv2: Standardise on test reporting by @simonrw in #12984
- Remove buildjet from s3 image arm pipeline by @dfangl in #13004
- fix port subrange from subclass by @cloutierMat in #13001
- Add handling of tags in docker-helper by @silv-io in #12943
- Log stack traces only in debug mode by @sannya-singal in #12989
- sqs: fix exception log message for sqs query execution by @sannya-singal in #13007
- Create new markers for requiring in process execution or docker by @dfangl in #13003
- add support for Fn::Tranform in CFnV2 by @pinzon in #12966
- CFNV2: Unskip remaining Resolve tests by @simonrw in #12997
- [Testing] Update test durations by @localstack-bot in #13014
- introduce
get-release-version
in docker helper by @eruditmorina in #13006 - decrease frequency of test duration update workflow by @alexrashed in #13016
- Updated contribution guidelines link by @VanshikaSabharwal in #13013
- Fix make format targets by @giograno in #13023
- Migrate from jpype1-ext to jpype1 by @dfangl in #13005
- Re-enable C416 ruff rule by @giograno in #13025
- SNS: support passing
MessageGroupId
to non-FIFO topic by @bentsku in #13019 - S3/ASF parser: fix parsing header
list
shape type with multivalue headers by @bentsku in #13022 - improve Patch utility: add idempotency by @bentsku in #12919
- APIGW: fix TestInvokeMethod path logic by @bentsku in #13030
- Update lambda init by @dfangl in #13036
- Add workflow to enforce docs PR labels by @hovaesco in #13035
- Fix cross-arch Docker build by @joe4dev in #13042
- APIGW: internalize DeleteIntegrationResponse by @bentsku in #13046
- Improve remove docker container function to take into account stopped containers by @bryansan-local in #12979
- add traceback propagation of internal errors by @bentsku in #13044
- add skip-docs label to automatically generated PRs by @alexrashed in #13054
- Enable B017 ruff linting rule by @giograno in #13031
- Ruff linter: enable rule UP008 and UP036 by @giograno in #13047
- Ruff linter: enable rule UP028 by @giograno in #13048
- fix cloudwatch v1 timestamp serialization after moto upgrade by @alexrashed in #13058
- Ruff linter: enable rule UP031 by @giograno in #13049
- Fix SQS tests failing due to missing snapshot update after #12957 by @dfangl in #13062
- create pluggable factory for state codecs by @thrau in #13063
- Remove jsonpickle serializer by @giograno in #13064
- extend the Encoder/Decoder state API to be type-aware by @thrau in #13017
- IaC: Add CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES to environment variables tracked by localstack by @k-a-il in #13074
- Unit-tests: enable unit-tests for aws handlers by @k-a-il in #13070
- Update CODEOWNERS by @localstack-bot in #13081
- Fix typing for the tagging service by @giograno in #13077
- Upgrade to node 22.x by @dfangl in #13083
- Change link to community by @gtsiolis in #13059
- Align localstack.dev.kubernetes with our pro test configuration by @simonrw in #13076
- CI: fix cancellation of test runs when pushing commits on PR by @bentsku in #13089
- Fix: add PLATFORM validation to docker-helper.sh build command by @Ganji00 in #13079
- SNS: fix 500 error for Unsubscribe with empty Sub ARN by @bentsku in #13087
- CFN: log warning about upcoming change of CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES by @k-a-il in #13085
- APIGW: fix UpdateResource on root method by @bentsku in #13093
- Docker: Support remove_container(volume=True) by @bblommers in #13072
- S3: fix PutBucketTagging and PutObjectTagging when
TagSet
isNone
by @bentsku in #13092 - add fixes to CFnV2 for pro pipeline by @pinzon in #13045
- Fix misnamed service_name attribute in stores by @giograno in #13094
- CFNV2: Add startup log message by @simonrw in #13075
- S3: fix validation parity of
PutBucketNotificationConfiguration
by @bentsku in #13091 - Update banner image by @silv-io in #13096
- CFNV2: fix community issues after attempted pro fixes by @simonrw in #13101
- Bump deepdiff from 8.6.0 to 8.6.1 by @dependabot[bot] in #13100
- [Testing] Update test durations by @localstack-bot in #13104
- fix start error code if container exists but is not running by @alexrashed in #13097
- fix CI step for publishing alternative providers results by @bentsku in #13082
- Events: harden dict view iterations by @bentsku in #13088
- CFn: propagate tags to stack/change-set by @simonrw in #13117
- Lambda: S3 presigned url should respect LOCALSTACK_HOST by @dfangl in #13119
- CFN: fix stack update with transformation included by @pinzon in #13122
- CFn: improve parity of describing failed change sets by @simonrw in #13123
- Remove dependency of static error message in implementation coverage script by @sannya-singal in #13116
- IaC: log warning about change of CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES only if variable is not explicitly set by @k-a-il in #13118
- KMS: AWS-compliant validation for multi-region key replication by @Ganji00 in #13102
- CFn: add more clarity on logging for unimplemented update methods by @simonrw in #13109
New Contributors
- @kn1ves made their first contribution in #12941
- @YelynnOh made their first contribution in #12823
- @VanshikaSabharwal made their first contribution in #13013
- @hovaesco made their first contribution in #13035
- @SethPyle376 made their first contribution in #12957
- @Ganji00 made their first contribution in #13079
- @NigelRook made their first contribution in #12981
- @aidehn made their first contribution in #13105
Full Changelog: v4.7.0...v4.8.0