by Winch Labs

Other IaC tools

AWS CDK

Deltz does not parse CDK programs. It gates what your CDK app synthesises — which is CloudFormation, and CloudFormation is a first-class input.

There is no special flag. cdk synth writes templates, and the gate reads templates.

What works

cdk synth                 # writes cdk.out/*.template.json
garboard gate cdk.out

That is the whole integration. cdk synth needs no cloud credentials — it evaluates your app locally — so unlike the Pulumi path there is no credential boundary to think about at all.

On a small demo app (an S3 bucket, a VPC, an RDS instance) the gate reports:

✗ [critical]  S3 bucket has no encryption configuration    DeltzCdkDemo.template.json:3
✗ [critical]  RDS instance is publicly accessible          DeltzCdkDemo.template.json:330
✗ [critical]  RDS instance is not encrypted at rest        DeltzCdkDemo.template.json:330
· [warn]      Database has no backup retention configured  DeltzCdkDemo.template.json:330

4 finding(s) · 3 blocking · 1 advisory

Roughly twelve of the seventeen built-in rules reach CloudFormation, along with the compliance tags and the custom-rule ABI. The intrinsics — Ref, Fn::Sub, Fn::GetAtt, Fn::If — are treated as unknown, so a rule never fires on a value the template does not actually pin down.

The evidence is in the synthesised template, not your code

Findings cite cdk.out/DeltzCdkDemo.template.json:330, not lib/database-stack.ts:42.

This is the main thing to weigh before adopting it. A reviewer reading the finding sees the resource CDK produced, and has to map that back to the construct that produced it themselves. CDK writes a aws:cdk:path into each resource’s metadata, which usually makes that mapping obvious, but Deltz does not currently follow it and the link is not made for you.

Do not trust the conventions

The gate works. Convention derivation on synthesised output does not, and this is not a gap we intend to close by trying harder.

Run garboard scan over cdk.out and it will happily derive something. On the demo app above it derived “tags carry keys: Name” with high confidence — from tags CDK generated automatically, that nobody on the team decided. That is derivation measuring the framework’s behaviour and reporting it as your team’s rule.

The same inversion applies as for Pulumi: derivation reads what a repository does to infer the rule it keeps, and evaluated output shows the convention’s effect rather than the convention.

So: gate your synthesised templates, and ignore the RCD. If learning your conventions is why you are evaluating Deltz, CDK is not served today.

If you also commit your templates

Nothing changes — the gate reads them wherever they are. Teams that commit cdk.out get the review on the diff without a synth step in CI; teams that do not should synth first, as above.

In GitHub Actions

- run: npx cdk synth
  # no cloud credentials needed — synth evaluates locally

- uses: garboardai/garboard-action@v1
  with:
    path: cdk.out

Why there is no CDK frontend

For the same reason there is no Pulumi one, and one more.

Supporting CDK properly means TypeScript, Python, Java, Go and C# — and CDK’s construct model means the interesting rules live in constructs, not in the resources they emit. A parser that read the program would still have to evaluate it to know what a construct produces, at which point it is synth with extra steps.

CloudFormation was the last frontend that fit Deltz’s existing facts model without bringing its own. CDK does not, and synth already gives us its output.