Skip to content

feat(bootstrap): live-account preflight validator #126

@scottschreckengaust

Description

@scottschreckengaust

Parent

Sub-issue 6 of #120 (RFC: Least-privilege CDK bootstrap policies as code)

Branch strategy

feat/bootstrap-preflight → targets feat/bootstrap-aspect

Estimated review time: ~30 min

Summary

Implement a validator that checks the deployed CDKToolkit stack's CloudFormation outputs against the required bootstrap version/hash before deploying. This prevents the "pull latest, deploy, fail 15 minutes later" failure mode.

Deliverables

  • Create cdk/src/bootstrap/preflight/validator.ts:
    • Reads CDKToolkit stack CF outputs (BootstrapPolicyVersion, BootstrapPolicyHash) via CloudFormation.describeStacks
    • Compares against required version/hash from the app's policy code
    • Returns structured result:
      • PASS: version matches, hash matches → safe to deploy
      • WARN: version compatible but hash mismatch → possible console drift, recommend re-bootstrap
      • FAIL: version too old → lists missing permissions, provides exact remediation command
      • FAIL: no outputs found → default bootstrap detected (AdministratorAccess), provide bootstrap command
    • Outputs both structured JSON (for CI parsing) and human-readable summary (for terminal)
  • Create cdk/test/bootstrap/validator.test.ts:
    • Mock CloudFormation.describeStacks responses for each scenario
    • Version match → PASS
    • Hash mismatch with compatible version → WARN with advisory message
    • Version too old → FAIL with specific missing actions listed
    • No CDKToolkit stack → FAIL with "not bootstrapped" message
    • No version/hash outputs → FAIL with "default bootstrap detected" message
    • AWS SDK error (permissions, network) → clear error message
  • Add mise //cdk:preflight task in cdk/mise.toml:
    • Runs the validator
    • Exits 0 on PASS or WARN
    • Exits 1 on FAIL
    • Prints remediation: exact mise //cdk:bootstrap command to fix

Key design decisions

  • Requires only cloudformation:DescribeStacks permission (read-only, safe for CI with minimal credentials)
  • WARN does not block deploy — hash drift from console edits is advisory, not fatal
  • FAIL prints the exact mise //cdk:bootstrap command needed (copy-paste friendly)
  • Validator is importable as a library (for integration tests) and runnable as a CLI entry point (for mise task)
  • Uses @aws-sdk/client-cloudformation (already a transitive dep via CDK)

Acceptance criteria

  • All test scenarios pass with mocked AWS responses
  • mise //cdk:preflight exits cleanly when CDKToolkit outputs match
  • mise //cdk:preflight exits 1 with actionable message when versions mismatch
  • Error messages include the exact command to run (no guessing for operators)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestinfra-cdkCDK stacks/constructs, bootstrap, deploy topology, tags, IAM wiring, teardown

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions