Skip to main content

@aws-prototyping-sdk/cdk-graph-plugin-diagram

Project description

Diagram Plugin - Cdk Graph

@aws-prototyping-sdk/cdk-graph-plugin-diagram

experimental alpha
API Documentation Source Code

This plugin generates diagrams utilizing the cdk-graph framework.

More comprehensive documentation to come as this package stabilizes.

Disclaimer: This is the first cdk graph plugin, it is highly experimental, and subject to major refactors as we gain feedback from the community.

BREAKING CHANGES (pre-release)

  • <= v0.14.8: Only the last stage of a multi stage app will be rendered by default, which is commonly the production stage. Use the theme.rendering.stage config option to override this for each graph or in defaults.

Quick Start

// bin/app.ts

// Must wrap cdk app with async IIFE function to enable async cdk-graph report
(async () => {
  const app = new App();
  // ... add stacks, etc
  const graph = new CdkGraph(app, {
    plugins: [new CdkGraphDiagramPlugin()],
  });

  app.synth();

  // async cdk-graph reporting hook
  await graph.report();
})();

// => cdk.out/diagram.dot
// => cdk.out/diagram.svg
// => cdk.out/diagram.png

This plugin currently only supports async report() generation following the above example. Make sure to wrap the cdk app with async IIFE.

Supported Formats

Format Status Extends Provider
DOT beta - Graphviz
SVG beta DOT Graphviz
PNG beta SVG Graphviz

Diagram Providers

Provider Status Formats
Graphviz alpha DOT, SVG, PNG
Drawio design TBD: very early stage design and development

Configuration

See IPluginConfig interface for details, and look in unit tests for additional examples.

By default the diagram plugin will generate a single "compact" preset diagram. It is capable of creating multiple diagrams each with different configurations, as well as defining the defaults to use.

Defaults Option

Changing the defaults option will modify default options for all diagrams, including the default diagram.

See IDiagramConfigBase interface for plugin.defaults options.

new CdkGraphDiagramPlugin({
  defaults: {
    theme: "dark",
    filterPlan: {
      preset: FilterPreset.NONE,
    },
  },
});

// => results in a single diagram that is "verbose" and "dark", since no resources are filtered

Diagrams Option

By modifying the diagrams option of the plugin you have full control over the rendering of diagrams, and can render multiple diagrams.

See IDiagramConfig interface for diagram config options.

new CdkGraphDiagramPlugin({
  diagrams: [
    {
      name: "diagram-1",
      title: "Diagram 1 (dark + compact)",
      theme: "dark",
      // the default `filterPlan: { preset: FilterPreset.COMPACT }` will still apply
    },
    {
      name: "diagram-2",
      title: "Diagram 2 (dark + verbose)",
      theme: "dark",
      filterPlan: {
        preset: FilterPreset.NONE,
      },
    },
    {
      name: "diagram-3",
      title: "Diagram 3 (no defaults)",
      ignoreDefaults: true, // default options will not be applied (theme, filterPlan, etc)
    },
  ],
});

Example Diagram Configs (expand below)

The below examples define individual diagram configs in the diagrams options of the plugin as described above.

new CdkGraphDiagramPlugin({
  diagrams: [
    // ... insert diagram  config(s) here - see below for examples
  ],
});
Presets
Preset: compact

{
  name: "compact",
  title: "Compact Diagram",
  filterPlan: {
    preset: FilterPreset.COMPACT,
  },
},
Preset: verbose

{
  name: "verbose",
  title: "Verbose Diagram",
  format: DiagramFormat.PNG,
  ignoreDefaults: true,
},
Focus
Focus: hoist

{
  name: "focus",
  title: "Focus Lambda Diagram (non-extraneous)",
  filterPlan: {
    focus: (store) =>
      store.getNode(getConstructUUID(app.stack.lambda)),
    preset: FilterPreset.NON_EXTRANEOUS,
  },
  ignoreDefaults: true,
},
Focus: no hoist

{
  name: "focus-nohoist",
  title: "Focus WebServer Diagram (noHoist, verbose)",
  filterPlan: {
    focus: {
      node: (store) =>
        store.getNode(getConstructUUID(app.stack.webServer)),
      noHoist: true,
    },
  },
  ignoreDefaults: true,
},
Filters
Filter: Include specific cfn resource types

{
  name: "includeCfnType",
  title: "Include CfnType Diagram (filter)",
  filterPlan: {
    filters: [
      Filters.includeCfnType([
        aws_arch.CfnSpec.ServiceResourceDictionary.EC2.Instance,
        /AWS::Lambda::Function.*/,
        "AWS::IAM::Role",
      ]),
      Filters.compact(),
    ],
  },
},
Filter: Exclude specific cfn resource types

{
  name: "excludeCfnType",
  title: "Exclude CfnType Diagram (filter)",
  filterPlan: {
    filters: [
      Filters.excludeCfnType([
        /AWS::EC2::VPC.*/,
        aws_arch.CfnSpec.ServiceResourceDictionary.IAM.Role,
      ]),
      Filters.compact(),
    ],
  },
},
Filter: Include specific graph node types

{
  name: "includeNodeType",
  title: "Include NodeType Diagram (filter)",
  filterPlan: {
    filters: [
      Filters.includeNodeType([
        NodeTypeEnum.STACK,
        NodeTypeEnum.RESOURCE,
      ]),
      Filters.compact(),
    ],
  },
},
Filter: Include specific graph node types

{
  name: "includeNodeType",
  title: "Include NodeType Diagram (filter)",
  filterPlan: {
    filters: [
      Filters.includeNodeType([
        NodeTypeEnum.STACK,
        NodeTypeEnum.RESOURCE,
      ]),
      Filters.compact(),
    ],
  },
},
Filter: Exclude specific graph node types

{
  name: "excludeNodeType",
  title: "Exclude NodeType Diagram (filter)",
  filterPlan: {
    filters: [
      Filters.excludeNodeType([
        NodeTypeEnum.NESTED_STACK,
        NodeTypeEnum.CFN_RESOURCE,
        NodeTypeEnum.OUTPUT,
        NodeTypeEnum.PARAMETER,
      ]),
      Filters.compact(),
    ],
  },
},
Themes
Theme: Dark

{
  name: "Dark",
  title: "Dark Theme Diagram",
  theme: theme,
},
Theme: Dark - render service icons

{
  name: "dark-services",
  title: "Dark Theme Custom Diagram",
  theme: {
    theme: theme,
    rendering: {
      resourceIconMin: GraphThemeRenderingIconTarget.SERVICE,
      resourceIconMax: GraphThemeRenderingIconTarget.CATEGORY,
      cfnResourceIconMin: GraphThemeRenderingIconTarget.DATA,
      cfnResourceIconMax: GraphThemeRenderingIconTarget.RESOURCE,
    },
  },
},
Theme: Dark - verbose

{
  name: "dark-verbose",
  title: "Dark Theme Verbose Diagram",
  ignoreDefaults: true,
  theme: theme,
},
---

Next Steps

  • Battle test in the wild and get community feedback
  • Improve image coverage and non-image node rendering
  • Add drawio support
  • Add common filter patterns and helpers
  • Enable generating diagrams outside of synthesis process (maybe CLI)
  • Implement interactive diagram, with potential for dynamic filtering and config generation
  • Support using interactive diagram as config generator for other plugins (or as separate plugin that depends on this)

Inspired by cdk-dia and cfn-dia with ❤️

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file aws_prototyping_sdk.cdk_graph_plugin_diagram-0.19.64.tar.gz.

File metadata

File hashes

Hashes for aws_prototyping_sdk.cdk_graph_plugin_diagram-0.19.64.tar.gz
Algorithm Hash digest
SHA256 69a580e22c4fb2d2ed2b26c3779aedac25d7066f6c4a82b3c3e41402f36ba629
MD5 daad82f2640e57f6dadbd65396a513a6
BLAKE2b-256 be2a652ea771e8e9c7f6d076e9bbe06e552d4309e1f3b19903d16ebd737e4e5e

See more details on using hashes here.

File details

Details for the file aws_prototyping_sdk.cdk_graph_plugin_diagram-0.19.64-py3-none-any.whl.

File metadata

File hashes

Hashes for aws_prototyping_sdk.cdk_graph_plugin_diagram-0.19.64-py3-none-any.whl
Algorithm Hash digest
SHA256 838f5aa8cf4ccc57fc8ccd1a8fc383ba2c4dc18ebd8929fc4bcfea4d53912ecc
MD5 20a5ae657afc0b57cd1781c1678eee05
BLAKE2b-256 333482aa916bab04142b7b4bb8c475d56f7ceebb006bd1fd526ccc7460c14585

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page