Skip to content

fix(eventbridge): AWS-conformant InputTransformer from CloudFormation and PutTargets - #1885

Merged
pgermosen merged 6 commits into
floci-io:mainfrom
lruizctaima:feat/eventbridge-inputtransformer
Aug 29, 2026
Merged

pgermosen merged 6 commits into
floci-io:mainfrom
lruizctaima:feat/eventbridge-inputtransformer

Conversation

@lruizctaima

Copy link
Copy Markdown
Contributor

Summary

EventBridge InputTransformer did not behave like real AWS, and was reachable inconsistently between the two ways a rule target can be created.

  • Wrong substitution output. The invoker substituted <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"}.
  • CloudFormation dropped the transformer. The native PutTargets API parsed InputTransformer, but the CloudFormation AWS::Events::Rule provider did not carry it over — so a rule deployed via CFN/CDK silently lost its transform.

This makes InputTransformer AWS-conformant and reachable identically from both entry points (authoritative reference: https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-transform-target-input.html):

  • One shared InputTransformer.fromJson(JsonNode) parser is now used by both the native PutTargets handler and the CloudFormation provider — parity by construction.
  • The substitution engine is rewritten to be quote-context-aware: a placeholder in a JSON value position is replaced by the value's JSON representation (strings auto-quoted/escaped, objects/arrays/numbers/bools as-is, missing path → empty); a placeholder inside a quoted string ("<v>" or "…<v>…") is replaced by the raw escaped value between the author's quotes. InputPath behavior is unchanged.
  • The CloudFormation AWS::Events::Rule provider now carries the target's InputTransformer via that shared parser.

Type of change

  • Bug fix (fix:)
  • New feature (feat:)
  • Breaking change (feat!: or fix!:)
  • Docs / chore

AWS Compatibility

Incorrect behavior fixed:

  • Value-position placeholders were substituted with the unquoted text of string values, producing invalid JSON payloads. Real AWS inserts the JSON representation, so string values are quoted and escaped.
  • AWS::Events::Rule targets created via CloudFormation lost their InputTransformer entirely; 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 CloudFormation AWS::Events::Rule with an InputTransformer target and a native PutTargets target are driven through PutEvents and asserted to deliver the identical transformed body to an SQS queue, proving CFN ↔ native parity end to end.

Checklist

  • ./mvnw test passes locally
  • New or updated integration test added
  • Commit messages follow Conventional Commits

Tests: unit coverage for the substitution rules in EventBridgeInvokerTest, a parser unit test (InputTransformerTest), and two integration tests proving parity (EventBridgeInputTransformerIntegrationTest for native PutTargets, plus a new CloudFormationIntegrationTest case for the CFN rule). Regression across EventBridge*, CloudFormationIntegrationTest, and InputTransformerTest: 288/288 green.

Notes for the reviewer

  • The engine is a single-pass scanner tracking whether the cursor is inside a double-quoted string (toggling on unescaped "). Value position → JSON representation; in-string → raw escaped value. Unknown <...> (not in InputPathsMap) is left literal.
  • extractJsonPath / applyInputPath (the InputPath feature) are deliberately left behaviour-identical; they now delegate to a shared extractNode but return exactly the same strings, and their existing tests are unchanged.
  • Out of scope (deferred follow-ups): reserved AWS variables (<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.
  • Independent of PR feat(cloudformation): support AWS::Events::EventBus and EventBusPolicy #1794 (custom event bus CloudFormation support); this branch is based on main and does not depend on it.

@greptile-apps

greptile-apps Bot commented Jul 16, 2026

Copy link
Copy Markdown

Greptile Summary

This PR fixes two related bugs in EventBridge InputTransformer handling to match real AWS behaviour. The substitution engine is rewritten to be quote-context-aware (value-position placeholders receive the JSON representation; in-string placeholders receive the raw escaped value), and the CloudFormation AWS::Events::Rule provisioner now carries InputTransformer through to the target via a new shared InputTransformer.fromJson() factory.

  • Shared parser: InputTransformer.fromJson(JsonNode) is now the single parsing path for both the native PutTargets handler and the CloudFormation provisioner, eliminating the divergence by construction.
  • Correct substitution: the single-pass scanner in applyInputTransformer tracks inString state via unescaped " characters in the template, routing each placeholder to either jsonValue() (string auto-quoted) or rawValue() (JSON-escaped bare value) as AWS specifies.
  • End-to-end parity tests: two integration tests — one for native PutTargets and one for a CFN stack — assert identical transformed delivery to an SQS queue, and six unit tests cover the engine's substitution branches exhaustively.

Confidence Score: 5/5

  • Safe to merge. The changes are narrowly scoped to the InputTransformer evaluation path and the one-line CFN provisioner fix, both of which are fully covered by new unit and integration tests.
  • The substitution engine is correct for all documented AWS cases (value-position quoting, in-string raw interpolation, missing-path empty, unknown-var literal passthrough). The shared parser eliminates the former CFN/native divergence, and both paths are exercised end-to-end. No existing behaviour outside the InputTransformer path is touched.
  • No files require special attention.

Important Files Changed

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/…
Loading

Reviews (3): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

@hectorvent hectorvent added bug Something isn't working eventbridge Amazon EventBridge cloudformation AWS CloudFormation labels Jul 17, 2026
@lruizctaima

lruizctaima commented Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

#1794 (comment)

int close = template.indexOf('>', i + 1);
if (close >= 0) {
String name = template.substring(i + 1, close);
if (resolved.containsKey(name)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 them

The 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.

@hectorvent

Copy link
Copy Markdown
Collaborator

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 InputTransformer.fromJson for both entry points is the right call, and the member names match the model (https://github.com/boto/botocore/blob/develop/botocore/data/events/2015-10-07/service-2.json).

(blocking) The plain string template case: applyInputTransformer_insideString_interpolatesRaw pins the author's outer quotes into the delivered payload, while my reading of the reference is that AWS strips them, so the SQS body would be alice did site.created. Pre-existing behaviour, but the new test locks it in. Could you confirm the quotes against real AWS, or loosen that assertion?

(follow-up, separate PR) AWS rejects an InputTemplate with a placeholder neither in InputPathsMap nor a reserved aws.events.* variable; this leaves it literal.

Also please untick "New feature" and add Closes #N if there is an issue. One blocker, the rest is ready.

@hectorvent hectorvent added the waiting-contributor Deprecated: use waiting-author label Aug 6, 2026

@pgermosen pgermosen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.applyInputTransformer on main is still result.replace("<" + key + ">", value) with no quote awareness — the naive substitution your PR replaces.
  • CloudFormationResourceProvisioner still builds new 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.** and services.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
pgermosen requested a review from hectorvent as a code owner August 29, 2026 03:20

@pgermosen pgermosen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Downmerged main to resolve the conflict (was DIRTY/CONFLICTING) — CI green on the merged tree.

@pgermosen pgermosen removed the waiting-contributor Deprecated: use waiting-author label Aug 29, 2026
@pgermosen
pgermosen merged commit 9b3aee6 into floci-io:main Aug 29, 2026
19 checks passed
myleo198 pushed a commit to myleo198/floci that referenced this pull request Sep 1, 2026
# [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.
@hectorvent

Copy link
Copy Markdown
Collaborator

🎉 This PR is included in version 2.0.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working cloudformation AWS CloudFormation eventbridge Amazon EventBridge released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants