fix(eventbridge): AWS-conformant InputTransformer from CloudFormation and PutTargets - #1885
Conversation
…onformant JSON representation
… transformed body to SQS
|
| Filename | Overview |
|---|---|
| src/main/java/io/github/hectorvent/floci/services/eventbridge/EventBridgeInvoker.java | Core substitution engine rewritten: new quote-context-aware scanner in applyInputTransformer, extractNode extracted from extractJsonPath to share node extraction with transformer evaluation. Logic is correct for the common cases; toPointer's dot-to-slash conversion is a pre-existing limitation documented as out of scope. |
| src/main/java/io/github/hectorvent/floci/services/eventbridge/model/InputTransformer.java | Added fromJson(JsonNode) factory method to centralise InputTransformer parsing. Handles null, MissingNode, and non-object nodes correctly, returning null for each; existing constructors and field defaults are unchanged. |
| src/main/java/io/github/hectorvent/floci/services/eventbridge/EventBridgeHandler.java | Inline InputTransformer parsing replaced with InputTransformer.fromJson(). Net reduction of 9 lines; behaviour is equivalent. |
| src/main/java/io/github/hectorvent/floci/services/cloudformation/CloudFormationResourceProvisioner.java | Single-line fix in the existing AWS::Events::Rule provisioning block: sets InputTransformer on the target via the shared factory, closing the CFN silent-drop bug. The change is narrowly scoped to the existing target-building code path. |
| src/test/java/io/github/hectorvent/floci/services/eventbridge/EventBridgeInvokerTest.java | Six new unit tests cover value-position string quoting, object/number/bool passthrough, missing-path empty substitution, in-string interpolation, quoted-whole-token raw replacement, and unknown-variable literal passthrough. Good coverage of the engine's branching logic. |
| src/test/java/io/github/hectorvent/floci/services/cloudformation/CloudFormationIntegrationTest.java | New test case createStack_eventBridgeRuleWithInputTransformer_deliversTransformedBodyToSqs covers the full CFN stack creation → PutEvents → SQS delivery path, verifying CFN/native parity and that the transformer survives provisioning (ListTargetsByRule assertion). |
Sequence Diagram
sequenceDiagram
participant Client
participant EventBridgeHandler
participant CloudFormationProvisioner
participant InputTransformer
participant EventBridgeInvoker
participant Target
Note over Client,Target: Native PutTargets path
Client->>EventBridgeHandler: PutTargets (JSON 1.1)
EventBridgeHandler->>InputTransformer: fromJson(t.path("InputTransformer"))
InputTransformer-->>EventBridgeHandler: "InputTransformer | null"
EventBridgeHandler->>Target: setInputTransformer(...)
Note over Client,Target: CloudFormation AWS::Events::Rule path
Client->>CloudFormationProvisioner: CreateStack (Query)
CloudFormationProvisioner->>InputTransformer: fromJson(resolved.path("InputTransformer"))
InputTransformer-->>CloudFormationProvisioner: "InputTransformer | null"
CloudFormationProvisioner->>Target: setInputTransformer(...)
Note over Client,Target: PutEvents invocation (both paths)
Client->>EventBridgeInvoker: invokeTarget(target, eventJson, region)
EventBridgeInvoker->>EventBridgeInvoker: applyInputTransformer(transformer, eventJson)
loop For each InputPathsMap entry
EventBridgeInvoker->>EventBridgeInvoker: extractNode(jsonPath, eventJson)
end
Note right of EventBridgeInvoker: Single-pass scan:<br/>value pos → jsonValue()<br/>in-string pos → rawValue()
EventBridgeInvoker-->>Target: transformed payload → SQS/Lambda/SNS/…
Reviews (3): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile
…dexOf guard in transformer engine
| int close = template.indexOf('>', i + 1); | ||
| if (close >= 0) { | ||
| String name = template.substring(i + 1, close); | ||
| if (resolved.containsKey(name)) { |
There was a problem hiding this comment.
The string-context vs value-context split is the part most implementations get wrong, and doing it with an inString scan plus isEscaped is a nice touch — quoting <key> inside a JSON string really does mean something different from using it as a bare value.
One conformance gap for a PR aiming at "AWS-conformant": only names present in InputPathsMap are substituted, but AWS also defines five predefined variables that never appear in that map:
<aws.events.event> the event, minus detail
<aws.events.event.json> the full event as JSON
<aws.events.rule-arn>
<aws.events.rule-name>
<aws.events.ingestion-time>
Because resolved.containsKey(name) is false for all of them, they fall through to out.append(c) and survive verbatim into the target payload. For a very common CDK/Terraform-shaped template:
{"rule": "<aws.events.rule-name>", "detail": <aws.events.event.json>}the target receives the literal text <aws.events.rule-name> — and worse, "detail": <aws.events.event.json> isn't valid JSON at all, so anything parsing the payload fails rather than getting a wrong-but-parseable value. Silent literal passthrough makes that hard to trace back to the transformer.
The substitution loop is already the right place for it — seeding resolved before the InputPathsMap entries would cover it:
Map<String, JsonNode> resolved = new LinkedHashMap<>();
JsonNode event = objectMapper.readTree(eventJson);
resolved.put("aws.events.event.json", event);
resolved.put("aws.events.event", withoutDetail(event));
resolved.put("aws.events.rule-name", TextNode.valueOf(ruleName));
resolved.put("aws.events.rule-arn", TextNode.valueOf(ruleArn));
resolved.put("aws.events.ingestion-time", TextNode.valueOf(Instant.now().toString()));
// InputPathsMap entries last — AWS rejects these names in the map, so caller keys can't shadow themThe rule name and ARN aren't currently threaded into invokeTarget, so that part needs a signature change — reasonable as a follow-up if you'd rather keep this PR to the parsing fix. But <aws.events.event.json> needs nothing extra and is the one most likely to be hit.
If any of these are deliberately out of scope, the docs deviation list would be a good place to say so — right now nothing signals that they silently pass through.
|
Thank you for this, and sorry it waited so long for a human reply. The core fix holds up against the reference behaviour (value-position placeholders get JSON, in-string get the raw escaped value, missing path becomes empty string), one shared (blocking) The plain string template case: (follow-up, separate PR) AWS rejects an Also please untick "New feature" and add |
pgermosen
left a comment
There was a problem hiding this comment.
@lruizctaima — this needs a down-merge before it can go in, and I want to save you some time on it, because the obvious way to resolve these conflicts produces code that does not compile.
First, the part that matters: the work is still needed and still correct. The branch has been sitting a while, so I checked main directly rather than assume:
EventBridgeInvoker.applyInputTransformeronmainis stillresult.replace("<" + key + ">", value)with no quote awareness — the naive substitution your PR replaces.CloudFormationResourceProvisionerstill buildsnew Target(targetId, targetArn, input, inputPath)and never carries the transformer.
Neither has been fixed by anything that landed in the meantime. Nothing here is redundant.
The merge, and the trap in it
The branch is 190 commits behind main, with three conflicting files:
| File | Conflict hunks |
|---|---|
CloudFormationResourceProvisioner.java |
1 — two imports |
EventBridgeInvokerTest.java |
1 |
CloudFormationIntegrationTest.java |
7 |
The instinct on conflicts like these is "both sides are additions, keep both, drop the markers". That breaks the build here. I tried it first so you would not have to:
CloudFormationIntegrationTest.java:[9130,30] ';' expected
EventBridgeInvokerTest.java:[451,60] ';' expected
Git has interleaved two different test methods that happen to open the same way — main's createStack_withEventBus_createsRealBusAndResolvesRefAndGetAtt and your createStack_eventBridgeRuleWithInputTransformer_deliversTransformedBodyToSqs, both declaring a TargetQueue SQS resource. Deleting the markers splices them together mid-method.
The actual resolution is simple. Your changes to all three conflicted files are pure additions — 2+ 0-, 84+ 0-, 49+ 0- — each a single hunk at the end of the file. So for the two test files, take main's version wholesale and append your block before the closing class brace:
git checkout origin/main -- <test file>
# then re-add your test method at the end
For CloudFormationResourceProvisioner.java the conflict is only between two imports — keep both. main has since added SqsParameters and BatchParameters handling around the line you touch, and your target.setInputTransformer(...) sits alongside it without interfering.
I verified the resolved result
Rather than send you off on a guess, I resolved it that way locally against current main and ran it:
- compiles clean
- 749 tests green across
services.cloudformation.**andservices.eventbridge.** - your new CFN test and
main's event-bus test pass together, so the two features genuinely coexist
I also confirmed both of your fixes are pinned by your own tests, by reverting each one:
| Reverted | Failure |
|---|---|
substitution → main's naive replace |
expected: <{"e":"site.created"}> but was: <{"e":site.created}> |
the CFN setInputTransformer line |
createStack_eventBridgeRuleWithInputTransformer_deliversTransformedBodyToSqs |
That first message is the bug itself — invalid JSON — which is a good sign for the test.
Your CI is from 16 July, so it will need a fresh run after the down-merge regardless.
One question, not blocking
jsonValue returns "" for a missing or null path, so a value-position placeholder whose JSONPath does not match renders {"e":} — not valid JSON. Your description states "missing path → empty" deliberately, and it matches what main already did, so this is preserved rather than introduced by you.
Do you happen to know what real AWS emits there? If it quotes an empty string, or drops the member, that would be worth matching. Entirely fine as a follow-up either way — I mention it only because you clearly checked the other substitution rules against the documentation and this is the one corner the doc is quiet about.
The engine reads well, incidentally — the single-pass scanner with the inString toggle and the escaped-quote check is the right shape for this, and leaving unknown placeholders literal is the correct call given reserved variables like <aws.events.rule-arn> are explicitly out of scope.
Push the down-merge whenever suits and I will re-review promptly. Thank you for your patience on this one — the delay is on the queue, not on you.
# Conflicts: # src/main/java/io/github/hectorvent/floci/services/cloudformation/CloudFormationResourceProvisioner.java # src/test/java/io/github/hectorvent/floci/services/cloudformation/CloudFormationIntegrationTest.java # src/test/java/io/github/hectorvent/floci/services/eventbridge/EventBridgeInvokerTest.java
pgermosen
left a comment
There was a problem hiding this comment.
Downmerged main to resolve the conflict (was DIRTY/CONFLICTING) — CI green on the merged tree.
# [2.0.0](https://github.com/floci-io/floci/compare/1.7.0...2.0.0) (2026-09-01)
* fix(stepfunctions)!: reject JSONata top-level references at definition time ([#2699](https://github.com/floci-io/floci/issues/2699)) ([5534460](https://github.com/floci-io/floci/commit/553446049294499455a70f411d2db3c0050c17ae))
### Bug Fixes
* **acm:** correct wildcard validation record names ([#2575](https://github.com/floci-io/floci/issues/2575)) ([88bf0a2](https://github.com/floci-io/floci/commit/88bf0a293155947487ce72b89cca2514daf7547a))
* **apigateway:** match measured JWT claim wire format and enforce route authorizationScopes ([#2011](https://github.com/floci-io/floci/issues/2011)) ([4980210](https://github.com/floci-io/floci/commit/498021087f23b316d609814c264a280b17a719c5))
* **apigateway:** pass RequestContext to ApiGatewayExecuteController in trailing-slash tests ([#2394](https://github.com/floci-io/floci/issues/2394)) ([41953d8](https://github.com/floci-io/floci/commit/41953d88200017da7b4eb15d0f6ce149aca83c5b)), closes [#2377](https://github.com/floci-io/floci/issues/2377)
* **apigateway:** project HTTP API v2 cookies ([#2391](https://github.com/floci-io/floci/issues/2391)) ([48880aa](https://github.com/floci-io/floci/commit/48880aa79ae9940f4135da25641b70decc7faade))
* **apigateway:** report RestApi as available ([#2816](https://github.com/floci-io/floci/issues/2816)) ([62dbd9d](https://github.com/floci-io/floci/commit/62dbd9ddf953ddbb567818f85c0a49a077f0837b))
* **apigateway:** route CORS preflight (OPTIONS) to deployed API integ… ([#1955](https://github.com/floci-io/floci/issues/1955)) ([0e3391c](https://github.com/floci-io/floci/commit/0e3391cac2de0823f4b30b3b89127b2cbb7d89ba)), closes [#1928](https://github.com/floci-io/floci/issues/1928)
* **apigateway:** support AWS type Lambda integration and fix duplicate Content-Type header ([#2049](https://github.com/floci-io/floci/issues/2049)) ([72dfa63](https://github.com/floci-io/floci/commit/72dfa634f75a849a096804c72c5c4c8ba4fa5442))
* **apigateway:** support underscores in v2 path parameters ([#2721](https://github.com/floci-io/floci/issues/2721)) ([c18af5b](https://github.com/floci-io/floci/commit/c18af5b68adada89c1c81055523e1159208a0568))
* **apigatewayv2:** CloudFormation AuthorizationScopes pass-through and scope-ingestion hardening (follow-up to [#2011](https://github.com/floci-io/floci/issues/2011)) ([#2431](https://github.com/floci-io/floci/issues/2431)) ([d0a96d8](https://github.com/floci-io/floci/commit/d0a96d87b1a9f17d87112b470126c256bfe958df))
* **apigatewayv2:** preserve trailing slash in HTTP API event path ([#2367](https://github.com/floci-io/floci/issues/2367)) ([6469637](https://github.com/floci-io/floci/commit/64696375082a028941488c9cf82d72e18d77c9aa)), closes [#1863](https://github.com/floci-io/floci/issues/1863) [#2136](https://github.com/floci-io/floci/issues/2136)
* **apigatewayv2:** propagate Lambda REQUEST authorizer context to HTTP API backends ([#2715](https://github.com/floci-io/floci/issues/2715)) ([908d70d](https://github.com/floci-io/floci/commit/908d70db3d13c41fa696fe57cd55f3e2976a032f)), closes [#1011](https://github.com/floci-io/floci/issues/1011) [#812](https://github.com/floci-io/floci/issues/812) [#581](https://github.com/floci-io/floci/issues/581)
* **apigatewayv2:** return stage tags across protocols ([#2413](https://github.com/floci-io/floci/issues/2413)) ([5744082](https://github.com/floci-io/floci/commit/5744082c5eb3b99e1a0c52db644b64a67afada77))
* **apigatewayv2:** route requests to API-owning account ([#2377](https://github.com/floci-io/floci/issues/2377)) ([ba9ce84](https://github.com/floci-io/floci/commit/ba9ce8424223f5652ba34f53cbca291372084e53))
* apply S3 Vectors metadata filters ([#2417](https://github.com/floci-io/floci/issues/2417)) ([bd8d99b](https://github.com/floci-io/floci/commit/bd8d99b7575bd70b50fc4fe51f5ec33309c8a14a)), closes [#2160](https://github.com/floci-io/floci/issues/2160)
* **appsync:** honor configured base URL in API URIs ([#2457](https://github.com/floci-io/floci/issues/2457)) ([86e1c01](https://github.com/floci-io/floci/commit/86e1c016cd0bb093be9232f2a4444647a85a97b1))
* **appsync:** use ApiKey.id as the API key value ([#2645](https://github.com/floci-io/floci/issues/2645)) ([2932500](https://github.com/floci-io/floci/commit/29325006bb7fd17714227653a4abcf76e2039a28))
* **appsync:** wait for schema creation in SDK test ([#2456](https://github.com/floci-io/floci/issues/2456)) ([43e5e90](https://github.com/floci-io/floci/commit/43e5e903d16941724b66fee943315dc4143da91b))
* **athena:** route database DDL to Glue ([#2757](https://github.com/floci-io/floci/issues/2757)) ([2480daa](https://github.com/floci-io/floci/commit/2480daaa099bb50d670bcf65b8f22c2cee8dba43))
* **bedrock-agentcore:** allow maxResults up to 1000 ([#2487](https://github.com/floci-io/floci/issues/2487)) ([9792198](https://github.com/floci-io/floci/commit/97921982d70b67725087016bd33e40bf7ffbea0a))
* **bedrock-agentcore:** support memory tagging and dropped fields ([#2501](https://github.com/floci-io/floci/issues/2501)) ([feb669d](https://github.com/floci-io/floci/commit/feb669d58b806965a1a403ba5656f02eeb82e994)), closes [#2316](https://github.com/floci-io/floci/issues/2316)
* **build:** resolve the JSON schema library from Maven Central ([#2811](https://github.com/floci-io/floci/issues/2811)) ([66d910c](https://github.com/floci-io/floci/commit/66d910c61348ed01f9e38563086e18ff864948ee))
* **ci:** replace setup-java's broken maven cache with actions/cache ([#2503](https://github.com/floci-io/floci/issues/2503)) ([a68bfc4](https://github.com/floci-io/floci/commit/a68bfc4e68d265ebf34011b67ae83e0b65e489d5))
* **cloudformation:** adopt managed policy on stack update ([#2717](https://github.com/floci-io/floci/issues/2717)) ([51edcca](https://github.com/floci-io/floci/commit/51edccacbf7ab22977ca765cfb481227d449a1c8))
* **cloudformation:** fail the stack when Lambda S3 code cannot be read ([#2650](https://github.com/floci-io/floci/issues/2650)) ([231c097](https://github.com/floci-io/floci/commit/231c0972b0ec9e663388bf85ec2a15f3ee1ddf38)), closes [#2648](https://github.com/floci-io/floci/issues/2648)
* **cloudformation:** keep a rolled-back stack's diagnostics until the next redeploy ([#2365](https://github.com/floci-io/floci/issues/2365)) ([c54f8dd](https://github.com/floci-io/floci/commit/c54f8ddf023007d975b3dc300873281727e74c66)), closes [#2207](https://github.com/floci-io/floci/issues/2207) [Stack#changeSets](https://github.com/Stack/issues/changeSets) [#2419](https://github.com/floci-io/floci/issues/2419)
* **cloudformation:** no-op stack update for unchanged fixed-name resources ([#2385](https://github.com/floci-io/floci/issues/2385)) ([5864ff6](https://github.com/floci-io/floci/commit/5864ff6aa88e0047b5a3540ac4722c8cfc424e4d)), closes [lex00/floci#16](https://github.com/lex00/floci/issues/16)
* **cloudformation:** reconcile DynamoDB streams declared by StreamSpecification ([#2411](https://github.com/floci-io/floci/issues/2411)) ([c4597f2](https://github.com/floci-io/floci/commit/c4597f2e53ce2c116559353721f516aac1bf3ba1))
* **cloudformation:** resolve IAM assume role policy intrinsics ([#2630](https://github.com/floci-io/floci/issues/2630)) ([6a1d86e](https://github.com/floci-io/floci/commit/6a1d86e43fb0939c833f92a864e9cf44bb6b70cf))
* **cloudformation:** tolerate missing stack resources during deletion ([#2039](https://github.com/floci-io/floci/issues/2039)) ([12b8ddd](https://github.com/floci-io/floci/commit/12b8ddd6291b901a086bc106d346ea87ffb8b09b))
* **cloudfront:** include terraform-required distribution fields ([#1940](https://github.com/floci-io/floci/issues/1940)) ([8ac23de](https://github.com/floci-io/floci/commit/8ac23deb064b243884563db73745943926459f31)), closes [#1930](https://github.com/floci-io/floci/issues/1930)
* **cloudfront:** separate DEVELOPMENT and LIVE function stages ([#2622](https://github.com/floci-io/floci/issues/2622)) ([0dfec3c](https://github.com/floci-io/floci/commit/0dfec3cf3cd4db7d212007472dd7f9393caf4661))
* **cloudwatch:** decompress gzipped cbor bodies. ([#2379](https://github.com/floci-io/floci/issues/2379)) ([f952fff](https://github.com/floci-io/floci/commit/f952fffe77e9c44e05bbeadeeba8fb9d73a6f341))
* **cloudwatch:** evaluate alarms over CloudWatch's wider evaluation range ([#2771](https://github.com/floci-io/floci/issues/2771)) ([cfe8566](https://github.com/floci-io/floci/commit/cfe8566511cf0ac720174f95e72a07b41ff517be)), closes [#2700](https://github.com/floci-io/floci/issues/2700)
* **cognito:** AWS-accurate `UsernameAttributes` pools — UUID username, alias sign-in, and token/revocation parity ([#1849](https://github.com/floci-io/floci/issues/1849)) ([1ca19c7](https://github.com/floci-io/floci/commit/1ca19c722ac8ed3dd20b1a4e396ebb11f58aaec5))
* **cognito:** enforce user pool password policies ([#2070](https://github.com/floci-io/floci/issues/2070)) ([3aaf745](https://github.com/floci-io/floci/commit/3aaf74520eadd2c0a71ec84b2ab06a1b406f2f80)), closes [#2066](https://github.com/floci-io/floci/issues/2066) [#2066](https://github.com/floci-io/floci/issues/2066)
* **cognito:** reject self-managed verification status ([#2532](https://github.com/floci-io/floci/issues/2532)) ([f8597bd](https://github.com/floci-io/floci/commit/f8597bdef91e5538988afb1ac7bec5ab2c90eaa6))
* **docdb:** give a record without an ARN the one it should have had ([#2425](https://github.com/floci-io/floci/issues/2425)) ([7602002](https://github.com/floci-io/floci/commit/760200223a557b8a824d10e856e8d910e051e3d9))
* **docdb:** refuse an engine version a live account does not list ([#2682](https://github.com/floci-io/floci/issues/2682)) ([46d2f4e](https://github.com/floci-io/floci/commit/46d2f4e70f765d4f24842b5530d79d3d078290aa)), closes [#2681](https://github.com/floci-io/floci/issues/2681)
* **docdb:** scope cluster and instance identifiers per region ([#2440](https://github.com/floci-io/floci/issues/2440)) ([3887a6c](https://github.com/floci-io/floci/commit/3887a6ca65479e41fcf7ccc17ee231688c3bba75)), closes [#2408](https://github.com/floci-io/floci/issues/2408)
* **docdb:** store and return cluster and instance settings ([#2651](https://github.com/floci-io/floci/issues/2651)) ([f019573](https://github.com/floci-io/floci/commit/f019573bf164245e8a0555d9d7a3587e5feb7cb9)), closes [#2614](https://github.com/floci-io/floci/issues/2614)
* **dynamodb:** cap GSI multi-attribute key parts at 4 attributes ([#2475](https://github.com/floci-io/floci/issues/2475)) ([13f6867](https://github.com/floci-io/floci/commit/13f68670d770b35bb5341320cd510078866d6a8c)), closes [#2460](https://github.com/floci-io/floci/issues/2460)
* **dynamodb:** enforce composite query order ([#2471](https://github.com/floci-io/floci/issues/2471)) ([e4356de](https://github.com/floci-io/floci/commit/e4356def24503cf6fac01c6e48a2228087c4c37d)), closes [#2462](https://github.com/floci-io/floci/issues/2462)
* **dynamodb:** hybrid persistence ([#2677](https://github.com/floci-io/floci/issues/2677)) ([e531683](https://github.com/floci-io/floci/commit/e5316839caa93c3ca6e856df85723f7be7f6a8be))
* **dynamodb:** recognize every HASH attribute of a composite GSI partition key ([#2474](https://github.com/floci-io/floci/issues/2474)) ([768e96a](https://github.com/floci-io/floci/commit/768e96a33fb3c7de9421b9249f3f3850c2a8a562)), closes [#2461](https://github.com/floci-io/floci/issues/2461)
* **dynamodb:** reject key attribute values whose type does not match the key schema ([#2625](https://github.com/floci-io/floci/issues/2625)) ([bf6c7b0](https://github.com/floci-io/floci/commit/bf6c7b001cbe0c9ec642f34e3a54b8e231d94175)), closes [#2624](https://github.com/floci-io/floci/issues/2624)
* **dynamodb:** reject LSI KeySchema with other than one sort key ([#2476](https://github.com/floci-io/floci/issues/2476)) ([0397826](https://github.com/floci-io/floci/commit/0397826b9087604207464b9dfbcb663475837ba0)), closes [#2459](https://github.com/floci-io/floci/issues/2459)
* **dynamodb:** return LastEvaluatedKey when Limit stops exactly at the last item ([#2389](https://github.com/floci-io/floci/issues/2389)) ([41ff13e](https://github.com/floci-io/floci/commit/41ff13e66d0fde2b3619648bdf80161e478bde2b)), closes [#2383](https://github.com/floci-io/floci/issues/2383)
* **dynamodb:** stop getSortKeyNames() from corrupting persisted tables ([#2463](https://github.com/floci-io/floci/issues/2463)) ([726c9c7](https://github.com/floci-io/floci/commit/726c9c7446b8b2755586d4c2465f2b981d2b45b9)), closes [#2415](https://github.com/floci-io/floci/issues/2415)
* **dynamodb:** tolerate whitespace before a function's own parenthesis ([#2510](https://github.com/floci-io/floci/issues/2510)) ([e4b101d](https://github.com/floci-io/floci/commit/e4b101d5dab2de9f48755f8a80705db9f15c9f70)), closes [#2509](https://github.com/floci-io/floci/issues/2509)
* **dynamodb:** validate cursor key types ([#2470](https://github.com/floci-io/floci/issues/2470)) ([e3df59a](https://github.com/floci-io/floci/commit/e3df59ae1f7e5ffe0a1fe8da6d8669b2e996e735)), closes [#2468](https://github.com/floci-io/floci/issues/2468)
* **dynamodb:** validate index access paths ([#2278](https://github.com/floci-io/floci/issues/2278)) ([30f965d](https://github.com/floci-io/floci/commit/30f965d0563daac32d27e43caab2804089e5d1a3))
* **dynamodb:** validate query key types ([#2469](https://github.com/floci-io/floci/issues/2469)) ([a57c6c8](https://github.com/floci-io/floci/commit/a57c6c8112cd2547eeedcd95dd111fa7bbaca5e2)), closes [#2467](https://github.com/floci-io/floci/issues/2467)
* **ec2:** apply availability-zone filter in DescribeInstances ([#2543](https://github.com/floci-io/floci/issues/2543)) ([3bdcd5b](https://github.com/floci-io/floci/commit/3bdcd5b84fb2d517b4a440cccc907b7ffe2f9556)), closes [#2542](https://github.com/floci-io/floci/issues/2542)
* **ec2:** canonicalize IPv4 route destinations at the API boundary ([#2620](https://github.com/floci-io/floci/issues/2620)) ([8f76e13](https://github.com/floci-io/floci/commit/8f76e13dd69ae8189cdc2227042e1e0629d01c40)), closes [Ec2ServicePersistenceTest#legacyNonCanonicalRouteDestinationCanonicalizesOnRestart](https://github.com/Ec2ServicePersistenceTest/issues/legacyNonCanonicalRouteDestinationCanonicalizesOnRestart)
* **ec2:** create /run/sshd before starting sshd ([#1855](https://github.com/floci-io/floci/issues/1855)) ([3daab4a](https://github.com/floci-io/floci/commit/3daab4a1aec6a518f8b3837131212136926b961c))
* **ec2:** derive default vpc/subnet/sg ids per region ([#2384](https://github.com/floci-io/floci/issues/2384)) ([337dead](https://github.com/floci-io/floci/commit/337dead734f292e3fb9b2f898ab69a926f4693fc)), closes [Ec2ServiceTest#defaultVpcSubnetAndSecurityGroupIdsAreRegionScoped](https://github.com/Ec2ServiceTest/issues/defaultVpcSubnetAndSecurityGroupIdsAreRegionScoped) [lex00/floci#21](https://github.com/lex00/floci/issues/21) [pre-#21](https://github.com/pre-/issues/21) [pre-#21](https://github.com/pre-/issues/21) [#21](https://github.com/floci-io/floci/issues/21) [#21](https://github.com/floci-io/floci/issues/21) [floci-io/floci#21](https://github.com/floci-io/floci/issues/21)
* **ec2:** honour documented Describe* filters and stop ENIs inheriting instance tags ([#2747](https://github.com/floci-io/floci/issues/2747)) ([26ae4ef](https://github.com/floci-io/floci/commit/26ae4ef78acdf990d7123efbf7cc0c6341b3ecb6))
* **ec2:** install packages with yum on Amazon Linux 2 guests ([#2448](https://github.com/floci-io/floci/issues/2448)) ([c9f456e](https://github.com/floci-io/floci/commit/c9f456ea7a0f0fa4ba0ec5e667a9ba5aad0e8fa9)), closes [#2449](https://github.com/floci-io/floci/issues/2449)
* **ec2:** install the SSH client package in guests, not just the server ([#2449](https://github.com/floci-io/floci/issues/2449)) ([f3029ee](https://github.com/floci-io/floci/commit/f3029ee2511d9992381203dc89ed7dc0a364c9ce))
* **ec2:** reject a duplicate route destination with RouteAlreadyExists ([#2546](https://github.com/floci-io/floci/issues/2546)) ([1be97c9](https://github.com/floci-io/floci/commit/1be97c93332de48072dc43ab01f61ea79c4cbe3a))
* **ec2:** report a reachable EIP address, and run gzipped user-data ([#2621](https://github.com/floci-io/floci/issues/2621)) ([41b5148](https://github.com/floci-io/floci/commit/41b5148824e4c481f5949506a08c8e1b68d215b4))
* **ec2:** retry Docker port collisions ([#2029](https://github.com/floci-io/floci/issues/2029)) ([b27b32f](https://github.com/floci-io/floci/commit/b27b32f044da00fa6da20f01e2d39bce2c45c6a6))
* **ec2:** round-trip launch template data instead of discarding it ([#2595](https://github.com/floci-io/floci/issues/2595)) ([f1ad306](https://github.com/floci-io/floci/commit/f1ad306599a3efb643ff60ae0ca8df0d96a26888)), closes [Ec2ServicePersistenceTest#legacyIamProfileAndInstanceTagsSurviveRestart](https://github.com/Ec2ServicePersistenceTest/issues/legacyIamProfileAndInstanceTagsSurviveRestart)
* **ec2:** store and report a route's IPv6 destination, and stop DeleteRoute NPEing ([#2492](https://github.com/floci-io/floci/issues/2492)) ([e18a262](https://github.com/floci-io/floci/commit/e18a262261fc2fb5cb8cfd91c0198999b610886d))
* **ecs:** apply cluster settings given on CreateCluster ([#2845](https://github.com/floci-io/floci/issues/2845)) ([19013b8](https://github.com/floci-io/floci/commit/19013b8b63aa8b60ee31f78ea4875c2af7d66a36)), closes [#2806](https://github.com/floci-io/floci/issues/2806)
* **ecs:** report schedulingStrategy, deploymentController and availabilityZoneRebalancing on services ([#2482](https://github.com/floci-io/floci/issues/2482)) ([13664e7](https://github.com/floci-io/floci/commit/13664e76935b14a881d60611a000d363e419d37d))
* **ecs:** roll service tasks onto a changed task definition ([#2483](https://github.com/floci-io/floci/issues/2483)) ([f3b22e7](https://github.com/floci-io/floci/commit/f3b22e7964c342517fd279e479fa493a6d80f38c))
* **ecs:** round-trip command and entryPoint on container definitions ([#2446](https://github.com/floci-io/floci/issues/2446)) ([5c45c14](https://github.com/floci-io/floci/commit/5c45c146c7fe51a4ed9472dfd90be5be57d53cd4)), closes [#2445](https://github.com/floci-io/floci/issues/2445)
* **ecs:** round-trip runtimePlatform and logConfiguration on task definitions ([#2443](https://github.com/floci-io/floci/issues/2443)) ([a2389e7](https://github.com/floci-io/floci/commit/a2389e7733249102c9736cfb3698cf409f41bc4b))
* **ecs:** scope service tasks by owning service, not by caller-supplied group ([#2731](https://github.com/floci-io/floci/issues/2731)) ([c6b9e4c](https://github.com/floci-io/floci/commit/c6b9e4c34e2ac003254511ce59baf8533e8921b0)), closes [#2716](https://github.com/floci-io/floci/issues/2716)
* **eks:** implement cluster restoration after restart to maintain state ([#2780](https://github.com/floci-io/floci/issues/2780)) ([eaecb36](https://github.com/floci-io/floci/commit/eaecb36425983dbd7fc61ec73ad7e023bbd0958d))
* **elasticache:** keep a replication group's encryption, snapshot settings, tags and ARN ([#2632](https://github.com/floci-io/floci/issues/2632)) ([75f8f42](https://github.com/floci-io/floci/commit/75f8f42d5fbdb5e075e48eea9f18b8cffd2675ac)), closes [#2615](https://github.com/floci-io/floci/issues/2615)
* **elasticache:** report transit encryption, not the auth-token flag ([#2844](https://github.com/floci-io/floci/issues/2844)) ([90d1a19](https://github.com/floci-io/floci/commit/90d1a19310221d674d15f4f87b6a3c7cc81dc25e))
* **elasticache:** return the modeled capacity fault on proxy-port exhaustion ([#2423](https://github.com/floci-io/floci/issues/2423)) ([f40d2e3](https://github.com/floci-io/floci/commit/f40d2e34f3e6fc80bce6878916d4d58a47dd5eb1))
* **elb:** route Classic (v1) requests to a dedicated handler instead of ELBv2 ([#2619](https://github.com/floci-io/floci/issues/2619)) ([afe26c6](https://github.com/floci-io/floci/commit/afe26c6ad17953fecc3452e30f0978c06bc134c1))
* **eventbridge:** AWS-conformant InputTransformer from CloudFormation and PutTargets ([#1885](https://github.com/floci-io/floci/issues/1885)) ([9b3aee6](https://github.com/floci-io/floci/commit/9b3aee6a030575bf688d5ba55686994314c9c5a6))
* **eventbridge:** return 400 for missing resources ([#2553](https://github.com/floci-io/floci/issues/2553)) ([4083d06](https://github.com/floci-io/floci/commit/4083d0667d883426a3d220cf5d822b3637181041))
* **firehose:** use request region in delivery stream ARN ([#2719](https://github.com/floci-io/floci/issues/2719)) ([47e0647](https://github.com/floci-io/floci/commit/47e064786f0c227591fcc4f3b7344320cd6f5f1a))
* **iam:** correct GetAccountSummary provider and access-key counts ([#2426](https://github.com/floci-io/floci/issues/2426)) ([17e77ba](https://github.com/floci-io/floci/commit/17e77ba9d31e6a3e05a27b9cf7441aa60aef86e7))
* **iam:** implement UpdateAccountPasswordPolicy, Get and Delete ([#2616](https://github.com/floci-io/floci/issues/2616)) ([f411a31](https://github.com/floci-io/floci/commit/f411a316a2e8dc6ae6f5555b07c9a46f1c1fe75a))
* inject AWS SDK environment into Flink sidecars ([#2486](https://github.com/floci-io/floci/issues/2486)) ([127e51e](https://github.com/floci-io/floci/commit/127e51e71b0a429de94166e856fc91d78673747d)), closes [#2404](https://github.com/floci-io/floci/issues/2404)
* **kinesis-cbor:** timestamps mis-scaled 1000x on the CBOR path ([#2432](https://github.com/floci-io/floci/issues/2432)) ([39ed771](https://github.com/floci-io/floci/commit/39ed7712a7194322b6cfa38fc5aba3dbe91f4520)), closes [#2368](https://github.com/floci-io/floci/issues/2368)
* **kinesis:** apply CreateStream's Tags instead of dropping them ([#2494](https://github.com/floci-io/floci/issues/2494)) ([564dbf2](https://github.com/floci-io/floci/commit/564dbf204f36ad25e59add7588ebb7df6708e8e8))
* **kinesis:** reject non-blob Data instead of coercing it with asText ([#2551](https://github.com/floci-io/floci/issues/2551)) ([df5581e](https://github.com/floci-io/floci/commit/df5581e5bd7fb592e062b3511dd30f0bb5fb866f)), closes [#2516](https://github.com/floci-io/floci/issues/2516)
* **kms:** grant fidelity ([#2639](https://github.com/floci-io/floci/issues/2639)) ([5400204](https://github.com/floci-io/floci/commit/54002045635852b3cc5fbdcafcc9ff8d1ca71361))
* **lambda:** delete only the named version when DeleteFunction has a Qualifier ([#2824](https://github.com/floci-io/floci/issues/2824)) ([ca4c84c](https://github.com/floci-io/floci/commit/ca4c84c9e0f04a951410c872e73d5265853965b7)), closes [#2819](https://github.com/floci-io/floci/issues/2819)
* **lambda:** honour ListLayers and ListLayerVersions query parameters ([#2817](https://github.com/floci-io/floci/issues/2817)) ([4462963](https://github.com/floci-io/floci/commit/44629631ca1e38836aa6d3405d4cc30a8f45c1fc)), closes [#2808](https://github.com/floci-io/floci/issues/2808)
* **lambda:** honour Publish on CreateFunction and UpdateFunctionCode ([#2825](https://github.com/floci-io/floci/issues/2825)) ([a7b2b79](https://github.com/floci-io/floci/commit/a7b2b794929f9f79a8f31fa374b3bafe06d89097)), closes [#2820](https://github.com/floci-io/floci/issues/2820)
* **lambda:** implement GetLayerVersionByArn ([#2812](https://github.com/floci-io/floci/issues/2812)) ([5b363ff](https://github.com/floci-io/floci/commit/5b363ffa2dd25beadd1cea3b24bea1ce9ddf1128))
* **lambda:** make the code-volume populate concurrency configurable ([#2830](https://github.com/floci-io/floci/issues/2830)) ([968ff78](https://github.com/floci-io/floci/commit/968ff78e252945f651b7ca105dfdb840bedd3159)), closes [#2050](https://github.com/floci-io/floci/issues/2050)
* **lambda:** read deployment packages via the zip central directory ([#2649](https://github.com/floci-io/floci/issues/2649)) ([cd3f367](https://github.com/floci-io/floci/commit/cd3f3677f8e82ba8664368d162ad671da646c1fc)), closes [#2593](https://github.com/floci-io/floci/issues/2593) [#1215](https://github.com/floci-io/floci/issues/1215)
* **lambda:** replace the extracted package instead of merging into it ([#2672](https://github.com/floci-io/floci/issues/2672)) ([e4c6903](https://github.com/floci-io/floci/commit/e4c690351f724223ef9c86192039a712c8bddaac)), closes [#2647](https://github.com/floci-io/floci/issues/2647)
* **lambda:** resolve ARN and function URL invocations in owning account ([#2414](https://github.com/floci-io/floci/issues/2414)) ([c22652d](https://github.com/floci-io/floci/commit/c22652dd15604e5332dba8c462b1394b101cc81f))
* **lambda:** resolve launched-container placeholder creds to the owning account ([#2657](https://github.com/floci-io/floci/issues/2657)) ([be89286](https://github.com/floci-io/floci/commit/be892864db40af1ec7b6c09a21e84ea8434999ab))
* **lambda:** return VpcConfig, SnapStart and LoggingConfig from every read path ([#2527](https://github.com/floci-io/floci/issues/2527)) ([94795dd](https://github.com/floci-io/floci/commit/94795dd67b695b0e06377299d31b5559466f2a5e)), closes [-_/#A-Za-z0-9](https://github.com/floci-io/floci/issues/A-Za-z0-9)
* **lambda:** round-trip StartingPosition on event source mappings ([#2370](https://github.com/floci-io/floci/issues/2370)) ([151e3fc](https://github.com/floci-io/floci/commit/151e3fcc7a4a5cfd6ee663ecb928c48e720f4ceb))
* **lambda:** serialize resource policy mutations ([#2430](https://github.com/floci-io/floci/issues/2430)) ([2314c85](https://github.com/floci-io/floci/commit/2314c85b620b23a5850b633d41a68c7a4fcf0b6e))
* **lifecycle:** run start/ready hooks when FLOCI_PORT is non-default ([#2439](https://github.com/floci-io/floci/issues/2439)) ([ba97c08](https://github.com/floci-io/floci/commit/ba97c084eb51c7149fadbfcca5f7b9439583a77a)), closes [#2437](https://github.com/floci-io/floci/issues/2437)
* **memorydb,neptune,docdb:** degrade gracefully with no Docker daemon ([#2386](https://github.com/floci-io/floci/issues/2386)) ([65b22ff](https://github.com/floci-io/floci/commit/65b22ff01e3fcb24d4024c18ed3557e086a567b5)), closes [lex00/floci#44](https://github.com/lex00/floci/issues/44)
* **msk:** accept an empty serverProperties on Create/UpdateConfiguration ([#2491](https://github.com/floci-io/floci/issues/2491)) ([fcd662f](https://github.com/floci-io/floci/commit/fcd662fb623531a6e98b15f5aa44b7eb0768cf05))
* **msk:** persist CreateCluster broker node groups, encryption, client auth, logging, configuration and tags ([#2366](https://github.com/floci-io/floci/issues/2366)) ([0205e4e](https://github.com/floci-io/floci/commit/0205e4ed7efe267ade3a95c0af8be9f23fbe93b5)), closes [#2571](https://github.com/floci-io/floci/issues/2571)
* **msk:** reject numberOfBrokerNodes values that only look whole after double rounding ([#2571](https://github.com/floci-io/floci/issues/2571)) ([bd436ee](https://github.com/floci-io/floci/commit/bd436eeea1d6e75a6caec0aa684408f757b66901)), closes [MskService#validateCreateRequest](https://github.com/MskService/issues/validateCreateRequest)
* **msk:** return BadRequestException when a configuration ARN does not exist ([#2572](https://github.com/floci-io/floci/issues/2572)) ([247bd59](https://github.com/floci-io/floci/commit/247bd590bcb9bbf3c91366423d69527071818140)), closes [MskService#describeConfiguration](https://github.com/MskService/issues/describeConfiguration)
* **opensearch:** address spawned domain containers by IP, not name ([#2746](https://github.com/floci-io/floci/issues/2746)) ([fcc6067](https://github.com/floci-io/floci/commit/fcc606799c06802302b64ba3d871250886c0bb44))
* preserve Firehose compression format in CloudFormation ([#2406](https://github.com/floci-io/floci/issues/2406)) ([ebd4a07](https://github.com/floci-io/floci/commit/ebd4a078d39198d8a2bdc06420ad73ab21aca100))
* preserve Route 53 private hosted-zone VPC associations ([#2342](https://github.com/floci-io/floci/issues/2342)) ([967ea84](https://github.com/floci-io/floci/commit/967ea843a0b3706143c27e6dfc142d0b21a3d7cc)), closes [#2294](https://github.com/floci-io/floci/issues/2294)
* **rds,docdb:** list DocumentDB clusters and instances in the RDS-family list form ([#2623](https://github.com/floci-io/floci/issues/2623)) ([3b0e31b](https://github.com/floci-io/floci/commit/3b0e31b8880fb1439f5b475280621da8ecc4ee89)), closes [#2613](https://github.com/floci-io/floci/issues/2613) [#1829](https://github.com/floci-io/floci/issues/1829)
* **rds,firehose,cognito:** match AWS's real defaults so a second terraform plan reports no changes ([#2420](https://github.com/floci-io/floci/issues/2420)) ([5ed3a8c](https://github.com/floci-io/floci/commit/5ed3a8cad97fd1ffe1046f6a73c91b4826689697)), closes [FirehoseService#mergeDestination](https://github.com/FirehoseService/issues/mergeDestination)
* **rds:** clear CLIENT_SSL before forwarding the TLS-terminated handshake response to the backend ([#2698](https://github.com/floci-io/floci/issues/2698)) ([0090739](https://github.com/floci-io/floci/commit/009073961725a3881646331ef026903151e03f32))
* **rds:** grant the MySQL/MariaDB master user RDS-master-equivalent privileges ([#2679](https://github.com/floci-io/floci/issues/2679)) ([6c96f47](https://github.com/floci-io/floci/commit/6c96f47f7350cf86bdb5bc47db693de9f93bef27))
* **rds:** keep the tags given to CreateDBSubnetGroup ([#2627](https://github.com/floci-io/floci/issues/2627)) ([20ecb89](https://github.com/floci-io/floci/commit/20ecb89155674e34168b76c811c0deb00da3933d)), closes [#2612](https://github.com/floci-io/floci/issues/2612)
* **rds:** propagate ModifyDBCluster master-password rotations to the backend and every proxy ([#2727](https://github.com/floci-io/floci/issues/2727)) ([895b59f](https://github.com/floci-io/floci/commit/895b59f1eeaf1824de77578469b6520f6a72a2b2)), closes [#2709](https://github.com/floci-io/floci/issues/2709)
* **rds:** propagate ModifyDBInstance master-password rotations to the backend and proxy ([#2709](https://github.com/floci-io/floci/issues/2709)) ([09a05c2](https://github.com/floci-io/floci/commit/09a05c2d77f87a8b04454ae11eda23ea6705f76e))
* **rds:** reject a duplicate create while provisioning is in flight ([#2525](https://github.com/floci-io/floci/issues/2525)) ([7ef698c](https://github.com/floci-io/floci/commit/7ef698c1f408cb0b449c493ab1951eb984d15068)), closes [#2051](https://github.com/floci-io/floci/issues/2051)
* **rds:** store and return the encryption and backup settings given on create ([#2617](https://github.com/floci-io/floci/issues/2617)) ([5033ace](https://github.com/floci-io/floci/commit/5033ace77233db320733228b544b1fd48acce93f)), closes [#2611](https://github.com/floci-io/floci/issues/2611)
* repair main CI (AslExecutor test compilation, Redshift compat test endpoint) ([#2726](https://github.com/floci-io/floci/issues/2726)) ([477e8ae](https://github.com/floci-io/floci/commit/477e8ae7b9106329213b3ee4a1c2109d44b91fa9)), closes [#2703](https://github.com/floci-io/floci/issues/2703) [#2688](https://github.com/floci-io/floci/issues/2688)
* **s3:** accept the log-delivery-write canned ACL ([#2653](https://github.com/floci-io/floci/issues/2653)) ([2a014d2](https://github.com/floci-io/floci/commit/2a014d2add67fb7b243bbf7d1d8021f09b53d1ab))
* **s3:** emit post events for browser uploads ([#2577](https://github.com/floci-io/floci/issues/2577)) ([d8ef1c8](https://github.com/floci-io/floci/commit/d8ef1c8d7b91c7cda9629834f1315eac6de7d90f))
* **s3:** prevent compliance retention downgrade ([#2755](https://github.com/floci-io/floci/issues/2755)) ([2e5935d](https://github.com/floci-io/floci/commit/2e5935d7641a9f0920e8ae7f46db8eab46d6679e))
* **s3:** resolve virtual-hosted buckets whose names contain dots ([#2493](https://github.com/floci-io/floci/issues/2493)) ([ea2b62f](https://github.com/floci-io/floci/commit/ea2b62fb955e7eef3b9b8c46f0b604d4da9703b7))
* **s3:** return x-amz-version-id from presigned POST ([#2608](https://github.com/floci-io/floci/issues/2608)) ([066e6c9](https://github.com/floci-io/floci/commit/066e6c904b4c623b56f14ee01f5a8e44e7fe684f)), closes [#2607](https://github.com/floci-io/floci/issues/2607)
* **s3:** route the replication subresource instead of falling through ([#2519](https://github.com/floci-io/floci/issues/2519)) ([ce4f6d1](https://github.com/floci-io/floci/commit/ce4f6d1c48ed87f72a7906f7ca5d70b52dc8a31a)), closes [#2296](https://github.com/floci-io/floci/issues/2296)
* **secretsmanager,rds:** rotate secrets that an AWS service manages ([#2378](https://github.com/floci-io/floci/issues/2378)) ([23015a7](https://github.com/floci-io/floci/commit/23015a747568e4bffcc7d595573371d9254bbfe1))
* **secretsmanager:** raise InvalidRequestException, not ResourceNotFoundException, for pending-deletion secrets ([#2514](https://github.com/floci-io/floci/issues/2514)) ([fd78ae4](https://github.com/floci-io/floci/commit/fd78ae4f4b474028f4056a5ab69b445051c74480)), closes [#2513](https://github.com/floci-io/floci/issues/2513)
* **secretsmanager:** stop CreateSecret overwriting a secret inside its recovery window ([#2555](https://github.com/floci-io/floci/issues/2555)) ([1e443ac](https://github.com/floci-io/floci/commit/1e443acd0614d57c6cc409a143bc27e60de2f142)), closes [#2549](https://github.com/floci-io/floci/issues/2549)
* **security:** reject unregistered SigV4 access keys and unbound usernames ([#2680](https://github.com/floci-io/floci/issues/2680)) ([f9d28c9](https://github.com/floci-io/floci/commit/f9d28c9649753e527b53512b72a19256c78176ec)), closes [#2657](https://github.com/floci-io/floci/issues/2657)
* serialize Kinesis stream creation timestamps as plain decimals ([#2173](https://github.com/floci-io/floci/issues/2173)) ([c335086](https://github.com/floci-io/floci/commit/c33508651ea14f54002393eefa887b4f173b0df9)), closes [#2099](https://github.com/floci-io/floci/issues/2099)
* **ses:** enforce full AWS tag validation across all SES resources ([#2504](https://github.com/floci-io/floci/issues/2504)) ([29f6e7a](https://github.com/floci-io/floci/commit/29f6e7ac6b56d45cec36042b4864be8a79ec99e2))
* **ses:** reject non-string tag members with SerializationException ([#2512](https://github.com/floci-io/floci/issues/2512)) ([60dd795](https://github.com/floci-io/floci/commit/60dd7957036ea2345acbff9ac8d8d0951c88f122))
* **ses:** report the sending account in send-event payloads ([#2499](https://github.com/floci-io/floci/issues/2499)) ([bd36b02](https://github.com/floci-io/floci/commit/bd36b02728aa8e4c00cb64cad582f425bde20256))
* **ses:** return DeliveryOptions from v1 DescribeConfigurationSet ([#2841](https://github.com/floci-io/floci/issues/2841)) ([7473c57](https://github.com/floci-io/floci/commit/7473c57720840d76668866f08dd4db757d6a8eb2))
* **signin:** preserve AWS token error modes ([#2554](https://github.com/floci-io/floci/issues/2554)) ([399bf20](https://github.com/floci-io/floci/commit/399bf203872d0c59a7bb904cf0df5acadde229be))
* **ssm:** stop re-reading shared mutable state in the command status rollup ([#2477](https://github.com/floci-io/floci/issues/2477)) ([6f1ce9b](https://github.com/floci-io/floci/commit/6f1ce9b23f68cbdca791d394035603dee7672f17)), closes [#2264](https://github.com/floci-io/floci/issues/2264) [#2264](https://github.com/floci-io/floci/issues/2264)
* **ssm:** validate SettingValue and require an account list on ModifyDocumentPermission ([#2635](https://github.com/floci-io/floci/issues/2635)) ([149ac63](https://github.com/floci-io/floci/commit/149ac635f22ea9b3de343d9e13fb8bb213c4642e))
* **stepfunctions:** bound $range allocation at the AWS memory limit ([#2790](https://github.com/floci-io/floci/issues/2790)) ([f7f16cd](https://github.com/floci-io/floci/commit/f7f16cd2a3e72882fc8fcc2c4e80cf2b9f1c827a)), closes [#2738](https://github.com/floci-io/floci/issues/2738) [#2737](https://github.com/floci-io/floci/issues/2737)
* **stepfunctions:** bound a running execution the four ways AWS does ([#2782](https://github.com/floci-io/floci/issues/2782)) ([9288769](https://github.com/floci-io/floci/commit/92887696074b7e709c4f103cf86bb0b4561c742e)), closes [#2733](https://github.com/floci-io/floci/issues/2733)
* **stepfunctions:** bound JSONata evaluation by time and depth ([#2697](https://github.com/floci-io/floci/issues/2697)) ([3954018](https://github.com/floci-io/floci/commit/395401807b4a6a10586fe963c9ba79be49ba365a)), closes [Frame#setRuntimeBounds](https://github.com/Frame/issues/setRuntimeBounds) [#2667](https://github.com/floci-io/floci/issues/2667)
* **stepfunctions:** end the execution when a state throws an Error ([#2693](https://github.com/floci-io/floci/issues/2693)) ([acf8879](https://github.com/floci-io/floci/commit/acf88794ca4e08a5ce26080e33a4e18d081bf99e)), closes [#2666](https://github.com/floci-io/floci/issues/2666)
* **stepfunctions:** fail the state when a JSONata expression returns nothing ([#2689](https://github.com/floci-io/floci/issues/2689)) ([ea11e67](https://github.com/floci-io/floci/commit/ea11e6771948d2d21520feb2393d9356d95ba8b6)), closes [#2665](https://github.com/floci-io/floci/issues/2665)
* **stepfunctions:** keep a JSONata expression's explicit null in the output ([#2684](https://github.com/floci-io/floci/issues/2684)) ([48e0ecd](https://github.com/floci-io/floci/commit/48e0ecd809026b79f7b296e365268368dd31e48a)), closes [#2664](https://github.com/floci-io/floci/issues/2664) [#2665](https://github.com/floci-io/floci/issues/2665)
* **stepfunctions:** let a mocked response with no attempts start the execution ([#2823](https://github.com/floci-io/floci/issues/2823)) ([63a2a60](https://github.com/floci-io/floci/commit/63a2a60a3001bec613b297c39771b1f8479cb789)), closes [#2523](https://github.com/floci-io/floci/issues/2523)
* **stepfunctions:** refuse the definitions AWS refuses, at both validation entry points ([#2786](https://github.com/floci-io/floci/issues/2786)) ([ead70ea](https://github.com/floci-io/floci/commit/ead70eae4dae927668332964b674a96f01be4418))
* **stepfunctions:** resolve the substitutions in a JSONata error cause ([#2687](https://github.com/floci-io/floci/issues/2687)) ([09d813d](https://github.com/floci-io/floci/commit/09d813d13fc7b1f0bc087c0de57222b61607dc03)), closes [#2668](https://github.com/floci-io/floci/issues/2668)
* **stepfunctions:** write a large whole number in full in $string ([#2683](https://github.com/floci-io/floci/issues/2683)) ([2a7ee7a](https://github.com/floci-io/floci/commit/2a7ee7a605800dca7e81ee9f9c144cf6db62446f)), closes [#2669](https://github.com/floci-io/floci/issues/2669)
* **ui:** reconnect the UI sidecar without restarting Floci ([#2718](https://github.com/floci-io/floci/issues/2718)) ([02f9754](https://github.com/floci-io/floci/commit/02f9754ac774963dfd3ce1945f9be00dcf9805e7)), closes [HI#severity](https://github.com/HI/issues/severity)
* update .gitignore to include .mission/ for shared tooling visibility ([#2750](https://github.com/floci-io/floci/issues/2750)) ([2bc3736](https://github.com/floci-io/floci/commit/2bc37365dc01b09b7eb3bf3540718023b375f710))
### Features
* **acm:** certificate validation records and revocation ([#2655](https://github.com/floci-io/floci/issues/2655)) ([3bd9bcc](https://github.com/floci-io/floci/commit/3bd9bcc62b4f1bd9a1c183863ab60360cdd0104b))
* **apigateway:** API key import/usage-plan fidelity and update-operation fixes ([#2631](https://github.com/floci-io/floci/issues/2631)) ([9b9e7f5](https://github.com/floci-io/floci/commit/9b9e7f56a2896bc00fd97f7a8ebd8c49561874b5))
* **apigatewayv2:** OpenAPI import and Terraform-visible API/stage attributes ([#2714](https://github.com/floci-io/floci/issues/2714)) ([881695e](https://github.com/floci-io/floci/commit/881695ea3b1c35e19ad621099f0e041e6d0bee0b))
* **apigatewayv2:** support custom domain names and API mappings ([#2390](https://github.com/floci-io/floci/issues/2390)) ([74da157](https://github.com/floci-io/floci/commit/74da157681dc98af183d3d3704f3f5c3853071f1))
* **applicationautoscaling:** evaluate target-tracking and step-scaling policies against ECS ([#2692](https://github.com/floci-io/floci/issues/2692)) ([2a7c94b](https://github.com/floci-io/floci/commit/2a7c94b04d1f797335c2bd87fcb9ab3730df21ff)), closes [#2565](https://github.com/floci-io/floci/issues/2565)
* **appsync:** Phase 7 — GraphQL execute authentication ([#2380](https://github.com/floci-io/floci/issues/2380)) ([3f12428](https://github.com/floci-io/floci/commit/3f12428d9737584b875ce380874ca2fd49a216f0))
* **aps:** add Amazon Managed Service for Prometheus workspaces ([#2604](https://github.com/floci-io/floci/issues/2604)) ([277809f](https://github.com/floci-io/floci/commit/277809fb416d00dbda8b295bb5b5ffbe5dd86f1e))
* **autoscaling:** P0 operations and lifecycle-hook delete-by-name ([#2673](https://github.com/floci-io/floci/issues/2673)) ([e9a379b](https://github.com/floci-io/floci/commit/e9a379b37a3627cb8e0a3dc752687562e6b00a73))
* **batch:** add update and delete job queue endpoints with corresponding service logic ([#2807](https://github.com/floci-io/floci/issues/2807)) ([6f123e8](https://github.com/floci-io/floci/commit/6f123e83b8cb2aba087fe8c0a3e8c6cfc7f74c66))
* **cloudformation:** apply security-group rules — inline properties and standalone resources ([#1993](https://github.com/floci-io/floci/issues/1993)) ([1461a10](https://github.com/floci-io/floci/commit/1461a10de7b23e03ce6514ba8567c31964a94ee6)), closes [#1992](https://github.com/floci-io/floci/issues/1992)
* **cloudformation:** CDK Provider-framework custom resources and changeset/SSM param fidelity ([#2688](https://github.com/floci-io/floci/issues/2688)) ([08e532a](https://github.com/floci-io/floci/commit/08e532ab1af8ada89ac3c663a55d3069bbcef662)), closes [#2455](https://github.com/floci-io/floci/issues/2455) [#2455](https://github.com/floci-io/floci/issues/2455) [#2666](https://github.com/floci-io/floci/issues/2666)
* **cloudformation:** CodeBuild/CodePipeline CFN provisioning ([#2685](https://github.com/floci-io/floci/issues/2685)) ([ac94232](https://github.com/floci-io/floci/commit/ac94232910e4ac6aeca5e3652cd510823785bd87))
* **cloudformation:** expand SAM AWS::Serverless::HttpApi to ApiGatew… ([#1956](https://github.com/floci-io/floci/issues/1956)) ([6fa53ab](https://github.com/floci-io/floci/commit/6fa53abd7cd9db183addee8d0bd2a80c38449e20))
* **cloudformation:** provision WAFv2 web ACLs and AWS Config rules ([#2701](https://github.com/floci-io/floci/issues/2701)) ([8a705d0](https://github.com/floci-io/floci/commit/8a705d0aae7a64d831ec57bdaa89802c5e441c76)), closes [CloudFormationTemplateEngine#resolveNode](https://github.com/CloudFormationTemplateEngine/issues/resolveNode)
* **cloudfront:** apply response-headers policies when serving ([#1833](https://github.com/floci-io/floci/issues/1833)) ([520c0f4](https://github.com/floci-io/floci/commit/520c0f4da29313978302852f44a11e94f171e740)), closes [#1820](https://github.com/floci-io/floci/issues/1820) [#1823](https://github.com/floci-io/floci/issues/1823)
* **cloudfront:** forward origin custom headers ([#1832](https://github.com/floci-io/floci/issues/1832)) ([f2ad05c](https://github.com/floci-io/floci/commit/f2ad05ce22e34e413177aa5884400cb83adcc925)), closes [#1820](https://github.com/floci-io/floci/issues/1820) [#1823](https://github.com/floci-io/floci/issues/1823)
* **cloudwatch-logs:** add resource policy actions ([#2574](https://github.com/floci-io/floci/issues/2574)) ([859db2f](https://github.com/floci-io/floci/commit/859db2f35223a1d4082dac30a757a2e0d3a77ee7))
* **cloudwatch:** Adds support for orderBy, pagination, limit in DescribeLogStreams response ([#2362](https://github.com/floci-io/floci/issues/2362)) ([846e78d](https://github.com/floci-io/floci/commit/846e78db12a2dae80489bdad86e65297a94da183))
* **codegurureviewer:** repository association lifecycle with tagging ([#2741](https://github.com/floci-io/floci/issues/2741)) ([0b46d80](https://github.com/floci-io/floci/commit/0b46d804c04b01f0d72303f8bcd7ae7907e9b98a))
* **codepipeline:** validate ListPipelineExecutions filters and PutApprovalResult inputs ([#2696](https://github.com/floci-io/floci/issues/2696)) ([a155e66](https://github.com/floci-io/floci/commit/a155e66b153193fc7d7a40d21311ee54cd7fc9d8))
* **cognito:** user pool domain operations (Create/Describe/DeleteUserPoolDomain) ([#2742](https://github.com/floci-io/floci/issues/2742)) ([ed16713](https://github.com/floci-io/floci/commit/ed167135ff63773a88bd1ac8b6bd8b23514941f7))
* **comprehend:** add Amazon Comprehend sync text-analysis actions ([#2674](https://github.com/floci-io/floci/issues/2674)) ([5c1b69c](https://github.com/floci-io/floci/commit/5c1b69c45f7b1dfa727f483ac31aa0eef695cc72)), closes [#2660](https://github.com/floci-io/floci/issues/2660)
* **config:** compliance evaluation loop, retention, pagination ([#2642](https://github.com/floci-io/floci/issues/2642)) ([1b3417a](https://github.com/floci-io/floci/commit/1b3417a7a3c2e90b2fa8e13a552cdfdb134d8cc0))
* **connect:** instance management (CreateInstance family, attributes, storage configs, tags) ([#2740](https://github.com/floci-io/floci/issues/2740)) ([7b6266e](https://github.com/floci-io/floci/commit/7b6266e902a938ba0cb4bbc0d49657392a2819a9))
* **controltower:** add AWS Control Tower with landing-zone and baseline lifecycle ([#2578](https://github.com/floci-io/floci/issues/2578)) ([4524099](https://github.com/floci-io/floci/commit/45240998ac0fb62a466dadf9278f6f9ef63072e2))
* **core:** add configurable mock responses for stub AI services ([#2765](https://github.com/floci-io/floci/issues/2765)) ([e2e69f6](https://github.com/floci-io/floci/commit/e2e69f65f55be1fc81f891c797008931a788a4f9)), closes [#2764](https://github.com/floci-io/floci/issues/2764)
* **core:** label emulated resource containers with io.floci.* identity ([#2497](https://github.com/floci-io/floci/issues/2497)) ([8247014](https://github.com/floci-io/floci/commit/824701481cfcd7a3c9a4056134898712f0228816)), closes [#1818](https://github.com/floci-io/floci/issues/1818) [#1818](https://github.com/floci-io/floci/issues/1818)
* **docs:** guard the service matrix against undocumented services ([#2465](https://github.com/floci-io/floci/issues/2465)) ([700acc6](https://github.com/floci-io/floci/commit/700acc65c78035da2d4988d07bf74a9b6f490d0a)), closes [#2436](https://github.com/floci-io/floci/issues/2436)
* **ec2:** IPAM with real CIDR allocation, EBS encryption defaults, and transit gateway route export ([#2596](https://github.com/floci-io/floci/issues/2596)) ([9563b7e](https://github.com/floci-io/floci/commit/9563b7ef08e9a8cc45da70190221659cc7ea8781)), closes [#2526](https://github.com/floci-io/floci/issues/2526) [floci-io/floci#2605](https://github.com/floci-io/floci/issues/2605)
* **ec2:** support ModifyVpcEndpoint and persist the endpoint policy ([#2526](https://github.com/floci-io/floci/issues/2526)) ([2e8cbc1](https://github.com/floci-io/floci/commit/2e8cbc13d7293fad19c737a034dc17b839822375)), closes [#2317](https://github.com/floci-io/floci/issues/2317)
* **ec2:** support transit gateway route tables, associations and routes ([#2348](https://github.com/floci-io/floci/issues/2348)) ([bc0f88c](https://github.com/floci-io/floci/commit/bc0f88c9b1df3084cd50e2acbe148f963dfcc803)), closes [#2308](https://github.com/floci-io/floci/issues/2308) [#2329](https://github.com/floci-io/floci/issues/2329)
* **ec2:** support transit gateway VPC attachments ([#2347](https://github.com/floci-io/floci/issues/2347)) ([74e43a4](https://github.com/floci-io/floci/commit/74e43a46320c3b3bff8f328d6a9206a80927b9de)), closes [#2308](https://github.com/floci-io/floci/issues/2308)
* **ecs:** rewrite ECR image URIs on RunTask like Lambda already does ([#2641](https://github.com/floci-io/floci/issues/2641)) ([c405093](https://github.com/floci-io/floci/commit/c4050936a84d29c0874d39519a9d21e17c438a19)), closes [#2568](https://github.com/floci-io/floci/issues/2568)
* **efs:** add Elastic File System (file systems, mount targets, access points) ([#2371](https://github.com/floci-io/floci/issues/2371)) ([943b4c1](https://github.com/floci-io/floci/commit/943b4c1b456c9fb43332ff67f5ed321d778a00f4))
* **elasticache:** support cache parameter groups ([#2392](https://github.com/floci-io/floci/issues/2392)) ([6b62817](https://github.com/floci-io/floci/commit/6b628179f3f39b853cf30369ac2b166bb474cef1))
* **elasticache:** support cache subnet groups ([#2401](https://github.com/floci-io/floci/issues/2401)) ([06d58aa](https://github.com/floci-io/floci/commit/06d58aad36ce35cfe5bac7438bf53003d5a5f63e))
* **elasticache:** support cluster-mode replication groups ([#2633](https://github.com/floci-io/floci/issues/2633)) ([97ff0bc](https://github.com/floci-io/floci/commit/97ff0bc3e9ff0aea77faf188550c0587ee0b451b))
* **emrserverless:** support EMR Serverless applications ([#2403](https://github.com/floci-io/floci/issues/2403)) ([8a673fc](https://github.com/floci-io/floci/commit/8a673fc580f2ef57ec11f4153fe013f584327004))
* **eventbridge:** add Connection API actions ([#1897](https://github.com/floci-io/floci/issues/1897)) ([36a55f5](https://github.com/floci-io/floci/commit/36a55f5060e8eb25e878aa1539d371f9aff03c65))
* **firehose:** add StartDeliveryStreamEncryption and StopDeliveryStreamEncryption ([#2583](https://github.com/floci-io/floci/issues/2583)) ([4affa05](https://github.com/floci-io/floci/commit/4affa05ceab19c02a950801a3c41f3eabcb2ca42))
* **firehose:** deliver records from a Kinesis stream source ([#2528](https://github.com/floci-io/floci/issues/2528)) ([009ac0b](https://github.com/floci-io/floci/commit/009ac0b4a62e2e1fbf799c19800bd02e7c05d36b))
* **firehose:** honor CompressionFormat and FileExtension on S3 delivery ([#2410](https://github.com/floci-io/floci/issues/2410)) ([bba5ffb](https://github.com/floci-io/floci/commit/bba5ffb644c02b3ac5a93502b1c85ab436f8cca8)), closes [#2328](https://github.com/floci-io/floci/issues/2328)
* **fis:** add AWS FIS support ([#2435](https://github.com/floci-io/floci/issues/2435)) ([04d120f](https://github.com/floci-io/floci/commit/04d120fdd5f0927bb14ae83682f4e72a1c7396a7))
* **iam:** enforce SCPs and populate aws:PrincipalArn during policy evaluation ([#2637](https://github.com/floci-io/floci/issues/2637)) ([7188b3e](https://github.com/floci-io/floci/commit/7188b3ec9d1ca52defad1246af525116e9da1c0c)), closes [iam.md#service-control-policies-scps](https://github.com/iam.md/issues/service-control-policies-scps) [iam.md#bypass-rules](https://github.com/iam.md/issues/bypass-rules) [hi#water](https://github.com/hi/issues/water)
* **kinesis:** add PutRecords request caps and a per-stream max record size ([#2438](https://github.com/floci-io/floci/issues/2438)) ([353d9c8](https://github.com/floci-io/floci/commit/353d9c842fa81a0c807466253ce3cb748bd210d6))
* **kinesisanalytics:** emit MSF-style JSON CloudWatch logs from Flink ([#2656](https://github.com/floci-io/floci/issues/2656)) ([aaae992](https://github.com/floci-io/floci/commit/aaae99282f8ee737f587b08da98930a345108f52))
* **lakeformation:** lake formation ([#2427](https://github.com/floci-io/floci/issues/2427)) ([ac6cb06](https://github.com/floci-io/floci/commit/ac6cb06af4f529cfaab7449ceddb6863a652cbb2))
* **lambda:** add the ability to name and label lambda containers, code volumes ([#2409](https://github.com/floci-io/floci/issues/2409)) ([f8b07a7](https://github.com/floci-io/floci/commit/f8b07a78ff2aecbbd5fb71dd8efe71626648b160))
* **lambda:** code-signing endpoints and account settings ([#2646](https://github.com/floci-io/floci/issues/2646)) ([c90c5ad](https://github.com/floci-io/floci/commit/c90c5adfcbc2da8309e02e2d96418a03001ebc01)), closes [#2225](https://github.com/floci-io/floci/issues/2225) [#2206](https://github.com/floci-io/floci/issues/2206) [#1987](https://github.com/floci-io/floci/issues/1987)
* **lambda:** support kubernetes as the lambda runner ([#1941](https://github.com/floci-io/floci/issues/1941)) ([bc13801](https://github.com/floci-io/floci/commit/bc1380112168f3600938695c74cfa3d7e87eff7c))
* **logs:** add AssociateKmsKey and DisassociateKmsKey for log groups ([#2584](https://github.com/floci-io/floci/issues/2584)) ([4435c62](https://github.com/floci-io/floci/commit/4435c6284859ad96d72df327c4d15072499e01e0))
* **msk:** add configuration revision actions ([#2344](https://github.com/floci-io/floci/issues/2344)) ([7505110](https://github.com/floci-io/floci/commit/7505110ed96ba65b663101d08d9bf0764a073e0e)), closes [#2339](https://github.com/floci-io/floci/issues/2339) [#2340](https://github.com/floci-io/floci/issues/2340) [#2299](https://github.com/floci-io/floci/issues/2299) [2336/#2343](https://github.com/floci-io/floci/issues/2343) [#2343](https://github.com/floci-io/floci/issues/2343) [MskService#updateConfiguration](https://github.com/MskService/issues/updateConfiguration) [MskConfiguration#addRevision](https://github.com/MskConfiguration/issues/addRevision)
* **networkfirewall:** emulate AWS Network Firewall ([#2580](https://github.com/floci-io/floci/issues/2580)) ([715bab6](https://github.com/floci-io/floci/commit/715bab68e7d0665012883083cd0837b8327aea1d)), closes [#2579](https://github.com/floci-io/floci/issues/2579)
* **organizations:** add AWS Organizations service ([#2489](https://github.com/floci-io/floci/issues/2489)) ([87e8044](https://github.com/floci-io/floci/commit/87e804492aaa0d87b0bbec94110cfcad84c61f3e))
* **organizations:** add CloudFormation resource types ([#2495](https://github.com/floci-io/floci/issues/2495)) ([054508d](https://github.com/floci-io/floci/commit/054508df87a29fbeb40cd4c6be61f3c5286cda3d))
* **organizations:** add ListAccountsWithInvalidEffectivePolicy ([#2628](https://github.com/floci-io/floci/issues/2628)) ([18521ed](https://github.com/floci-io/floci/commit/18521edf287f8006da3c3dc43e075c03e7e9d7fd))
* **organizations:** add management account email configuration and tests ([#2749](https://github.com/floci-io/floci/issues/2749)) ([89fd37a](https://github.com/floci-io/floci/commit/89fd37a5c43fdbeb173199496823bd8040119369))
* **rds-data:** adding data-api support for lable/name and batch ([#2518](https://github.com/floci-io/floci/issues/2518)) ([a3044e0](https://github.com/floci-io/floci/commit/a3044e065e26e0cdf7b3de2e8ee823923323034e))
* **rds,docdb:** answer DescribeGlobalClusters ([#2402](https://github.com/floci-io/floci/issues/2402)) ([29b0d60](https://github.com/floci-io/floci/commit/29b0d600c6a1398ed44dabdb20620174531fcde5))
* **rds,docdb:** tag DocumentDB clusters and parameter groups ([#2408](https://github.com/floci-io/floci/issues/2408)) ([7b83bd5](https://github.com/floci-io/floci/commit/7b83bd5283f7df7650f94ce591c009061c07c301))
* **rds:** add option group CRUD ([#2352](https://github.com/floci-io/floci/issues/2352)) ([3374bfe](https://github.com/floci-io/floci/commit/3374bfeb0492ac353d001c6fd23465617fe2d42a)), closes [#2304](https://github.com/floci-io/floci/issues/2304)
* **rds:** match proxy TLS cert SAN to the advertised endpoint ([#2603](https://github.com/floci-io/floci/issues/2603)) ([b1d7286](https://github.com/floci-io/floci/commit/b1d7286444e5ad54c51c5d2e83ffe6d9f9a66b60))
* **rds:** model Aurora Serverless v2 scaling configuration on DB clusters ([#1829](https://github.com/floci-io/floci/issues/1829)) ([d778a6e](https://github.com/floci-io/floci/commit/d778a6e393ab455b6ec45e11f1ae001adf837ff0))
* **redshift:** implement Redshift emulation with snapshot and parameter group support ([#2472](https://github.com/floci-io/floci/issues/2472)) ([a1383fd](https://github.com/floci-io/floci/commit/a1383fdd3d1df080cf40fe304905e53eca6b57cb))
* **rekognition:** add Amazon Rekognition sync image-analysis actions ([#2706](https://github.com/floci-io/floci/issues/2706)) ([cf6fede](https://github.com/floci-io/floci/commit/cf6fede45357dd9ae619ea7b062463fe836f61ae)), closes [#2705](https://github.com/floci-io/floci/issues/2705)
* **resourceexplorer2:** add AWS Resource Explorer 2 with cross-service resource discovery ([#2485](https://github.com/floci-io/floci/issues/2485)) ([d3871e1](https://github.com/floci-io/floci/commit/d3871e1f258dd2c85cf5ab97f140a20b51774e1c)), closes [#1583](https://github.com/floci-io/floci/issues/1583) [#1797](https://github.com/floci-io/floci/issues/1797)
* **route53resolver:** add Route 53 Resolver with DNS Firewall domain lists ([#2582](https://github.com/floci-io/floci/issues/2582)) ([d60bd6e](https://github.com/floci-io/floci/commit/d60bd6ead21c5f2e3e51c9ddc2a9435285c356c8)), closes [#2579](https://github.com/floci-io/floci/issues/2579)
* **route53:** VPC association lifecycle actions ([#2638](https://github.com/floci-io/floci/issues/2638)) ([e471946](https://github.com/floci-io/floci/commit/e471946f44318b406c3a470b31c725f9a93ac303))
* **s3:** apply VersioningConfiguration in CloudFormation S3 bucket provisioning ([#2626](https://github.com/floci-io/floci/issues/2626)) ([64c38c7](https://github.com/floci-io/floci/commit/64c38c77b9ee0e7439da069abc8b5d6596518fb7))
* **s3:** opt-in global bucket namespace and replication config ([#2640](https://github.com/floci-io/floci/issues/2640)) ([c96dc98](https://github.com/floci-io/floci/commit/c96dc980653e1fd6df8941622d68ff61e34ffb81)), closes [#2519](https://github.com/floci-io/floci/issues/2519)
* **s3:** support bucket metrics configurations ([#2382](https://github.com/floci-io/floci/issues/2382)) ([8d33c65](https://github.com/floci-io/floci/commit/8d33c6512951b7391ea48a456da8c17743d188af))
* **secretsmanager:** persist and return secret resource policies ([#2587](https://github.com/floci-io/floci/issues/2587)) ([8b23ed8](https://github.com/floci-io/floci/commit/8b23ed8f4aa6733538379847e330b0dd7530857a))
* **servicecatalog:** emulate AWS Service Catalog with Control Tower Account Factory ([#2585](https://github.com/floci-io/floci/issues/2585)) ([2e843e9](https://github.com/floci-io/floci/commit/2e843e9f2353092f015d5ee55937085b524bd705))
* **servicequotas,ram:** add Service Quotas and AWS RAM resource sharing ([#2579](https://github.com/floci-io/floci/issues/2579)) ([f912c3b](https://github.com/floci-io/floci/commit/f912c3b717ac19ed7b0d7d2bd36d6ed0384593f2))
* **ses:** extend tag endpoints to contact lists, custom verification email templates, and dedicated IP pools ([#2589](https://github.com/floci-io/floci/issues/2589)) ([c7cd78e](https://github.com/floci-io/floci/commit/c7cd78e3b366a8f00a657a7045bb4957c0264a5a))
* **ses:** support +label subaddressing on mailbox simulator addresses ([#2464](https://github.com/floci-io/floci/issues/2464)) ([c969ffc](https://github.com/floci-io/floci/commit/c969ffc31d1023272d40f137b026548a03909b8e))
* **ses:** support v2 PutAccountDetails and GetAccount Details ([#2498](https://github.com/floci-io/floci/issues/2498)) ([622ba0a](https://github.com/floci-io/floci/commit/622ba0adbd640a1d5270e3cc2c3973ff0605a697))
* **ses:** support v2 tenant CRUD (CreateTenant/GetTenant/ListTenants/DeleteTenant) ([#2644](https://github.com/floci-io/floci/issues/2644)) ([2963601](https://github.com/floci-io/floci/commit/2963601f698a70b98a441886241da21b9c3496dd))
* **ses:** support v2 tenant resource associations ([#2710](https://github.com/floci-io/floci/issues/2710)) ([67f75c7](https://github.com/floci-io/floci/commit/67f75c7e1d9fc1f6f8801aed71198832cd99c6d4))
* **ses:** support v2 tenant suppression attributes and tenant-scoped suppression list ([#2743](https://github.com/floci-io/floci/issues/2743)) ([fc3c283](https://github.com/floci-io/floci/commit/fc3c28323ac907bb88b79b293b2cb2b59722ce79))
* **ses:** support v2 tenant-scoped sending with association gate ([#2815](https://github.com/floci-io/floci/issues/2815)) ([b0fe831](https://github.com/floci-io/floci/commit/b0fe8311a01a609f73cc0508de512c075d4daaaf))
* **sfn:** support mocked service integrations (SFN_MOCK_CONFIG) ([#2452](https://github.com/floci-io/floci/issues/2452)) ([b6418db](https://github.com/floci-io/floci/commit/b6418dbfeea43b7b2906a3256d581bb88becc274)), closes [#2283](https://github.com/floci-io/floci/issues/2283)
* **sfn:** support Retry policies in Task, Parallel, and Map states ([#2455](https://github.com/floci-io/floci/issues/2455)) ([56e74d6](https://github.com/floci-io/floci/commit/56e74d64c6a5452ec9c23451f42bd472bc57b720)), closes [#2283](https://github.com/floci-io/floci/issues/2283)
* **signin:** add secure branded consent flow ([#2429](https://github.com/floci-io/floci/issues/2429)) ([09d7502](https://github.com/floci-io/floci/commit/09d7502b284b5d61a9334b809a5331c52c7814dd))
* **signin:** support AWS login credentials provider ([#2428](https://github.com/floci-io/floci/issues/2428)) ([470ec77](https://github.com/floci-io/floci/commit/470ec777114081f0888460421dd3934b21731096))
* **sns:** deliver topic broadcasts to application-protocol platform endpoints ([#1856](https://github.com/floci-io/floci/issues/1856)) ([f45d64a](https://github.com/floci-io/floci/commit/f45d64a00e70466ccb0e135ac9cc8568cba0d93c))
* **ssm:** document lifecycle, share permissions, and account-scoped service settings ([#2629](https://github.com/floci-io/floci/issues/2629)) ([7f6b875](https://github.com/floci-io/floci/commit/7f6b87513685731b045b0f53e7326eef14513cc5))
* **ssoadmin:** serve Identity Center ListInstances ([#2581](https://github.com/floci-io/floci/issues/2581)) ([a2bd22d](https://github.com/floci-io/floci/commit/a2bd22d5f887b409a35b9d72d63c35bace40fb09)), closes [#2579](https://github.com/floci-io/floci/issues/2579)
* **stepfunctions:** add the JSONata functions of the Step Functions dialect ([#2676](https://github.com/floci-io/floci/issues/2676)) ([eb5134d](https://github.com/floci-io/floci/commit/eb5134da2d7620c75fe276d747fa8ae3d1f40065))
* **stepfunctions:** describe a distributed Map run after it finishes ([#2694](https://github.com/floci-io/floci/issues/2694)) ([ff61c2b](https://github.com/floci-io/floci/commit/ff61c2b2a5b844f5eea153c20f43232adbac776a)), closes [#2671](https://github.com/floci-io/floci/issues/2671)
* **stepfunctions:** dispatch the seven Task service integrations of [#2663](https://github.com/floci-io/floci/issues/2663) ([#2686](https://github.com/floci-io/floci/issues/2686)) ([14112b8](https://github.com/floci-io/floci/commit/14112b8ace5a0272715d17a60d268e67b94ab925))
* **stepfunctions:** emit task history events and chain previousEventId ([#2703](https://github.com/floci-io/floci/issues/2703)) ([5600d21](https://github.com/floci-io/floci/commit/5600d21f32b00ff464243af96252070f52521f91)), closes [#2520](https://github.com/floci-io/floci/issues/2520)
### Performance Improvements
* **cloudformation:** probe Lambda S3 code with headObject, not getObject ([#2728](https://github.com/floci-io/floci/issues/2728)) ([ff36141](https://github.com/floci-io/floci/commit/ff36141c199bfc8bb387db053056526332fbeb4d)), closes [#2648](https://github.com/floci-io/floci/issues/2648) [#2675](https://github.com/floci-io/floci/issues/2675)
### BREAKING CHANGES
* state machines whose JSONata expressions reference a bare
top-level name are now rejected at creation, as on AWS. Anchor the reference
with $states.input.<name> for input or $<name> for an Assign variable.
* fix(stepfunctions): parse a JSONata payload key named after an ASL field
The deny list of fields AWS does not parse as JSONata was applied to every
key at every depth, so a payload key named Next, Comment, Resource, Retry,
Default, ErrorEquals, Credentials, Branches, ItemProcessor or Iterator hid
its expression. AWS parses a payload whole: `Assign: {"Next": "{% phone %}"}`
and `Arguments: {"Payload": {"Comment": "{% phone %}"}}` are both refused
with `Reference to 'phone' at the top level is not supported.` The deny list
now stops applying once the walk enters Output, Assign, Arguments,
ItemSelector or BatchInput.
The same walk refused `ItemReader.ReaderConfig.CSVHeaders`, which holds
literal column names: `validate-state-machine-definition` returns OK for it
and `create-state-machine` stores the machine, so CSVHeaders joins the list.
|
🎉 This PR is included in version 2.0.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Summary
EventBridge
InputTransformerdid not behave like real AWS, and was reachable inconsistently between the two ways a rule target can be created.<var>placeholders by naive string replacement using the value's text (asText()), so a JSON template with an unquoted placeholder produced invalid JSON — e.g.{"eventName":<eventName>}yielded{"eventName":site.created}instead of{"eventName":"site.created"}.PutTargetsAPI parsedInputTransformer, but the CloudFormationAWS::Events::Ruleprovider did not carry it over — so a rule deployed via CFN/CDK silently lost its transform.This makes
InputTransformerAWS-conformant and reachable identically from both entry points (authoritative reference: https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-transform-target-input.html):InputTransformer.fromJson(JsonNode)parser is now used by both the nativePutTargetshandler and the CloudFormation provider — parity by construction."<v>"or"…<v>…") is replaced by the raw escaped value between the author's quotes.InputPathbehavior is unchanged.AWS::Events::Ruleprovider now carries the target'sInputTransformervia that shared parser.Type of change
fix:)feat:)feat!:orfix!:)AWS Compatibility
Incorrect behavior fixed:
AWS::Events::Ruletargets created via CloudFormation lost theirInputTransformerentirely; real CloudFormation preserves it, and the target receives the transformed input.Substitution semantics now follow the AWS doc: string → quoted/escaped, object/array → JSON as-is, number/bool → literal, missing JSONPath → empty string; placeholders written inside quotes interpolate the raw value.
Verification: RestAssured integration tests exercise the real wire protocol — JSON 1.1 (
X-Amz-Target) for EventBridge, Query for CloudFormation/SQS. Both a CloudFormationAWS::Events::Rulewith anInputTransformertarget and a nativePutTargetstarget are driven throughPutEventsand asserted to deliver the identical transformed body to an SQS queue, proving CFN ↔ native parity end to end.Checklist
./mvnw testpasses locallyTests: unit coverage for the substitution rules in
EventBridgeInvokerTest, a parser unit test (InputTransformerTest), and two integration tests proving parity (EventBridgeInputTransformerIntegrationTestfor nativePutTargets, plus a newCloudFormationIntegrationTestcase for the CFN rule). Regression acrossEventBridge*,CloudFormationIntegrationTest, andInputTransformerTest: 288/288 green.Notes for the reviewer
"). Value position → JSON representation; in-string → raw escaped value. Unknown<...>(not inInputPathsMap) is left literal.extractJsonPath/applyInputPath(theInputPathfeature) are deliberately left behaviour-identical; they now delegate to a sharedextractNodebut return exactly the same strings, and their existing tests are unchanged.<aws.events.rule-arn>,<aws.events.event.json>, …) — unknown placeholders are left literal for now; JSONPath array indices ($.detail.items[0].id); and other CFN target fields (RoleArn,DeadLetterConfig) which are still not carried by the provider.mainand does not depend on it.