What's Changed
[1.3.8] — 2026-04-21
Added
- S3
s3:TestEventonPutBucketNotificationConfiguration— configuring bucket notifications now delivers a flats3:TestEventpayload (noRecordswrapper) to every SQS / SNS / Lambda destination, matching real AWS S3 behaviour so tooling that listens for the test event on bucket setup works locally. Contributed by @nigel-campbell (#416)
Fixed
- Lambda persistence crash on warm start with any event source mapping —
lambda_svc.restore_state()called_ensure_poller()when restoring ESMs, but the module-level invocation ran at line 170 while_ensure_pollerwas defined ~3,500 lines later. Warm starts withPERSIST_STATE=1and an ESM inlambda.jsonraisedNameError: name '_ensure_poller' is not definedon every Lambda request until the state file was deleted. The module-level load/restore is now at the bottom of the file, after every helper it may call. Reported by @whittin3. Fixes #422 - DynamoDB
SSEDescriptionused the request shape instead of the response shape —CreateTablestored the caller'sSSESpecification(Enabled/KMSMasterKeyId) directly as the responseSSEDescription, which is missing theStatusfield Terraform v6 waits on;UpdateTablesilently ignoredSSESpecification. Warm-bootterraform applyon any encrypted table hung forever withunexpected state '', wanted target 'DISABLED, ENABLED'. Fixed by converting spec → description (Status,SSEType,KMSMasterKeyArn) at create + update, plus a one-shot migration inrestore_statefor legacy persisted tables. Reported by @whittin3. Fixes #418 test_s3_put_notification_sends_test_eventwas flaky under parallel load — background thread deliverings3:TestEventraced the test's poll.PutBucketNotificationnow delivers the test event synchronously (matching AWS effective behaviour) before returning; removes the race and also fixes multi-tenant delivery where the worker thread lost the caller's account contextvar.
Changed
- Hardened persisted-state restore across every service — 35 service modules wrapped their module-level
load_state()+restore_state()invocation intry/exceptso a corrupt or schema-incompatible{service}.jsonlogs and continues with a fresh store instead of breaking the service at import. Audited everyrestore_state/load_persisted_statefor forward references (0 other violators) and unsafedata[key]subscript accesses (all guarded). This closes the entire class of bug around #422.