<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Raghvendra Pandey</title>
    <description>The latest articles on DEV Community by Raghvendra Pandey (@pandey-raghvendra).</description>
    <link>https://dev.to/pandey-raghvendra</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3031233%2F3db6d024-1e58-41bb-983a-cb43818587d0.png</url>
      <title>DEV Community: Raghvendra Pandey</title>
      <link>https://dev.to/pandey-raghvendra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pandey-raghvendra"/>
    <language>en</language>
    <item>
      <title>What's New in InfraSketch — May 2026: Pulumi &amp; Kubernetes Support</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Thu, 30 Apr 2026 21:12:57 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/whats-new-in-infrasketch-may-2026-pulumi-kubernetes-support-ce2</link>
      <guid>https://dev.to/pandey-raghvendra/whats-new-in-infrasketch-may-2026-pulumi-kubernetes-support-ce2</guid>
      <description>&lt;p&gt;Two major new input formats land in InfraSketch this month: &lt;strong&gt;Pulumi&lt;/strong&gt; TypeScript and Python, and &lt;strong&gt;Kubernetes YAML&lt;/strong&gt;. Together they bring InfraSketch support to every major infrastructure-as-code tool in active use today.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try the new formats now Click the Pulumi or Kubernetes tab and paste your code. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Pulumi support — TypeScript &amp;amp; Python
&lt;/h2&gt;

&lt;h3&gt;
  
  
  New Pulumi tab
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Parse Pulumi TypeScript (&lt;code&gt;index.ts&lt;/code&gt;) and Python (&lt;code&gt;__main__.py&lt;/code&gt;) directly — no compile step&lt;/li&gt;
&lt;li&gt;95+ resource types across AWS, GCP, and Azure&lt;/li&gt;
&lt;li&gt;VPC containment from &lt;code&gt;vpcId: vpc.id&lt;/code&gt; / &lt;code&gt;vpc_id=vpc.id&lt;/code&gt; references&lt;/li&gt;
&lt;li&gt;Subnet placement from &lt;code&gt;subnetId&lt;/code&gt;, &lt;code&gt;subnets&lt;/code&gt;, &lt;code&gt;subnetIds&lt;/code&gt; arguments&lt;/li&gt;
&lt;li&gt;Connection arrows from variable references between resources&lt;/li&gt;
&lt;li&gt;Auto-detects TypeScript vs Python from syntax&lt;/li&gt;
&lt;li&gt;3 built-in examples: AWS production stack (TS), AWS serverless (Python), GCP Cloud Run (TS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AWS resources covered:&lt;/strong&gt; VPC, subnets, EC2, EKS, ECS, Lambda, RDS, DynamoDB, ElastiCache, S3, ALB, Route53, CloudFront, SQS, SNS, IAM, KMS, WAF, ECR, Auto Scaling, CloudWatch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GCP resources covered:&lt;/strong&gt; Compute Engine, GKE, Cloud Run, Cloud Functions, Cloud SQL, BigQuery, Spanner, Bigtable, Firestore, Redis, Pub/Sub, Cloud Storage, Secret Manager, KMS, IAM, DNS, Monitoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure resources covered:&lt;/strong&gt; Virtual Networks, AKS, App Service, Functions, SQL, Cosmos DB, Key Vault, Container Groups, CDN Frontdoor, Redis, Service Bus, Event Hub.&lt;/p&gt;

&lt;p&gt;Read the full guide: &lt;a href="///blog/pulumi-diagram-generator.html"&gt;Pulumi Diagram Generator — Visualize Pulumi Infrastructure Instantly&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes YAML support
&lt;/h2&gt;

&lt;h3&gt;
  
  
  New Kubernetes tab
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Parse multi-document YAML (documents separated by &lt;code&gt;---&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;16 resource kinds: Deployment, StatefulSet, DaemonSet, Job, CronJob, Pod, ReplicaSet, Service, Ingress, NetworkPolicy, ConfigMap, Secret, PersistentVolumeClaim, PersistentVolume, ServiceAccount, HorizontalPodAutoscaler&lt;/li&gt;
&lt;li&gt;Namespace grouping — resources grouped into labelled namespace boundaries from &lt;code&gt;metadata.namespace&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Selector-based connections — Service &lt;code&gt;spec.selector&lt;/code&gt; matched to workload &lt;code&gt;spec.selector.matchLabels&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ingress routing — &lt;code&gt;spec.rules[].http.paths[].backend.service.name&lt;/code&gt; becomes Ingress→Service arrows&lt;/li&gt;
&lt;li&gt;Volume/envFrom references — Deployment→ConfigMap and Deployment→Secret arrows from volume mounts and &lt;code&gt;envFrom&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;HPA target links — &lt;code&gt;spec.scaleTargetRef&lt;/code&gt; connects HPA to its scale target&lt;/li&gt;
&lt;li&gt;1 built-in example: full-stack web app with Ingress, Service, Deployment, ConfigMap, Secret, HPA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Works with raw manifests, &lt;code&gt;kubectl get all -o yaml&lt;/code&gt; output, Helm template output (&lt;code&gt;helm template&lt;/code&gt;), and Kustomize builds (&lt;code&gt;kustomize build&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Read the full guide: &lt;a href="///blog/kubernetes-diagram-generator.html"&gt;Kubernetes Diagram Generator — Visualize K8s YAML Instantly&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fix Diagram display
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diagram panel no longer shows half the diagram when output is taller than the panel height&lt;/li&gt;
&lt;li&gt;SVG height set to &lt;code&gt;auto&lt;/code&gt; — aspect ratio preserved via &lt;code&gt;viewBox&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Diagram canvas scrolls from top rather than clipping vertically centered content&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-detect format&lt;/strong&gt; — paste any IaC code and InfraSketch detects the format automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcuts&lt;/strong&gt; — generate, zoom, export without reaching for the mouse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More Kubernetes samples&lt;/strong&gt; — microservices, ingress controller, monitoring stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bicep / ARM&lt;/strong&gt; — Azure-native template formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feature requests and bug reports welcome on &lt;a href="https://github.com/pandey-raghvendra/infrasketch" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try Pulumi and Kubernetes diagrams now Free, no login, nothing leaves your browser. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

</description>
      <category>infrasketchupdate</category>
      <category>pulumidiagram</category>
      <category>kubernetesdiagram</category>
      <category>k8svisualizer</category>
    </item>
    <item>
      <title>Pulumi Diagram Generator — Visualize Pulumi Infrastructure Instantly</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Thu, 30 Apr 2026 21:12:25 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/pulumi-diagram-generator-visualize-pulumi-infrastructure-instantly-1gk4</link>
      <guid>https://dev.to/pandey-raghvendra/pulumi-diagram-generator-visualize-pulumi-infrastructure-instantly-1gk4</guid>
      <description>&lt;p&gt;InfraSketch now supports Pulumi. Paste your Pulumi TypeScript or Python code into the Pulumi tab and get a full architecture diagram in seconds — VPC containment, subnet grouping, resource connections, official AWS, GCP, and Azure icons. No login, no credentials, everything runs in your browser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try it now Paste your Pulumi TypeScript or Python code and see the diagram instantly. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Pulumi needs a diagram tool
&lt;/h2&gt;

&lt;p&gt;Pulumi lets you write infrastructure in real programming languages — TypeScript, Python, Go, C#. That's great for developer productivity, but it creates the same visibility problem every IaC tool has: your infrastructure lives in code, not in a picture. When a new engineer joins the team, or when you're reviewing a PR that adds a VPC and six new resources, reading TypeScript is not the fastest way to understand what gets built.&lt;/p&gt;

&lt;p&gt;Unlike Terraform's HCL, Pulumi code doesn't have a declarative format that's easy to inspect at a glance. A function might conditionally create resources. Loops might generate dozens of similar components. The Pulumi console shows state, not topology. There's no built-in way to go from code to architecture diagram.&lt;/p&gt;

&lt;p&gt;InfraSketch parses Pulumi TypeScript and Python directly — no compile step, no export, just paste and generate.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;infrasketch.cloud&lt;/a&gt;, click the &lt;strong&gt;Pulumi&lt;/strong&gt; tab, paste your &lt;code&gt;index.ts&lt;/code&gt; or &lt;code&gt;__main__.py&lt;/code&gt; file, and click &lt;strong&gt;Generate Diagram&lt;/strong&gt;. You can paste a partial file — InfraSketch handles incomplete code gracefully.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example: paste this into the Pulumi tab&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@pulumi/aws&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ec2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Vpc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;cidrBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10.0.0.0/16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ec2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Subnet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="na"&gt;vpcId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;cidrBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10.0.1.0/24&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;igw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ec2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;InternetGateway&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;igw&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;vpcId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LoadBalancer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;subnets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Pulumi Python uses the same resource types with underscores — &lt;code&gt;aws.ec2.Vpc&lt;/code&gt; in TypeScript is &lt;code&gt;aws.ec2.Vpc&lt;/code&gt; in Python too. Both work with InfraSketch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets visualized
&lt;/h2&gt;

&lt;h4&gt;
  
  
  VPC containment
&lt;/h4&gt;

&lt;p&gt;Resources referencing a VPC via &lt;code&gt;vpcId: vpc.id&lt;/code&gt; are drawn inside the VPC boundary automatically.&lt;/p&gt;

&lt;h4&gt;
  
  
  Subnet placement
&lt;/h4&gt;

&lt;p&gt;Resources with &lt;code&gt;subnetId&lt;/code&gt; or &lt;code&gt;subnets&lt;/code&gt; arguments are placed in public or private subnet lanes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Connection arrows
&lt;/h4&gt;

&lt;p&gt;Variable references between resources — &lt;code&gt;vpc.id&lt;/code&gt;, &lt;code&gt;cluster.endpoint&lt;/code&gt; — become directed arrows on the diagram.&lt;/p&gt;

&lt;h4&gt;
  
  
  Multi-cloud
&lt;/h4&gt;

&lt;p&gt;AWS, GCP, and Azure resources in the same stack all render on one diagram with their respective provider icons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Pulumi resource types
&lt;/h2&gt;

&lt;p&gt;InfraSketch supports 95+ Pulumi resource types across AWS, GCP, and Azure. Key AWS resources include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Networking:&lt;/strong&gt; &lt;code&gt;aws.ec2.Vpc&lt;/code&gt;, &lt;code&gt;aws.ec2.Subnet&lt;/code&gt;, &lt;code&gt;aws.ec2.InternetGateway&lt;/code&gt;, &lt;code&gt;aws.ec2.NatGateway&lt;/code&gt;, &lt;code&gt;aws.ec2.SecurityGroup&lt;/code&gt;, &lt;code&gt;aws.ec2.TransitGateway&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compute:&lt;/strong&gt; &lt;code&gt;aws.ec2.Instance&lt;/code&gt;, &lt;code&gt;aws.ec2.LaunchTemplate&lt;/code&gt;, &lt;code&gt;aws.autoscaling.Group&lt;/code&gt;, &lt;code&gt;aws.ecs.Cluster&lt;/code&gt;, &lt;code&gt;aws.ecs.Service&lt;/code&gt;, &lt;code&gt;aws.lambda_.Function&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containers:&lt;/strong&gt; &lt;code&gt;aws.eks.Cluster&lt;/code&gt;, &lt;code&gt;aws.eks.NodeGroup&lt;/code&gt;, &lt;code&gt;aws.ecr.Repository&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load balancing:&lt;/strong&gt; &lt;code&gt;aws.lb.LoadBalancer&lt;/code&gt;, &lt;code&gt;aws.lb.TargetGroup&lt;/code&gt;, &lt;code&gt;aws.alb.LoadBalancer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; &lt;code&gt;aws.rds.Instance&lt;/code&gt;, &lt;code&gt;aws.rds.Cluster&lt;/code&gt;, &lt;code&gt;aws.dynamodb.Table&lt;/code&gt;, &lt;code&gt;aws.elasticache.Cluster&lt;/code&gt;, &lt;code&gt;aws.s3.Bucket&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messaging:&lt;/strong&gt; &lt;code&gt;aws.sqs.Queue&lt;/code&gt;, &lt;code&gt;aws.sns.Topic&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS &amp;amp; CDN:&lt;/strong&gt; &lt;code&gt;aws.route53.Zone&lt;/code&gt;, &lt;code&gt;aws.cloudfront.Distribution&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; &lt;code&gt;aws.iam.Role&lt;/code&gt;, &lt;code&gt;aws.kms.Key&lt;/code&gt;, &lt;code&gt;aws.wafv2.WebAcl&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GCP resources cover Compute Engine, GKE, Cloud Run, Cloud Functions, Cloud SQL, BigQuery, Spanner, Bigtable, Pub/Sub, Cloud Storage, Secret Manager, and more. Azure covers Virtual Networks, AKS, App Service, Functions, SQL, Cosmos DB, and Key Vault.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript vs Python
&lt;/h2&gt;

&lt;p&gt;InfraSketch detects the language automatically. TypeScript uses camelCase arguments (&lt;code&gt;cidrBlock&lt;/code&gt;, &lt;code&gt;vpcId&lt;/code&gt;). Python uses snake_case (&lt;code&gt;cidr_block&lt;/code&gt;, &lt;code&gt;vpc_id&lt;/code&gt;). Both parse correctly — no pre-processing needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python example — works the same way
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pulumi_aws&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;

&lt;span class="n"&gt;vpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ec2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Vpc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cidr_block&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.0.0/16&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ec2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Subnet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;public&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;vpc_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;cidr_block&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10.0.1.0/24&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cluster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Cluster&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vpc_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ClusterVpcConfigArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;subnet_ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code reviews&lt;/strong&gt; — paste a PR's Pulumi code and see the topology change visually before approving&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding&lt;/strong&gt; — share a diagram link instead of asking new engineers to read TypeScript they've never seen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; — export as PNG or SVG and embed in Confluence, Notion, or your wiki&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture reviews&lt;/strong&gt; — export as draw.io XML for a fully editable diagram in your design doc&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-stack visibility&lt;/strong&gt; — paste each stack separately and compare their architectures side by side&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pulumi vs Terraform diagrams
&lt;/h2&gt;

&lt;p&gt;If you're migrating from Terraform to Pulumi (or evaluating it), InfraSketch lets you diagram both. Paste your Terraform HCL in the Terraform tab and your equivalent Pulumi code in the Pulumi tab — the diagrams should look identical if the migration is complete. Differences become immediately visible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Generate your Pulumi diagram now Paste your &lt;code&gt;index.ts&lt;/code&gt; or &lt;code&gt;__main__.py&lt;/code&gt; into the Pulumi tab. Free, no login, nothing leaves your browser. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

</description>
      <category>pulumidiagram</category>
      <category>pulumivisualizer</category>
      <category>pulumiarchitecturediagram</category>
      <category>pulumiawsdiagram</category>
    </item>
    <item>
      <title>Kubernetes Diagram Generator — Visualize K8s YAML Instantly</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Thu, 30 Apr 2026 21:12:22 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/kubernetes-diagram-generator-visualize-k8s-yaml-instantly-27f3</link>
      <guid>https://dev.to/pandey-raghvendra/kubernetes-diagram-generator-visualize-k8s-yaml-instantly-27f3</guid>
      <description>&lt;p&gt;InfraSketch now supports Kubernetes YAML. Paste one or more manifest files into the Kubernetes tab and get a full architecture diagram in seconds — namespace grouping, Ingress-to-Service connections, selector-based Service-to-Deployment wiring, ConfigMap and Secret references, and HPA targets. No login, no cluster access, everything runs in your browser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try it now Paste your Kubernetes YAML manifests and see the diagram instantly. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Kubernetes needs a diagram tool
&lt;/h2&gt;

&lt;p&gt;A production Kubernetes application typically spans dozens of YAML files — Deployments, Services, Ingresses, ConfigMaps, Secrets, PVCs, HPAs, NetworkPolicies. When something breaks, or when you're onboarding a new engineer, the mental model of "how does this all connect" is not obvious from reading YAML alone.&lt;/p&gt;

&lt;p&gt;Tools like &lt;code&gt;kubectl&lt;/code&gt; show you state, not topology. &lt;code&gt;k9s&lt;/code&gt; gives you resource lists. Lens visualizes the cluster but requires actual cluster access. There's no fast, offline way to go from a set of YAML manifests to a clear connection diagram — until now.&lt;/p&gt;

&lt;p&gt;InfraSketch reads your YAML, infers the topology from label selectors and resource references, and renders it as a navigable diagram. No cluster access needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;infrasketch.cloud&lt;/a&gt;, click the &lt;strong&gt;Kubernetes&lt;/strong&gt; tab, paste your manifests (multiple documents separated by &lt;code&gt;---&lt;/code&gt;), and click &lt;strong&gt;Generate Diagram&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get all &lt;span class="nt"&gt;-n&lt;/span&gt; my-namespace &lt;span class="nt"&gt;-o&lt;/span&gt; yaml | pbcopy   &lt;span class="c"&gt;# macOS&lt;/span&gt;
kubectl get all &lt;span class="nt"&gt;-n&lt;/span&gt; my-namespace &lt;span class="nt"&gt;-o&lt;/span&gt; yaml | xclip      &lt;span class="c"&gt;# Linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Paste manifests from multiple namespaces at once — InfraSketch groups resources by namespace automatically using &lt;code&gt;metadata.namespace&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How connections are inferred
&lt;/h2&gt;

&lt;p&gt;InfraSketch doesn't need a running cluster to understand topology. It infers connections from the YAML itself:&lt;/p&gt;

&lt;h4&gt;
  
  
  Ingress → Service
&lt;/h4&gt;

&lt;p&gt;Every &lt;code&gt;spec.rules[].http.paths[].backend.service.name&lt;/code&gt; becomes a directed arrow from the Ingress to the target Service.&lt;/p&gt;

&lt;h4&gt;
  
  
  Service → Deployment
&lt;/h4&gt;

&lt;p&gt;Service &lt;code&gt;spec.selector&lt;/code&gt; is matched against Deployment/StatefulSet/DaemonSet &lt;code&gt;spec.selector.matchLabels&lt;/code&gt;. Matching labels = connection arrow.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deployment → ConfigMap/Secret
&lt;/h4&gt;

&lt;p&gt;Volume mounts (&lt;code&gt;configMap.name&lt;/code&gt;, &lt;code&gt;secret.secretName&lt;/code&gt;) and &lt;code&gt;envFrom&lt;/code&gt; references become arrows from the workload to the config resource.&lt;/p&gt;

&lt;h4&gt;
  
  
  HPA → target
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;spec.scaleTargetRef.name&lt;/code&gt; and &lt;code&gt;kind&lt;/code&gt; links the HorizontalPodAutoscaler to its Deployment, StatefulSet, or ReplicaSet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Kubernetes resource kinds
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Workload&lt;/td&gt;
&lt;td&gt;Main compute unit; selector matching for Service connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StatefulSet&lt;/td&gt;
&lt;td&gt;Workload&lt;/td&gt;
&lt;td&gt;Persistent workloads; selector matching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DaemonSet&lt;/td&gt;
&lt;td&gt;Workload&lt;/td&gt;
&lt;td&gt;Node-level agents; selector matching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Job&lt;/td&gt;
&lt;td&gt;Workload&lt;/td&gt;
&lt;td&gt;Batch tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CronJob&lt;/td&gt;
&lt;td&gt;Workload&lt;/td&gt;
&lt;td&gt;Scheduled batch tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pod&lt;/td&gt;
&lt;td&gt;Workload&lt;/td&gt;
&lt;td&gt;Standalone pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReplicaSet&lt;/td&gt;
&lt;td&gt;Workload&lt;/td&gt;
&lt;td&gt;HPA scale target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;ClusterIP, NodePort, LoadBalancer — selector → Deployment arrows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingress&lt;/td&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;HTTP routing rules → Service arrows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetworkPolicy&lt;/td&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;Pod-level network rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ConfigMap&lt;/td&gt;
&lt;td&gt;Config&lt;/td&gt;
&lt;td&gt;Referenced via volume mounts and envFrom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret&lt;/td&gt;
&lt;td&gt;Config&lt;/td&gt;
&lt;td&gt;Referenced via volume mounts and envFrom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PersistentVolumeClaim&lt;/td&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Volume mount references from workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PersistentVolume&lt;/td&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Cluster-wide storage resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ServiceAccount&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Pod identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HorizontalPodAutoscaler&lt;/td&gt;
&lt;td&gt;Autoscaling&lt;/td&gt;
&lt;td&gt;Linked to scale target via scaleTargetRef&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Namespace grouping
&lt;/h2&gt;

&lt;p&gt;Every resource is placed inside a namespace boundary drawn on the diagram. Resources with the same &lt;code&gt;metadata.namespace&lt;/code&gt; value are grouped together in a labelled box. Resources without a namespace go into the &lt;code&gt;default&lt;/code&gt; namespace group.&lt;/p&gt;

&lt;p&gt;When you paste manifests from multiple namespaces — say &lt;code&gt;production&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, and &lt;code&gt;monitoring&lt;/code&gt; — each namespace gets its own group and resources stay organized. Cross-namespace connections (e.g., an Ingress controller in &lt;code&gt;ingress-nginx&lt;/code&gt; routing to a Service in &lt;code&gt;production&lt;/code&gt;) are drawn as arrows between the groups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: a typical web application
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-ingress&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
&lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-service&lt;/span&gt;
&lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-service&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-deployment&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
&lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
&lt;span class="na"&gt;envFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;configMapRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-config&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;secretRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-secrets&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ConfigMap&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-config&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste this and InfraSketch draws: &lt;strong&gt;Ingress → web-service → web-deployment → web-config&lt;/strong&gt; with &lt;strong&gt;web-secrets&lt;/strong&gt; also connected to the deployment. All resources inside a &lt;code&gt;production&lt;/code&gt; namespace box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding&lt;/strong&gt; — new engineers understand the application topology in minutes instead of reading dozens of YAML files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code reviews&lt;/strong&gt; — visualize the topology change when a PR adds a new Service or reconfigures selectors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident response&lt;/strong&gt; — quickly see which Services connect to a misbehaving Deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; — export as PNG or SVG and embed in runbooks, Confluence, or Notion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture reviews&lt;/strong&gt; — export as draw.io XML for a fully editable diagram in design docs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Works with Helm and Kustomize output too
&lt;/h2&gt;

&lt;p&gt;InfraSketch reads rendered YAML — it doesn't need the original Helm chart or Kustomize overlay files. Render first, then paste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm template my-release ./my-chart | pbcopy          &lt;span class="c"&gt;# macOS&lt;/span&gt;
kustomize build overlays/production | pbcopy            &lt;span class="c"&gt;# macOS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works especially well for understanding what a third-party Helm chart actually deploys before you install it in your cluster.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Generate your Kubernetes diagram now Paste your K8s manifests — or run &lt;code&gt;kubectl get all -o yaml&lt;/code&gt; and paste. Free, no login, no cluster access needed. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

</description>
      <category>kubernetesdiagram</category>
      <category>k8sdiagramgenerator</category>
      <category>kubernetesarchitecturediagram</category>
      <category>kubernetesyamlvisualizer</category>
    </item>
    <item>
      <title>CDK Architecture Diagram Generator — Visualize AWS CDK Apps Instantly</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 22:12:26 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/cdk-architecture-diagram-generator-visualize-aws-cdk-apps-instantly-4nl</link>
      <guid>https://dev.to/pandey-raghvendra/cdk-architecture-diagram-generator-visualize-aws-cdk-apps-instantly-4nl</guid>
      <description>&lt;p&gt;InfraSketch now supports AWS CDK. Run &lt;code&gt;cdk synth&lt;/code&gt;, paste the JSON output into the CDK tab, and get a full architecture diagram in seconds — VPC containment, subnet lanes, resource connections, official AWS icons. No login, no credentials, everything in your browser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try it now Paste your &lt;code&gt;cdk synth&lt;/code&gt; output and see the diagram instantly. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why CDK needs a diagram tool
&lt;/h2&gt;

&lt;p&gt;CDK is increasingly the default way teams write AWS infrastructure — TypeScript, Python, or Go code that compiles down to CloudFormation. The abstractions are great for development velocity, but they create a visibility problem: when something goes wrong, or when you need to explain the architecture to someone outside your team, the source code is not the right artifact to share.&lt;/p&gt;

&lt;p&gt;The CloudFormation console shows you a stack but won't visualize containment. The CDK tree view shows construct hierarchy, not network topology. There's no built-in way to go from a CDK app to a clean architecture diagram without manually drawing one.&lt;/p&gt;

&lt;p&gt;InfraSketch fills that gap. One command, paste, done.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get your CDK synth output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;cdk synth | pbcopy          #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;macOS — copies to clipboard
&lt;span class="gp"&gt;cdk synth &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;template.json  &lt;span class="c"&gt;# save to file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;infrasketch.cloud&lt;/a&gt;, click the &lt;strong&gt;CDK&lt;/strong&gt; tab, paste, and click &lt;strong&gt;Generate Diagram&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If your app has multiple stacks, use &lt;code&gt;cdk synth MyStack&lt;/code&gt; to synthesize a specific stack, or paste each stack's output separately to diagram them individually.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;CDK compiles to CloudFormation JSON. InfraSketch's CDK tab runs the same parser as the CloudFormation tab — it reads the &lt;code&gt;Resources&lt;/code&gt; object, maps each &lt;code&gt;Type&lt;/code&gt; to a visual category, and infers topology from &lt;code&gt;Ref&lt;/code&gt; and &lt;code&gt;Fn::GetAtt&lt;/code&gt; references between resources.&lt;/p&gt;

&lt;p&gt;CDK logical IDs look different from hand-written CloudFormation — CDK generates names like &lt;code&gt;VPCB9E5F0B4&lt;/code&gt; and &lt;code&gt;EKSCluster9EE0221C&lt;/code&gt; — but the diagram labels use the resource type and truncated logical ID, making it easy to identify resources without needing the CDK source code in front of you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets visualized
&lt;/h2&gt;

&lt;h4&gt;
  
  
  VPC containment
&lt;/h4&gt;

&lt;p&gt;Resources with &lt;code&gt;VpcId: { Ref: VPC }&lt;/code&gt; are drawn inside the VPC box. CDK's &lt;code&gt;ec2.Vpc&lt;/code&gt; construct generates this automatically.&lt;/p&gt;

&lt;h4&gt;
  
  
  Subnet placement
&lt;/h4&gt;

&lt;p&gt;Public and private subnet lanes from CDK's &lt;code&gt;SubnetSelection&lt;/code&gt; — &lt;code&gt;SubnetIds&lt;/code&gt; in the synthesized JSON places resources in the right lane.&lt;/p&gt;

&lt;h4&gt;
  
  
  Connection arrows
&lt;/h4&gt;

&lt;p&gt;Every &lt;code&gt;Fn::GetAtt&lt;/code&gt; between supported resources becomes a directed arrow — Lambda → IAM Role, ECS Service → ALB Target Group, etc.&lt;/p&gt;

&lt;h4&gt;
  
  
  Zone grouping
&lt;/h4&gt;

&lt;p&gt;Internet zone (IGW, CloudFront), messaging zone (SQS, SNS), data zone (RDS, ElastiCache, S3) — all inferred automatically from resource type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported CDK constructs (L1 / Cfn*)
&lt;/h2&gt;

&lt;p&gt;Any CDK L1 construct (prefixed &lt;code&gt;Cfn&lt;/code&gt;) maps directly to a CloudFormation resource type and is fully supported. Common L2 constructs synthesize to the same underlying types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ec2.Vpc&lt;/code&gt; → &lt;code&gt;AWS::EC2::VPC&lt;/code&gt; + subnets + IGW + NAT gateways&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eks.Cluster&lt;/code&gt; → &lt;code&gt;AWS::EKS::Cluster&lt;/code&gt; + node groups + IAM roles&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ecs.FargateService&lt;/code&gt; → &lt;code&gt;AWS::ECS::Service&lt;/code&gt; + task definition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lambda.Function&lt;/code&gt; → &lt;code&gt;AWS::Lambda::Function&lt;/code&gt; + IAM role&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rds.DatabaseInstance&lt;/code&gt; → &lt;code&gt;AWS::RDS::DBInstance&lt;/code&gt; + subnet group&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;elasticache.CfnReplicationGroup&lt;/code&gt; → &lt;code&gt;AWS::ElastiCache::ReplicationGroup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;s3.Bucket&lt;/code&gt; → &lt;code&gt;AWS::S3::Bucket&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sqs.Queue&lt;/code&gt; → &lt;code&gt;AWS::SQS::Queue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sns.Topic&lt;/code&gt; → &lt;code&gt;AWS::SNS::Topic&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;elbv2.ApplicationLoadBalancer&lt;/code&gt; → &lt;code&gt;AWS::ElasticLoadBalancingV2::LoadBalancer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cloudfront.Distribution&lt;/code&gt; → &lt;code&gt;AWS::CloudFront::Distribution&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kms.Key&lt;/code&gt; → &lt;code&gt;AWS::KMS::Key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;iam.Role&lt;/code&gt; → &lt;code&gt;AWS::IAM::Role&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wafv2.CfnWebACL&lt;/code&gt; → &lt;code&gt;AWS::WAFv2::WebACL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;route53.HostedZone&lt;/code&gt; → &lt;code&gt;AWS::Route53::HostedZone&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code reviews&lt;/strong&gt; — run &lt;code&gt;cdk synth&lt;/code&gt; on a PR branch and paste the output to see what the architecture change looks like visually&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding&lt;/strong&gt; — share a diagram link with new team members instead of asking them to read CDK TypeScript they've never seen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; — export as PNG or SVG and embed in Confluence, Notion, or your wiki&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture reviews&lt;/strong&gt; — export as draw.io XML to get a fully editable diagram for your design doc&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift detection&lt;/strong&gt; — synthesize before and after a change and compare diagrams side by side&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Works with CDK for Terraform too
&lt;/h2&gt;

&lt;p&gt;CDK for Terraform (CDKTF) can synthesize Terraform JSON. If you're using CDKTF, use the &lt;strong&gt;Terraform&lt;/strong&gt; tab and paste the synthesized JSON — InfraSketch's plan JSON parser handles it directly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Generate your CDK diagram now Run &lt;code&gt;cdk synth | pbcopy&lt;/code&gt;, paste into the CDK tab, click Generate. Free, no login, nothing leaves your browser. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

</description>
      <category>cdk</category>
      <category>awscdk</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>CloudFormation Diagram Generator — Visualize AWS Templates Instantly</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 22:02:36 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/cloudformation-diagram-generator-visualize-aws-templates-instantly-4038</link>
      <guid>https://dev.to/pandey-raghvendra/cloudformation-diagram-generator-visualize-aws-templates-instantly-4038</guid>
      <description>&lt;p&gt;InfraSketch now supports CloudFormation. Paste a CloudFormation YAML or JSON template — including all the &lt;code&gt;!Ref&lt;/code&gt;, &lt;code&gt;!GetAtt&lt;/code&gt;, and &lt;code&gt;!Sub&lt;/code&gt; shorthand you're used to writing — and get a clean architecture diagram in seconds. No login, no backend, everything runs in your browser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try it now Paste your CloudFormation template and see the diagram instantly. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why CloudFormation support matters
&lt;/h2&gt;

&lt;p&gt;CloudFormation is still the most widely deployed IaC tool in AWS-heavy organizations. It ships with every AWS account, it integrates natively with CDK, SAM, and AWS Service Catalog, and most platform teams have years of existing templates they maintain. But CloudFormation has always been terrible at communicating what it actually does. A 400-line YAML file is not an architecture — it's a specification. Turning it into a diagram has always meant manual work in draw.io or Lucidchart.&lt;/p&gt;

&lt;p&gt;InfraSketch eliminates that step. Paste the template, click Generate, get a diagram you can share or export.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;CloudFormation templates use YAML shorthand tags like &lt;code&gt;!Ref&lt;/code&gt; and &lt;code&gt;!GetAtt&lt;/code&gt; that are not standard YAML — most parsers choke on them. InfraSketch registers custom YAML types for all CloudFormation intrinsic functions before parsing, so your templates load cleanly without any preprocessing.&lt;/p&gt;

&lt;p&gt;Once parsed, the engine walks every resource's &lt;code&gt;Properties&lt;/code&gt; block and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maps the &lt;code&gt;Type&lt;/code&gt; field (e.g. &lt;code&gt;AWS::ECS::Service&lt;/code&gt;) to a visual category with the correct AWS icon&lt;/li&gt;
&lt;li&gt;Detects &lt;code&gt;VpcId: !Ref MyVPC&lt;/code&gt; and draws the resource inside the VPC container&lt;/li&gt;
&lt;li&gt;Detects &lt;code&gt;SubnetId&lt;/code&gt; / &lt;code&gt;SubnetIds&lt;/code&gt; / &lt;code&gt;Subnets&lt;/code&gt; references and places the resource in the correct subnet lane&lt;/li&gt;
&lt;li&gt;Infers directed connections from any other &lt;code&gt;Ref&lt;/code&gt; or &lt;code&gt;GetAtt&lt;/code&gt; between supported resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is the same zoned layout InfraSketch uses for Terraform — Internet zone at the top, ingress layer, VPC with subnets, data zone, messaging zone, security zone — all inferred automatically from your template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;infrasketch.cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;CloudFormation&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Paste your template (YAML or JSON) and click &lt;strong&gt;Generate Diagram&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Export as PNG, SVG, or draw.io XML — or click &lt;strong&gt;Share&lt;/strong&gt; to copy a shareable URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The parser auto-detects YAML vs JSON based on whether the template starts with &lt;code&gt;{&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: a minimal web stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;AWSTemplateFormatVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2010-09-09'&lt;/span&gt;
&lt;span class="na"&gt;Resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;VPC&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::EC2::VPC&lt;/span&gt;
&lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;CidrBlock&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10.0.0.0/16&lt;/span&gt;

&lt;span class="na"&gt;PublicSubnet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::EC2::Subnet&lt;/span&gt;
&lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;VpcId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;VPC&lt;/span&gt;
&lt;span class="na"&gt;CidrBlock&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10.0.1.0/24&lt;/span&gt;

&lt;span class="na"&gt;AppLoadBalancer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::ElasticLoadBalancingV2::LoadBalancer&lt;/span&gt;
&lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Subnets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;PublicSubnet&lt;/span&gt;

&lt;span class="na"&gt;AppFunction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::Lambda::Function&lt;/span&gt;
&lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!GetAtt&lt;/span&gt; &lt;span class="s"&gt;LambdaRole.Arn&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;QUEUE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;AppQueue&lt;/span&gt;

&lt;span class="na"&gt;AppQueue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::SQS::Queue&lt;/span&gt;

&lt;span class="na"&gt;LambdaRole&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::IAM::Role&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces a diagram with the VPC container, PublicSubnet with the ALB inside, Lambda connecting to SQS and IAM Role, and the messaging zone for the queue — all from the references in the template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported resource types
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;CloudFormation types&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::EC2::VPC&lt;/code&gt;, &lt;code&gt;AWS::EC2::Subnet&lt;/code&gt;, &lt;code&gt;AWS::EC2::InternetGateway&lt;/code&gt;, &lt;code&gt;AWS::EC2::NatGateway&lt;/code&gt;, &lt;code&gt;AWS::EC2::EIP&lt;/code&gt;, &lt;code&gt;AWS::EC2::RouteTable&lt;/code&gt;, &lt;code&gt;AWS::EC2::TransitGateway&lt;/code&gt;, &lt;code&gt;AWS::EC2::VPNGateway&lt;/code&gt;, &lt;code&gt;AWS::EC2::NetworkInterface&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::EC2::Instance&lt;/code&gt;, &lt;code&gt;AWS::EC2::LaunchTemplate&lt;/code&gt;, &lt;code&gt;AWS::AutoScaling::AutoScalingGroup&lt;/code&gt;, &lt;code&gt;AWS::EKS::Cluster&lt;/code&gt;, &lt;code&gt;AWS::EKS::Nodegroup&lt;/code&gt;, &lt;code&gt;AWS::ECS::Cluster&lt;/code&gt;, &lt;code&gt;AWS::ECS::Service&lt;/code&gt;, &lt;code&gt;AWS::ECS::TaskDefinition&lt;/code&gt;, &lt;code&gt;AWS::Lambda::Function&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::RDS::DBInstance&lt;/code&gt;, &lt;code&gt;AWS::RDS::DBCluster&lt;/code&gt;, &lt;code&gt;AWS::DynamoDB::Table&lt;/code&gt;, &lt;code&gt;AWS::ElastiCache::CacheCluster&lt;/code&gt;, &lt;code&gt;AWS::ElastiCache::ReplicationGroup&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AWS::S3::Bucket&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load balancing&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::ElasticLoadBalancingV2::LoadBalancer&lt;/code&gt; (ALB/NLB auto-detected), &lt;code&gt;AWS::ElasticLoadBalancingV2::TargetGroup&lt;/code&gt;, &lt;code&gt;AWS::ElasticLoadBalancing::LoadBalancer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::EC2::SecurityGroup&lt;/code&gt;, &lt;code&gt;AWS::IAM::Role&lt;/code&gt;, &lt;code&gt;AWS::KMS::Key&lt;/code&gt;, &lt;code&gt;AWS::WAFv2::WebACL&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge / DNS&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::CloudFront::Distribution&lt;/code&gt;, &lt;code&gt;AWS::Route53::HostedZone&lt;/code&gt;, &lt;code&gt;AWS::Route53::RecordSet&lt;/code&gt;, &lt;code&gt;AWS::Route53::RecordSetGroup&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::SQS::Queue&lt;/code&gt;, &lt;code&gt;AWS::SNS::Topic&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AWS::ECR::Repository&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AWS::CloudWatch::Alarm&lt;/code&gt;, &lt;code&gt;AWS::Logs::LogGroup&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What gets inferred automatically
&lt;/h2&gt;

&lt;h4&gt;
  
  
  VPC containment
&lt;/h4&gt;

&lt;p&gt;Any resource with &lt;code&gt;VpcId: !Ref X&lt;/code&gt; is drawn inside the VPC box for resource X.&lt;/p&gt;

&lt;h4&gt;
  
  
  Subnet placement
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;SubnetId&lt;/code&gt;, &lt;code&gt;SubnetIds&lt;/code&gt;, and &lt;code&gt;Subnets&lt;/code&gt; properties place resources in the correct subnet lane.&lt;/p&gt;

&lt;h4&gt;
  
  
  ALB vs NLB
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;Type: network&lt;/code&gt; on a load balancer property selects the NLB icon; anything else is ALB.&lt;/p&gt;

&lt;h4&gt;
  
  
  Connection arrows
&lt;/h4&gt;

&lt;p&gt;Every &lt;code&gt;!Ref&lt;/code&gt; and &lt;code&gt;!GetAtt&lt;/code&gt; between supported resources that isn't a VPC/subnet reference becomes a directed arrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intrinsic functions supported
&lt;/h2&gt;

&lt;p&gt;The YAML parser handles all standard CloudFormation shorthand tags without requiring you to expand them to long form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;!Ref&lt;/code&gt; — logical resource reference&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!GetAtt&lt;/code&gt; — attribute reference (&lt;code&gt;!GetAtt Resource.Attribute&lt;/code&gt; or list form)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!Sub&lt;/code&gt; — string substitution (scalar and list forms)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!If&lt;/code&gt;, &lt;code&gt;!And&lt;/code&gt;, &lt;code&gt;!Or&lt;/code&gt;, &lt;code&gt;!Not&lt;/code&gt; — conditionals&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!Select&lt;/code&gt;, &lt;code&gt;!Join&lt;/code&gt;, &lt;code&gt;!Split&lt;/code&gt;, &lt;code&gt;!FindInMap&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!Base64&lt;/code&gt;, &lt;code&gt;!ImportValue&lt;/code&gt;, &lt;code&gt;!Condition&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JSON templates are also supported — &lt;code&gt;{ "Ref": "MyVPC" }&lt;/code&gt; and &lt;code&gt;{ "Fn::GetAtt": ["MyRole", "Arn"] }&lt;/code&gt; both work exactly the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's still Terraform-only
&lt;/h2&gt;

&lt;p&gt;A few features remain Terraform-specific for now: module expansion (ZIP upload and registry auto-fetch), and the plan JSON workflow. CloudFormation doesn't have an equivalent to &lt;code&gt;terraform show -json&lt;/code&gt;, but the template itself is already the resolved source of truth — there's no variable evaluation step needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code reviews&lt;/strong&gt; — paste the template diff, see what changed in the diagram&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding&lt;/strong&gt; — new team member needs to understand the stack without reading 500 lines of YAML&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; — export as PNG or SVG and embed in a wiki, Confluence page, or design doc&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;draw.io integration&lt;/strong&gt; — export as draw.io XML to get a fully editable diagram in diagrams.net or Confluence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit prep&lt;/strong&gt; — show reviewers the actual infrastructure topology without sharing credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try CloudFormation diagrams now Paste your template and get a diagram in seconds. Free, no login, nothing leaves your browser. &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

</description>
      <category>cloudformation</category>
      <category>devops</category>
      <category>aws</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Terraform Visualization: 5 Ways to See What Your Code Actually Builds</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 12:20:16 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/terraform-visualization-5-ways-to-see-what-your-code-actually-builds-o1l</link>
      <guid>https://dev.to/pandey-raghvendra/terraform-visualization-5-ways-to-see-what-your-code-actually-builds-o1l</guid>
      <description>&lt;p&gt;You've got 3,000 lines of Terraform spread across 40 files, organized into modules, with variables referencing other variables referencing data sources. It works. It deploys. But can you actually see what it builds?&lt;/p&gt;

&lt;p&gt;This is one of the most common challenges in infrastructure-as-code. The code is the source of truth, but it's not visual. You can't glance at a &lt;code&gt;.tf&lt;/code&gt; file and immediately understand the architecture the way you can with a diagram.&lt;/p&gt;

&lt;p&gt;Here are five practical approaches to visualize your Terraform infrastructure, ranked from simplest to most sophisticated.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. terraform graph + Graphviz
&lt;/h2&gt;

&lt;p&gt;Terraform has a built-in &lt;code&gt;graph&lt;/code&gt; command that outputs a dependency graph in DOT format. You can pipe it through Graphviz to generate a visual diagram.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform graph | dot &lt;span class="nt"&gt;-Tpng&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; graph.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the quickest approach — one command, no external tools needed (besides Graphviz). It shows every resource and its dependencies, which is useful for understanding execution order.&lt;/p&gt;

&lt;p&gt;The problem is readability. For any real-world infrastructure, the output is a massive, tangled web of nodes and arrows. A typical production setup with 50+ resources generates a graph that's essentially unreadable. It includes internal Terraform resources (providers, data sources, variables) that add noise without adding understanding.&lt;/p&gt;

&lt;p&gt;Terraform graph is useful for debugging dependency issues — "why is this resource waiting for that one?" — but it's not suitable for architecture documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Terraform Visual (VS Code extension)
&lt;/h2&gt;

&lt;p&gt;If you use VS Code, the Terraform Visual extension renders a visual graph of your Terraform resources directly in your editor. It reads your &lt;code&gt;.tf&lt;/code&gt; files and generates an interactive diagram that you can zoom, pan, and click on.&lt;/p&gt;

&lt;p&gt;The advantage over &lt;code&gt;terraform graph&lt;/code&gt; is that it filters out noise and only shows the resources you care about. It also updates in real-time as you edit your code, which is useful during development.&lt;/p&gt;

&lt;p&gt;The limitation is that it's tied to VS Code. You can't easily share the output with someone who uses a different editor, and the diagrams aren't suitable for documentation or presentations.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Python Diagrams library
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;diagrams&lt;/code&gt; library for Python lets you define architecture diagrams programmatically. While it doesn't read Terraform files directly, you can write a Python script that mirrors your Terraform architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Diagram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams.aws.compute&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;EKS&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams.aws.database&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ElastiCache&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams.aws.network&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ELB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Route53&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Diagram&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Production Architecture&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;dns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Route53&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Route 53&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;lb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ELB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Cluster&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EKS Cluster&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;EKS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="nc"&gt;EKS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;worker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="nc"&gt;EKS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scheduler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RDS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PostgreSQL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ElastiCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Redis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;dns&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lb&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces clean, professional diagrams with official AWS icons. The Python code can be committed alongside your Terraform code and updated in the same PR. It's a good approach for teams that want version-controlled diagrams.&lt;/p&gt;

&lt;p&gt;The downside is duplication — you're maintaining two representations of the same infrastructure (Terraform and Python). When someone adds a new resource in Terraform but forgets to update the diagram code, they drift apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Paste your code into InfraSketch
&lt;/h2&gt;

&lt;p&gt;This is the approach I built &lt;a href="https://dev.to/"&gt;InfraSketch&lt;/a&gt; for. Instead of writing separate diagram code, you paste your existing Terraform HCL and the tool generates the architecture diagram automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Just paste this into InfraSketch:&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_vpc"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eks_cluster"&lt;/span&gt; &lt;span class="s2"&gt;"app"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;
&lt;span class="nx"&gt;vpc_config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;subnet_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_rds_cluster"&lt;/span&gt; &lt;span class="s2"&gt;"db"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;cluster_identifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-db"&lt;/span&gt;
&lt;span class="nx"&gt;engine&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"aurora-postgresql"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# InfraSketch parses this and generates a&lt;/span&gt;
&lt;span class="c1"&gt;# grouped diagram with AWS icons automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool parses resource types, detects references between resources, groups them by category (networking, compute, database, etc.), and renders a diagram with official AWS architecture icons. Everything runs in the browser — your code never leaves your machine.&lt;/p&gt;

&lt;p&gt;This works well for quick visualization — "let me see what this Terraform actually creates" — and for generating diagrams to include in documentation or README files. The limitation is that it does static analysis only (it doesn't run &lt;code&gt;terraform plan&lt;/code&gt;), so it may miss resources created by complex expressions or external modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Rover (Terraform Visualizer)
&lt;/h2&gt;

&lt;p&gt;Rover is an open-source tool that reads Terraform state files or plan output and generates interactive diagrams. Unlike InfraSketch which does static analysis of HCL code, Rover works with the actual state — meaning it shows exactly what's deployed, including resources created by modules and count/for_each expressions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate a plan&lt;/span&gt;
terraform plan &lt;span class="nt"&gt;-out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;plan.out

&lt;span class="c"&gt;# Visualize it&lt;/span&gt;
rover &lt;span class="nt"&gt;-planPath&lt;/span&gt; plan.out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rover produces an interactive web-based diagram that you can zoom, filter, and search. It's more accurate than static analysis because it uses the resolved state, but it requires you to have Terraform initialized and access to the state file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which approach should you use?
&lt;/h2&gt;

&lt;p&gt;It depends on what you're trying to accomplish.&lt;/p&gt;

&lt;p&gt;If you need a quick visualization while developing, use InfraSketch or the VS Code extension. Paste your code, see the diagram, iterate.&lt;/p&gt;

&lt;p&gt;If you need accurate diagrams of what's actually deployed, use Rover with your state file. It's the most accurate because it works with resolved state rather than source code.&lt;/p&gt;

&lt;p&gt;If you need presentation-ready diagrams that are version-controlled, use the Python Diagrams library. It takes more effort but produces the most polished output.&lt;/p&gt;

&lt;p&gt;If you need to debug dependency chains, &lt;code&gt;terraform graph&lt;/code&gt; is still the right tool despite its messy output.&lt;/p&gt;

&lt;p&gt;The best approach for most teams is to combine methods: use InfraSketch or Rover for day-to-day visualization, and the Python Diagrams library for documentation that needs to look polished.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Visualize your Terraform instantly Paste your Terraform HCL and see the architecture diagram in seconds. Now with an &lt;a href="///blog/whats-new-april-2026.html"&gt;interactive drag-and-drop editor&lt;/a&gt;, GCP support, and more. &lt;a href="https://dev.to/"&gt;Open InfraSketch&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Related articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="///blog/whats-new-april-2026.html"&gt;What's New in InfraSketch — April 2026: Interactive Editor, GCP Support &amp;amp; More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/how-to-create-aws-architecture-diagrams.html"&gt;How to Create AWS Architecture Diagrams in 2026: A Complete Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/free-vs-paid-diagram-tools.html"&gt;Free vs Paid Cloud Architecture Diagram Tools — Honest Comparison 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>terraformvisualization</category>
      <category>terraformdiagram</category>
      <category>visualizeterraform</category>
      <category>terraformgraph</category>
    </item>
    <item>
      <title>How to Create AWS Architecture Diagrams in 2026: A Complete Guide</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 12:19:45 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/how-to-create-aws-architecture-diagrams-in-2026-a-complete-guide-511f</link>
      <guid>https://dev.to/pandey-raghvendra/how-to-create-aws-architecture-diagrams-in-2026-a-complete-guide-511f</guid>
      <description>&lt;p&gt;Architecture diagrams are one of those things every team needs but nobody wants to maintain. You spend an hour in draw.io moving boxes around, and by the time you share it, someone has already changed the infrastructure.&lt;/p&gt;

&lt;p&gt;After 9 years of building cloud infrastructure, I've tried every method — from whiteboards to $500/month enterprise tools. Here's a practical breakdown of every approach available in 2026, with honest pros and cons for each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why architecture diagrams matter
&lt;/h2&gt;

&lt;p&gt;Before diving into tools, it's worth understanding why diagrams are worth the effort. They serve three critical purposes in any engineering team.&lt;/p&gt;

&lt;p&gt;First, they accelerate onboarding. A new team member looking at 50 Terraform files has no idea how things connect. A diagram gives them the mental model in 30 seconds that would otherwise take days of reading code.&lt;/p&gt;

&lt;p&gt;Second, they improve incident response. When something breaks at 3 AM, you need to quickly understand which services are affected. A clear architecture diagram shows blast radius instantly — which services talk to the broken database, which load balancer routes to the failing service.&lt;/p&gt;

&lt;p&gt;Third, they enable architecture reviews. Whether you're pitching a migration to your CTO or doing a well-architected review, diagrams make the conversation concrete rather than abstract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: Manual drawing tools
&lt;/h2&gt;

&lt;p&gt;The traditional approach. Open a tool, drag boxes, draw arrows, label everything by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Draw.io (diagrams.net) — Free
&lt;/h3&gt;

&lt;p&gt;Draw.io is the most popular free option and for good reason. It has built-in AWS icon libraries, works in the browser, exports to PNG/SVG/PDF, and integrates with Confluence and Google Drive. For one-off diagrams that don't need frequent updates, it's hard to beat.&lt;/p&gt;

&lt;p&gt;The downside is entirely about maintenance. The moment your infrastructure changes — a new subnet, a renamed service, an additional database — your diagram is out of date. Someone has to manually update it, and that someone is usually nobody.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lucidchart — $7.95+/month
&lt;/h3&gt;

&lt;p&gt;Lucidchart adds real-time collaboration on top of Draw.io's feature set. Multiple people can edit the same diagram simultaneously, which is useful for architecture review sessions. It also has better auto-layout and alignment tools.&lt;/p&gt;

&lt;p&gt;The problem is the same as Draw.io — it's still manual. You're paying $8-15/month per user for a tool that produces diagrams that go stale immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use manual tools
&lt;/h3&gt;

&lt;p&gt;Manual tools work well for conceptual or aspirational diagrams — showing what you plan to build, not what currently exists. They're also good for presentations where you need a specific visual style or narrative flow that automated tools can't produce.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: Live cloud scanners
&lt;/h2&gt;

&lt;p&gt;These tools connect to your actual AWS/Azure/GCP account and generate diagrams from live infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloudcraft — $49+/month
&lt;/h3&gt;

&lt;p&gt;Cloudcraft (now owned by Datadog) scans your AWS account and generates both 2D and 3D architecture diagrams. The 3D isometric view looks impressive in presentations. It also includes cost estimation — hover over any resource to see its monthly cost.&lt;/p&gt;

&lt;p&gt;The catch: you need to give it read access to your cloud account. For many organizations, this is a non-starter — security teams don't want a third-party service scanning production infrastructure. It's also expensive at $49/month for individual use and more for teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hava.io — $49+/month
&lt;/h3&gt;

&lt;p&gt;Hava takes a similar approach but adds change tracking — it records every infrastructure change and lets you view historical diagrams. This is genuinely useful for debugging "what changed?" during an incident. It supports AWS, Azure, and GCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Workload Discovery — Free (self-hosted)
&lt;/h3&gt;

&lt;p&gt;Amazon's own solution, deployed as a CloudFormation stack in your account. It scans your resources and generates interactive diagrams. Being first-party, it avoids the credential-sharing concern. However, it only works for AWS (no multi-cloud), requires significant setup, and the diagrams aren't as polished as commercial tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use cloud scanners
&lt;/h3&gt;

&lt;p&gt;Cloud scanners are ideal for large organizations with complex, frequently changing infrastructure where manual diagramming is impossible. They're also useful for cloud cost audits and compliance documentation. But they're overkill for small teams or individual developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 3: Diagram-as-code
&lt;/h2&gt;

&lt;p&gt;Write code that generates diagrams. The diagram lives alongside your infrastructure code and can be version-controlled.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python Diagrams library
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;diagrams&lt;/code&gt; Python library lets you define architecture diagrams in Python code. It uses the official AWS/GCP/Azure icons and generates clean PNG output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Diagram&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Cluster&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams.aws.compute&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;EKS&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams.aws.database&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RDS&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;diagrams.aws.network&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ELB&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Diagram&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Production&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;lb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ELB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ALB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Cluster&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EKS Cluster&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;svc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EKS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;app&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RDS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postgres&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;lb&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;svc&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is popular because diagrams can be committed to Git, reviewed in PRs, and updated alongside infrastructure changes. The downside is that you're still manually defining the diagram — it doesn't read your Terraform code automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mermaid.js
&lt;/h3&gt;

&lt;p&gt;Mermaid uses a markdown-like syntax to define diagrams. It's built into GitHub (renders in README files), Notion, and many documentation tools. It's great for simple flowcharts and sequence diagrams, but it doesn't support AWS icons natively and the layout engine can produce awkward results for complex architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use diagram-as-code
&lt;/h3&gt;

&lt;p&gt;Diagram-as-code works well for teams that want version-controlled diagrams that evolve with the codebase. It's a good middle ground between manual tools and automated scanners. The trade-off is that someone still needs to write and maintain the diagram code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 4: Generate from IaC (Infrastructure as Code)
&lt;/h2&gt;

&lt;p&gt;This is the newest approach — tools that read your existing Terraform, CloudFormation, or Docker Compose files and automatically generate architecture diagrams. No manual drawing, no cloud credentials, no separate diagram code to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  InfraSketch — Free, open source
&lt;/h3&gt;

&lt;p&gt;Full disclosure: I built &lt;a href="https://dev.to/"&gt;InfraSketch&lt;/a&gt;. It takes a different approach from all the tools above — you paste your Terraform HCL or Docker Compose YAML, and it generates an architecture diagram instantly in your browser. No signup, no cloud credentials, no server-side processing.&lt;/p&gt;

&lt;p&gt;It parses 25+ AWS resource types, detects relationships between them, groups resources by category (networking, compute, database, storage, load balancing), and renders diagrams with official AWS architecture icons. You can export as PNG or SVG.&lt;/p&gt;

&lt;p&gt;The advantage is simplicity and privacy. Your code never leaves your browser. The limitation is that it currently only supports AWS resources and the parser may not catch every edge case in complex Terraform configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  terraform graph
&lt;/h3&gt;

&lt;p&gt;Terraform has a built-in &lt;code&gt;terraform graph&lt;/code&gt; command that outputs a dependency graph in DOT format. You can pipe it through Graphviz to generate a visual diagram. It's technically accurate but produces overwhelming, unreadable graphs for any real-world infrastructure. It shows every single resource and dependency, including internal Terraform resources that aren't meaningful to humans.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Auto-updates&lt;/th&gt;
&lt;th&gt;Credentials needed&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Draw.io&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;One-off diagrams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lucidchart&lt;/td&gt;
&lt;td&gt;$8+/mo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Team collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudcraft&lt;/td&gt;
&lt;td&gt;$49+/mo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Enterprise documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hava.io&lt;/td&gt;
&lt;td&gt;$49+/mo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Change tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python Diagrams&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Semi&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Version-controlled docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InfraSketch&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;From code&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Quick diagrams from IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  My recommendation
&lt;/h2&gt;

&lt;p&gt;There's no single best tool — it depends on your situation. If you're a solo developer or small team, start with InfraSketch for quick diagrams from your existing Terraform code, and use Draw.io when you need a custom presentation-ready diagram. If you're at a large organization with complex multi-account infrastructure, a cloud scanner like Cloudcraft or Hava pays for itself in time saved.&lt;/p&gt;

&lt;p&gt;The key insight is this: the best diagram is one that actually exists. A rough, auto-generated diagram that's always up-to-date is infinitely more valuable than a beautiful hand-drawn diagram from six months ago that no longer matches reality.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try InfraSketch Paste your Terraform code and get an architecture diagram in seconds. Now with an &lt;a href="///blog/whats-new-april-2026.html"&gt;interactive editor, GCP support, and more&lt;/a&gt;. Free, no signup required. &lt;a href="https://dev.to/"&gt;Generate a Diagram&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Related articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="///blog/whats-new-april-2026.html"&gt;What's New in InfraSketch — April 2026: Interactive Editor, GCP Support &amp;amp; More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/terraform-visualization-best-practices.html"&gt;Terraform Visualization: 5 Ways to See What Your Code Actually Builds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/aws-vpc-architecture-explained.html"&gt;AWS VPC Architecture Explained with Diagrams — From Simple to Production&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>awsarchitecturediagram</category>
      <category>createawsdiagram</category>
      <category>terraformdiagram</category>
      <category>cloudarchitecture</category>
    </item>
    <item>
      <title>Free vs Paid Cloud Architecture Diagram Tools — Honest Comparison 2026</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 12:19:44 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/free-vs-paid-cloud-architecture-diagram-tools-honest-comparison-2026-3h8p</link>
      <guid>https://dev.to/pandey-raghvendra/free-vs-paid-cloud-architecture-diagram-tools-honest-comparison-2026-3h8p</guid>
      <description>&lt;p&gt;Cloudcraft charges $49 per month. Draw.io costs nothing. InfraSketch generates diagrams from your existing code for free. Are the paid tools actually worth the money, or are you paying for features you don't need?&lt;/p&gt;

&lt;p&gt;I've used all of these tools in production environments over the past few years. Here's an honest breakdown — no affiliate links, no sponsored content, just what actually works and what doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Input method&lt;/th&gt;
&lt;th&gt;AWS icons&lt;/th&gt;
&lt;th&gt;Needs credentials&lt;/th&gt;
&lt;th&gt;Real-time sync&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Draw.io&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Manual drag &amp;amp; drop&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InfraSketch&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Paste Terraform/Compose&lt;/td&gt;
&lt;td&gt;Yes (official)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;From code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudcraft&lt;/td&gt;
&lt;td&gt;$49+/mo&lt;/td&gt;
&lt;td&gt;Live AWS scan&lt;/td&gt;
&lt;td&gt;Yes (custom 3D)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hava.io&lt;/td&gt;
&lt;td&gt;$49+/mo&lt;/td&gt;
&lt;td&gt;Live cloud scan&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes + history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lucidchart&lt;/td&gt;
&lt;td&gt;$8+/mo&lt;/td&gt;
&lt;td&gt;Manual + import&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lucidscale&lt;/td&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Live cloud scan&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Free tools: what you get and what you don't
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Draw.io (diagrams.net)
&lt;/h3&gt;

&lt;p&gt;Draw.io is the workhorse of architecture diagrams. It's completely free, runs in the browser, has a comprehensive AWS icon library, and exports to every format imaginable. It integrates with Google Drive, Confluence, and GitHub.&lt;/p&gt;

&lt;p&gt;The experience is essentially like a simplified Visio. You drag resources onto a canvas, draw connections between them, and arrange everything manually. For a simple 10-resource diagram, this takes about 15-20 minutes. For a complex production environment with 50+ resources across multiple VPCs, you're looking at an hour or more.&lt;/p&gt;

&lt;p&gt;The real cost of Draw.io isn't money — it's maintenance. Every time your infrastructure changes, someone needs to manually update the diagram. In my experience, diagrams in Draw.io go stale within a week of being created. Nobody wants to be the person who maintains them.&lt;/p&gt;

&lt;h3&gt;
  
  
  InfraSketch
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.to/"&gt;InfraSketch&lt;/a&gt; takes a fundamentally different approach. Instead of manually drawing diagrams, you paste your Terraform HCL or Docker Compose YAML and the diagram is generated automatically. It parses resource types, detects relationships, and renders grouped diagrams with official AWS icons.&lt;/p&gt;

&lt;p&gt;The advantage is speed and accuracy. Generating a diagram from 50 resources takes about 2 seconds — not an hour. And because it reads your actual code, the diagram always matches what's deployed (assuming your code matches your state).&lt;/p&gt;

&lt;p&gt;The trade-off is flexibility. You can't customize the layout, add annotations, or include non-AWS resources. If you need a presentation-ready diagram with custom callouts and explanations, you'll still need a manual tool for the finishing touches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paid tools: when they're worth it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cloudcraft ($49/month)
&lt;/h3&gt;

&lt;p&gt;Cloudcraft's unique selling point is the 3D isometric view. It looks genuinely impressive in presentations and reports. Beyond aesthetics, Cloudcraft connects to your AWS account and scans live infrastructure, so diagrams are always accurate.&lt;/p&gt;

&lt;p&gt;It also includes cost estimation — every resource in the diagram shows its monthly cost, which is useful for FinOps conversations and cost reviews.&lt;/p&gt;

&lt;p&gt;Cloudcraft is worth the money if you regularly present architecture to non-technical stakeholders (executives, clients, investors) where the visual quality matters, or if you need cost estimation integrated into your diagrams. For day-to-day engineering documentation, it's overpriced.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hava.io ($49/month)
&lt;/h3&gt;

&lt;p&gt;Hava's differentiator is change tracking. It scans your cloud accounts periodically and records every change — new resources, deleted resources, configuration changes. You can view what your architecture looked like at any point in the past.&lt;/p&gt;

&lt;p&gt;This is genuinely valuable during incident response. "What changed in the last 24 hours?" is a question that's hard to answer with other tools. Hava gives you a visual diff instantly.&lt;/p&gt;

&lt;p&gt;Hava is worth the money for teams with complex, frequently changing infrastructure where change visibility is critical — especially in regulated industries where you need audit trails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lucidchart ($8-15/month)
&lt;/h3&gt;

&lt;p&gt;Lucidchart is Draw.io with collaboration features. Multiple people can edit the same diagram simultaneously, there are better templates and auto-alignment tools, and it integrates with more business tools (Slack, Teams, Jira).&lt;/p&gt;

&lt;p&gt;It's worth the money for teams that need to collaborate on diagrams in real-time — for example, during architecture review meetings where multiple engineers need to draw on the same canvas. For solo work, Draw.io does the same thing for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real question: do you need a diagram tool at all?
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable truth: if you're writing infrastructure as code (Terraform, CloudFormation, Pulumi), your code IS your architecture documentation. The question is whether you need a visual representation on top of it.&lt;/p&gt;

&lt;p&gt;For small teams (under 10 engineers) who all work with the same codebase, you might not. Everyone can read the Terraform and understand the architecture. A quick InfraSketch diagram for README files and onboarding docs might be all you need.&lt;/p&gt;

&lt;p&gt;For larger teams, especially those with non-technical stakeholders, visual diagrams become essential. Executives and clients can't read Terraform. They need pictures. In that case, a combination of InfraSketch for quick engineering-level diagrams and Cloudcraft or manual tools for presentation-ready visuals is the sweet spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  My recommendation by team size
&lt;/h2&gt;

&lt;p&gt;For solo developers or very small teams: use InfraSketch for quick visualization from your Terraform code, and Draw.io when you need a custom diagram for a presentation. Total cost: $0.&lt;/p&gt;

&lt;p&gt;For mid-size teams (10-50 engineers): add Lucidchart for collaborative diagramming during architecture reviews. Use InfraSketch for day-to-day visualization. Total cost: $8-15/month.&lt;/p&gt;

&lt;p&gt;For large organizations (50+ engineers): invest in Cloudcraft or Hava for automated, always-current diagrams of production infrastructure. Use InfraSketch for development-time visualization. Total cost: $49-100/month.&lt;/p&gt;

&lt;p&gt;The key principle: don't pay for features you won't use. If you're a solo developer paying $49/month for Cloudcraft to generate one diagram, you're wasting money. Start free, upgrade when you hit actual limitations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Start with InfraSketch — it's free Generate architecture diagrams from your Terraform code in seconds. Now with an &lt;a href="///blog/whats-new-april-2026.html"&gt;interactive editor and GCP support&lt;/a&gt;. No signup, no credentials. &lt;a href="https://dev.to/"&gt;Try InfraSketch&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Related articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="///blog/whats-new-april-2026.html"&gt;What's New in InfraSketch — April 2026: Interactive Editor, GCP Support &amp;amp; More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/terraform-visualization-best-practices.html"&gt;Terraform Visualization: 5 Ways to See What Your Code Actually Builds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/how-to-create-aws-architecture-diagrams.html"&gt;How to Create AWS Architecture Diagrams in 2026: A Complete Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloudarchitecturediagramtools</category>
      <category>cloudcraftalternative</category>
      <category>freediagramtool</category>
      <category>awsdiagramtoolcomparison</category>
    </item>
    <item>
      <title>How to Visualize Your Docker Compose Setup (With Examples)</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 12:14:31 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/how-to-visualize-your-docker-compose-setup-with-examples-2jn5</link>
      <guid>https://dev.to/pandey-raghvendra/how-to-visualize-your-docker-compose-setup-with-examples-2jn5</guid>
      <description>&lt;p&gt;Docker Compose files start simple — a web server, a database, maybe a cache. Then requirements grow. You add a message queue, a worker service, a monitoring stack, a reverse proxy. Before you know it, your &lt;code&gt;docker-compose.yml&lt;/code&gt; is 200 lines long and nobody on the team can explain how all the services connect.&lt;/p&gt;

&lt;p&gt;This article covers practical ways to visualize your Docker Compose setup so you can understand, document, and communicate your container architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why visualize Docker Compose?
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;docker-compose.yml&lt;/code&gt; file defines services, networks, volumes, and dependencies — but it does so in a flat YAML structure that doesn't visually convey how things connect. When someone new joins the team and asks "how do these containers talk to each other?", reading 200 lines of YAML isn't the answer.&lt;/p&gt;

&lt;p&gt;Diagrams help in three specific situations. During onboarding, a new developer can look at a diagram and understand the service topology in 30 seconds. During debugging, when a service can't connect to another, a diagram shows you which network they're on and what sits between them. During architecture reviews, when you're discussing whether to split a monolith service or add a new dependency, a visual representation makes the conversation concrete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: a typical web application
&lt;/h2&gt;

&lt;p&gt;Let's start with a real-world example — a web application with a React frontend, a Python API, PostgreSQL, Redis, and Nginx as a reverse proxy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:alpine&lt;/span&gt;
&lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;

&lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./frontend&lt;/span&gt;
&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;

&lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./api&lt;/span&gt;
&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgresql://app:secret@postgres/appdb&lt;/span&gt;

&lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7-alpine&lt;/span&gt;

&lt;span class="na"&gt;worker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./worker&lt;/span&gt;
&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;pgdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading this YAML, you can piece together the architecture — Nginx sits in front of everything, the frontend talks to the API, the API uses PostgreSQL and Redis, and a worker also connects to both data stores. But it takes a few minutes of careful reading to build that mental model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: Use InfraSketch
&lt;/h2&gt;

&lt;p&gt;The quickest approach is to paste your Docker Compose YAML directly into &lt;a href="https://dev.to/"&gt;InfraSketch&lt;/a&gt;. Select the "Docker Compose" tab, paste your YAML, and click "Generate Diagram." The tool parses service definitions and generates a visual diagram showing each container and its connections.&lt;/p&gt;

&lt;p&gt;This takes about 5 seconds and gives you a diagram you can export as PNG or SVG for your project README or documentation. The current version detects services from the YAML structure and shows them as container nodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: docker-compose-viz
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;docker-compose-viz&lt;/code&gt; tool is a CLI that reads your compose file and generates a graph using Graphviz. It's available as a Docker container itself, which is convenient.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--name&lt;/span&gt; dcv &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/input:ro &lt;span class="se"&gt;\&lt;/span&gt;
pmsipilot/docker-compose-viz &lt;span class="se"&gt;\&lt;/span&gt;
render &lt;span class="nt"&gt;-m&lt;/span&gt; image docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces a dependency graph showing which services depend on which. It's more detailed than a simple service list because it visualizes the &lt;code&gt;depends_on&lt;/code&gt; relationships, &lt;code&gt;links&lt;/code&gt;, and shared networks.&lt;/p&gt;

&lt;p&gt;The output is functional but not pretty — it uses default Graphviz styling, which means tiny text and cramped layouts for complex setups. For a quick check of your dependency chain, it works. For documentation, you'll want something more polished.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 3: Mermaid.js in your README
&lt;/h2&gt;

&lt;p&gt;If you want a diagram that lives in your README and renders automatically on GitHub, Mermaid is a great option. You define the diagram using a simple text syntax that GitHub renders as an image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
mermaid&lt;br&gt;
graph TB&lt;br&gt;
Client[Browser] --&amp;gt; Nginx&lt;br&gt;
Nginx --&amp;gt; Frontend[React App]&lt;br&gt;
Nginx --&amp;gt; API[Python API]&lt;br&gt;
API --&amp;gt; Postgres[(PostgreSQL)]&lt;br&gt;
API --&amp;gt; Redis[(Redis)]&lt;br&gt;
Worker --&amp;gt; Postgres&lt;br&gt;
Worker --&amp;gt; Redis&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This renders as a clean flowchart directly in your GitHub README. The advantage is that the diagram is version-controlled alongside your code. When you add a new service, you update the Mermaid block in the same PR.&lt;/p&gt;

&lt;p&gt;The limitation is manual maintenance — you need to keep the Mermaid diagram in sync with your actual &lt;code&gt;docker-compose.yml&lt;/code&gt;. It's also limited to simple box-and-arrow diagrams without service-specific icons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 4: Draw it manually (when you need polish)
&lt;/h2&gt;

&lt;p&gt;For presentations, documentation sites, or client deliverables, sometimes you need a hand-crafted diagram. Tools like Draw.io, Excalidraw, or Figma give you full control over layout, styling, and annotations.&lt;/p&gt;

&lt;p&gt;The key to making manual Docker diagrams useful is to include the right details: service names, exposed ports, volume mounts, and network boundaries. A diagram that just shows boxes with service names isn't much more useful than reading the YAML. A diagram that shows "Nginx (port 80) routes /api/* to API service (port 8000) on backend network" tells a real story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices for container architecture diagrams
&lt;/h2&gt;

&lt;p&gt;Regardless of which tool you use, effective Docker Compose diagrams share a few characteristics.&lt;/p&gt;

&lt;p&gt;First, show network boundaries. If your compose file defines multiple networks (frontend, backend, monitoring), group services by network. This immediately clarifies which services can communicate with each other.&lt;/p&gt;

&lt;p&gt;Second, indicate data persistence. Services with volumes are stateful — they hold data that matters. Highlight databases and any service with persistent volumes differently from stateless application containers.&lt;/p&gt;

&lt;p&gt;Third, show external access points. Which ports are exposed to the host? Which services are accessible from outside? This is critical for security reviews and debugging network issues.&lt;/p&gt;

&lt;p&gt;Fourth, label the connections. Don't just draw arrows — label them with protocol and port. "HTTP :8000" is more useful than a plain line between two boxes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it simple
&lt;/h2&gt;

&lt;p&gt;The best Docker Compose diagram is one that actually gets created and maintained. A rough auto-generated diagram that you update by re-running a tool is infinitely more valuable than a beautiful hand-drawn diagram from three months ago that no longer reflects reality.&lt;/p&gt;

&lt;p&gt;Start with InfraSketch or Mermaid for a quick visualization. If you need more polish, refine it manually. The goal is understanding, not art.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Visualize your Docker Compose Paste your docker-compose.yml and see your container architecture instantly. Now with an &lt;a href="///blog/whats-new-april-2026.html"&gt;interactive drag-and-drop editor&lt;/a&gt;. &lt;a href="https://dev.to/"&gt;Open InfraSketch&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Related articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="///blog/whats-new-april-2026.html"&gt;What's New in InfraSketch — April 2026: Interactive Editor, GCP Support &amp;amp; More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/terraform-visualization-best-practices.html"&gt;Terraform Visualization: 5 Ways to See What Your Code Actually Builds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/free-vs-paid-diagram-tools.html"&gt;Free vs Paid Cloud Architecture Diagram Tools — Honest Comparison 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dockercomposediagram</category>
      <category>dockercomposevisualizer</category>
      <category>visualizedockercompose</category>
      <category>dockerarchitecturediagram</category>
    </item>
    <item>
      <title>AWS VPC Architecture Explained with Diagrams — From Simple to Production</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 12:14:27 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/aws-vpc-architecture-explained-with-diagrams-from-simple-to-production-2npd</link>
      <guid>https://dev.to/pandey-raghvendra/aws-vpc-architecture-explained-with-diagrams-from-simple-to-production-2npd</guid>
      <description>&lt;p&gt;Every AWS architecture starts with a VPC. Whether you're deploying a single EC2 instance or a fleet of microservices on EKS, the network foundation determines your security posture, availability, and cost. Yet VPC networking is one of the most commonly misunderstood parts of AWS.&lt;/p&gt;

&lt;p&gt;This guide walks through four VPC architecture patterns, from simplest to production-grade, with Terraform code for each. You can paste any of these into &lt;a href="https://dev.to/"&gt;InfraSketch&lt;/a&gt; to see the architecture diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 1: Single public subnet (development only)
&lt;/h2&gt;

&lt;p&gt;The simplest possible setup — one VPC, one public subnet, one internet gateway. Every resource gets a public IP and is directly accessible from the internet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_vpc"&lt;/span&gt; &lt;span class="s2"&gt;"dev"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
&lt;span class="nx"&gt;enable_dns_hostnames&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"dev-vpc"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_internet_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"dev"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt;                  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;
&lt;span class="nx"&gt;availability_zone&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1a"&lt;/span&gt;
&lt;span class="nx"&gt;map_public_ip_on_launch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"public-subnet"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"app"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-0c55b159cbfafe1f0"&lt;/span&gt;
&lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
&lt;span class="nx"&gt;subnet_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-server"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern works for development environments, quick prototypes, and personal projects where you need something running fast without worrying about network security. Everything is on a public subnet, which means every resource is exposed to the internet.&lt;/p&gt;

&lt;p&gt;Never use this pattern in production. Databases, application servers, and internal services should never be on public subnets. It's like putting your house keys under the doormat — technically works, but invites trouble.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 2: Public + private subnets with NAT
&lt;/h2&gt;

&lt;p&gt;The standard two-tier architecture. Public subnets host load balancers and bastion hosts. Private subnets host application servers and databases. A NAT Gateway allows private resources to access the internet (for updates, API calls) without being directly accessible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_vpc"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
&lt;span class="nx"&gt;enable_dns_hostnames&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"main-vpc"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_internet_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt;                  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;
&lt;span class="nx"&gt;availability_zone&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1a"&lt;/span&gt;
&lt;span class="nx"&gt;map_public_ip_on_launch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"public-subnet"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"private"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.10.0/24"&lt;/span&gt;
&lt;span class="nx"&gt;availability_zone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1a"&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"private-subnet"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eip"&lt;/span&gt; &lt;span class="s2"&gt;"nat"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vpc"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_nat_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;allocation_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_eip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;subnet_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"main-nat"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lb"&lt;/span&gt; &lt;span class="s2"&gt;"app"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-alb"&lt;/span&gt;
&lt;span class="nx"&gt;internal&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nx"&gt;load_balancer_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"application"&lt;/span&gt;
&lt;span class="nx"&gt;subnets&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"app"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-0c55b159cbfafe1f0"&lt;/span&gt;
&lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.medium"&lt;/span&gt;
&lt;span class="nx"&gt;subnet_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;private&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-server"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_db_instance"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;identifier&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-db"&lt;/span&gt;
&lt;span class="nx"&gt;engine&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"postgres"&lt;/span&gt;
&lt;span class="nx"&gt;instance_class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"db.t3.medium"&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-database"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the most common VPC pattern and works well for small to medium applications. The ALB in the public subnet handles incoming traffic and forwards it to application servers in the private subnet. The database sits in the private subnet with no public access.&lt;/p&gt;

&lt;p&gt;The NAT Gateway costs around $32/month (in ap-south-1) plus data transfer charges. For development environments where you want to save money, you can use a NAT Instance (a small EC2 instance configured as a NAT) instead, though it's less reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 3: Multi-AZ for high availability
&lt;/h2&gt;

&lt;p&gt;Pattern 2 has a single point of failure — everything is in one Availability Zone. If that AZ goes down (and they do, occasionally), your entire application is offline. Production workloads need multi-AZ redundancy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_vpc"&lt;/span&gt; &lt;span class="s2"&gt;"prod"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
&lt;span class="nx"&gt;enable_dns_hostnames&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-vpc"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_internet_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"prod"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Public subnets in two AZs&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"public_1"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;
&lt;span class="nx"&gt;availability_zone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1a"&lt;/span&gt;
&lt;span class="nx"&gt;map_public_ip_on_launch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"public-1a"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"public_2"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.2.0/24"&lt;/span&gt;
&lt;span class="nx"&gt;availability_zone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1b"&lt;/span&gt;
&lt;span class="nx"&gt;map_public_ip_on_launch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"public-1b"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Private subnets in two AZs&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"private_1"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.10.0/24"&lt;/span&gt;
&lt;span class="nx"&gt;availability_zone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1a"&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"private-1a"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"private_2"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;vpc_id&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;cidr_block&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.11.0/24"&lt;/span&gt;
&lt;span class="nx"&gt;availability_zone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1b"&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"private-1b"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# NAT Gateways - one per AZ for redundancy&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eip"&lt;/span&gt; &lt;span class="s2"&gt;"nat_1"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vpc"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eip"&lt;/span&gt; &lt;span class="s2"&gt;"nat_2"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vpc"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_nat_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"az1"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;allocation_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_eip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nat_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;subnet_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_nat_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"az2"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;allocation_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_eip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nat_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="nx"&gt;subnet_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# ALB spans both public subnets&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lb"&lt;/span&gt; &lt;span class="s2"&gt;"prod"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-alb"&lt;/span&gt;
&lt;span class="nx"&gt;internal&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nx"&gt;load_balancer_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"application"&lt;/span&gt;
&lt;span class="nx"&gt;subnets&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# EKS cluster spans both private subnets&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eks_cluster"&lt;/span&gt; &lt;span class="s2"&gt;"prod"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-cluster"&lt;/span&gt;
&lt;span class="nx"&gt;role_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
&lt;span class="nx"&gt;vpc_config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;subnet_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;private_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;private_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"eks"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eks-cluster-role"&lt;/span&gt;
&lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;
&lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sts:AssumeRole"&lt;/span&gt;
&lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;
&lt;span class="nx"&gt;Principal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Service&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eks.amazonaws.com"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# RDS with Multi-AZ enabled&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_db_instance"&lt;/span&gt; &lt;span class="s2"&gt;"prod"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;identifier&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-db"&lt;/span&gt;
&lt;span class="nx"&gt;engine&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"postgres"&lt;/span&gt;
&lt;span class="nx"&gt;instance_class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"db.r5.large"&lt;/span&gt;
&lt;span class="nx"&gt;multi_az&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern duplicates subnets and NAT Gateways across two Availability Zones. The ALB automatically distributes traffic across both AZs. EKS schedules pods across both private subnets. RDS Multi-AZ maintains a standby replica in the second AZ.&lt;/p&gt;

&lt;p&gt;The cost increase from Pattern 2 is primarily the second NAT Gateway (~$32/month) and the additional EKS/RDS capacity in the second AZ. For production workloads, this cost is negligible compared to the downtime risk of a single-AZ deployment.&lt;/p&gt;

&lt;p&gt;Paste any of these Terraform snippets into &lt;a href="https://dev.to/"&gt;InfraSketch&lt;/a&gt; to see the architecture diagram generated automatically. You can visually verify your VPC layout matches your intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 4: Production-grade with security layers
&lt;/h2&gt;

&lt;p&gt;The complete production pattern adds security groups, VPC endpoints, CloudFront CDN, and a WAF layer. This is what a well-architected AWS deployment actually looks like.&lt;/p&gt;

&lt;p&gt;The full Terraform for this pattern is extensive — typically 500+ lines. The key additions beyond Pattern 3 are security groups with least-privilege rules for each service tier, VPC endpoints for S3 and ECR to keep traffic within the AWS network and reduce NAT costs, a CloudFront distribution in front of the ALB for caching and DDoS protection, a WAF (Web Application Firewall) attached to CloudFront or the ALB for Layer 7 filtering, and VPC Flow Logs sent to CloudWatch for network monitoring and incident investigation.&lt;/p&gt;

&lt;p&gt;Each of these additions addresses a specific security or operational concern. Security groups control which services can communicate with each other — the database should only accept connections from the application tier, not from the entire VPC. VPC endpoints eliminate the need for traffic to S3 and ECR to traverse the public internet through the NAT Gateway, which both improves security and reduces NAT data transfer costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common VPC mistakes to avoid
&lt;/h2&gt;

&lt;p&gt;After managing VPCs for dozens of production workloads, these are the mistakes I see most often.&lt;/p&gt;

&lt;p&gt;The first is using too-small CIDR blocks. A /24 VPC gives you 256 IPs, which sounds like plenty until you realize subnets, load balancers, and EKS each consume IPs. Start with a /16 (65,536 IPs) for production VPCs. You can always use smaller subnets within it.&lt;/p&gt;

&lt;p&gt;The second is putting databases on public subnets. It happens more often than you'd think, usually because someone copied a tutorial that took shortcuts. Databases should always be on private subnets with security groups that only allow connections from the application tier.&lt;/p&gt;

&lt;p&gt;The third is using a single NAT Gateway for production. NAT Gateways are zonal — if the AZ goes down, all private subnet internet access in that AZ is lost. Always use one NAT Gateway per AZ in production.&lt;/p&gt;

&lt;p&gt;The fourth is overlapping CIDR blocks with other VPCs or on-premises networks. If you ever need VPC peering or a VPN connection, overlapping CIDRs will prevent it. Plan your IP addressing scheme across all environments before you deploy anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualize your VPC
&lt;/h2&gt;

&lt;p&gt;Understanding your VPC architecture is much easier with a diagram. Take any of the Terraform snippets above, paste them into &lt;a href="https://dev.to/"&gt;InfraSketch&lt;/a&gt;, and you'll see the resources grouped by category — networking resources (VPC, subnets, IGW, NAT) in one group, compute (EKS, EC2) in another, databases (RDS) in a third.&lt;/p&gt;

&lt;p&gt;This visual grouping makes it immediately obvious whether your architecture follows the patterns described here — are databases in private subnets? Is there a NAT Gateway in each AZ? Is the ALB spanning multiple public subnets? A quick diagram answers these questions faster than reading through Terraform files.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  See your VPC architecture Paste your VPC Terraform code and visualize the network architecture instantly. InfraSketch now supports Route Tables, Transit Gateways, and VPN Gateways — &lt;a href="///blog/whats-new-april-2026.html"&gt;see what's new&lt;/a&gt;. &lt;a href="https://dev.to/"&gt;Generate VPC Diagram&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Related articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="///blog/whats-new-april-2026.html"&gt;What's New in InfraSketch — April 2026: Interactive Editor, GCP Support &amp;amp; More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/how-to-create-aws-architecture-diagrams.html"&gt;How to Create AWS Architecture Diagrams in 2026: A Complete Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="///blog/terraform-visualization-best-practices.html"&gt;Terraform Visualization: 5 Ways to See What Your Code Actually Builds&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>awsvpcarchitecture</category>
      <category>vpcdiagram</category>
      <category>vpcterraform</category>
      <category>awsnetworking</category>
    </item>
    <item>
      <title>What's New in InfraSketch — April 2026: Interactive Editor, GCP Support &amp; More</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Fri, 24 Apr 2026 00:04:37 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/whats-new-in-infrasketch-april-2026-interactive-editor-gcp-support-more-37gk</link>
      <guid>https://dev.to/pandey-raghvendra/whats-new-in-infrasketch-april-2026-interactive-editor-gcp-support-more-37gk</guid>
      <description>&lt;p&gt;This is a big update. We shipped an interactive drag-and-drop diagram editor, full GCP support across 23 resource types, new AWS networking resources that were previously missing from diagrams, a data zone visualization, and a round of UI polish across the board. Here's everything that changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive Diagram Editor
&lt;/h2&gt;

&lt;p&gt;The most requested feature since launch. After generating a diagram, click &lt;strong&gt;Edit&lt;/strong&gt; in the toolbar to enter interactive mode. In edit mode you can drag any node to reposition it — connection arrows update live as you drag, following both endpoints in real time.&lt;/p&gt;

&lt;p&gt;When you're happy with the layout, click &lt;strong&gt;Done&lt;/strong&gt; to lock it in. If you want to go back to the auto-generated layout at any point, click &lt;strong&gt;Reset Layout&lt;/strong&gt;. The original positions are always preserved.&lt;/p&gt;

&lt;p&gt;A few technical details worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dragging works correctly at any zoom level — the coordinate math accounts for the current zoom scale and pan offset, so nodes land exactly where you drop them regardless of how zoomed in or out you are.&lt;/li&gt;
&lt;li&gt;Clicking the diagram background deselects the current node.&lt;/li&gt;
&lt;li&gt;In edit mode, pan is disabled on nodes (so you can drag them) but still works on empty canvas areas.&lt;/li&gt;
&lt;li&gt;Exported PNG, SVG, and draw.io XML reflect your repositioned layout.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try the editor Generate any diagram and click &lt;strong&gt;Edit&lt;/strong&gt; in the toolbar to start repositioning nodes. &lt;a href="https://dev.to/"&gt;Open InfraSketch&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Full GCP Support
&lt;/h2&gt;

&lt;p&gt;InfraSketch now supports 23 Google Cloud resource types across all major categories, with official Google Cloud category icons in every diagram.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Terraform types&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;google_compute_network&lt;/code&gt;, &lt;code&gt;google_compute_subnetwork&lt;/code&gt;, &lt;code&gt;google_compute_firewall&lt;/code&gt;, &lt;code&gt;google_compute_router&lt;/code&gt;, &lt;code&gt;google_compute_address&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;google_compute_instance&lt;/code&gt;, &lt;code&gt;google_compute_instance_group&lt;/code&gt;, &lt;code&gt;google_compute_autoscaler&lt;/code&gt;, &lt;code&gt;google_container_cluster&lt;/code&gt;, &lt;code&gt;google_container_node_pool&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serverless&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;google_cloud_run_service&lt;/code&gt;, &lt;code&gt;google_cloud_run_v2_service&lt;/code&gt;, &lt;code&gt;google_cloudfunctions_function&lt;/code&gt;, &lt;code&gt;google_cloudfunctions2_function&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;google_sql_database_instance&lt;/code&gt;, &lt;code&gt;google_bigquery_dataset&lt;/code&gt;, &lt;code&gt;google_spanner_instance&lt;/code&gt;, &lt;code&gt;google_bigtable_instance&lt;/code&gt;, &lt;code&gt;google_firestore_document&lt;/code&gt;, &lt;code&gt;google_redis_instance&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;&lt;code&gt;google_storage_bucket&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;google_kms_key_ring&lt;/code&gt;, &lt;code&gt;google_secret_manager_secret&lt;/code&gt;, &lt;code&gt;google_service_account&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;google_pubsub_topic&lt;/code&gt;, &lt;code&gt;google_pubsub_subscription&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;google_monitoring_alert_policy&lt;/code&gt;, &lt;code&gt;google_logging_metric&lt;/code&gt;, &lt;code&gt;google_logging_project_sink&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GCP resources follow the same layout logic as AWS and Azure: VPC networks become containment boxes, subnets group their member resources, Pub/Sub lands in the Messaging zone, security resources cluster in the Security zone, and Load Balancer resources appear in the Ingress row.&lt;/p&gt;

&lt;p&gt;To try it, select the Terraform tab, load the &lt;strong&gt;Production GCP stack&lt;/strong&gt; example from the dropdown, and click Generate Diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  New AWS Networking Resources
&lt;/h2&gt;

&lt;p&gt;Four resource types that commonly appear in real-world Terraform configs were previously silently dropped from diagrams. They're now fully supported:&lt;/p&gt;

&lt;h4&gt;
  
  
  Route Tables
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;aws_route_table&lt;/code&gt;, &lt;code&gt;aws_route_table_association&lt;/code&gt;, &lt;code&gt;aws_main_route_table_association&lt;/code&gt; — placed in the Internet zone alongside the IGW they route through.&lt;/p&gt;

&lt;h4&gt;
  
  
  Transit Gateway
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;aws_transit_gateway&lt;/code&gt;, &lt;code&gt;aws_transit_gateway_attachment&lt;/code&gt;, &lt;code&gt;aws_transit_gateway_vpc_attachment&lt;/code&gt; — the hub for multi-VPC and hybrid connectivity.&lt;/p&gt;

&lt;h4&gt;
  
  
  VPN Gateway
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;aws_vpn_gateway&lt;/code&gt;, &lt;code&gt;aws_vpn_connection&lt;/code&gt;, &lt;code&gt;aws_customer_gateway&lt;/code&gt; — for site-to-site VPN connections to on-premises networks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Network Interfaces
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;aws_network_interface&lt;/code&gt;, &lt;code&gt;aws_network_interface_attachment&lt;/code&gt; — explicit ENI definitions, common in appliance and multi-homed instance configs.&lt;/p&gt;

&lt;p&gt;If you've been pasting real production Terraform configs and wondering why certain networking resources didn't appear — this is the fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Zone Visualization
&lt;/h2&gt;

&lt;p&gt;Database and storage resources — RDS, DynamoDB, ElastiCache, S3, Cloud SQL, BigQuery, Azure SQL, and all the others — now render inside a labelled &lt;strong&gt;DATA&lt;/strong&gt; zone box. Previously these resources appeared without any visual grouping, making it hard to distinguish the data tier from compute at a glance.&lt;/p&gt;

&lt;p&gt;The zone uses the same dashed-border pattern as the existing Internet, Messaging, and Security zones, keeping the visual language consistent across the diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Toast Notifications
&lt;/h2&gt;

&lt;p&gt;Every error and confirmation in InfraSketch previously used the browser's built-in &lt;code&gt;alert()&lt;/code&gt; dialog — a blocking modal that interrupts your flow and looks out of place in a dark-themed tool.&lt;/p&gt;

&lt;p&gt;All nine of those alerts are now in-page toast notifications that appear at the bottom of the screen. They dismiss automatically after a few seconds, or immediately on click. Errors are red, successes are green, and informational messages are muted. Parse errors also give you specific guidance now — if you paste &lt;code&gt;terraform plan&lt;/code&gt; text output instead of JSON, you'll see a message telling you to run &lt;code&gt;terraform show -json&lt;/code&gt; instead of a generic "no resources found".&lt;/p&gt;

&lt;h2&gt;
  
  
  UI Polish
&lt;/h2&gt;

&lt;p&gt;A set of smaller visual improvements that add up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate button gradient&lt;/strong&gt; — the flat green button is now a teal-to-blue gradient with a stronger glow on hover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node hover animation&lt;/strong&gt; — hovering a resource node now scales it up slightly (&lt;code&gt;scale(1.05)&lt;/code&gt;) with a green drop shadow, making the diagram feel interactive even in view mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code editor focus indicator&lt;/strong&gt; — a green left border appears when the editor textarea is focused, giving a clear active state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagram panel accent border&lt;/strong&gt; — the diagram panel now has a subtle green top border, visually distinguishing it from the editor panel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export toolbar separator&lt;/strong&gt; — a thin vertical divider separates the Share/Edit buttons from the format export buttons (PNG, SVG, draw.io), reducing visual noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit button default state&lt;/strong&gt; — the Edit button previously showed a permanent accent border even before any diagram existed. It now looks like any other export button and only lights up when edit mode is active.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature card hover&lt;/strong&gt; — homepage feature cards now pick up a subtle green background tint on hover alongside the existing lift animation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;A few things on the near-term roadmap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcuts&lt;/strong&gt; — &lt;code&gt;E&lt;/code&gt; for edit mode, &lt;code&gt;R&lt;/code&gt; for reset layout, &lt;code&gt;Escape&lt;/code&gt; to deselect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snap-to-grid in the editor&lt;/strong&gt; — hold Shift while dragging to snap nodes to a 16px grid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-select&lt;/strong&gt; — Shift-click to select multiple nodes and move them as a group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GCP zone grouping&lt;/strong&gt; — region and zone containment boxes for GCP, similar to how AWS diagrams show AZ grouping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudFormation support&lt;/strong&gt; — parsing &lt;code&gt;.yaml&lt;/code&gt; CloudFormation stacks as a new input format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If there's a specific resource type that's missing from your diagrams, or a workflow that doesn't work as expected, &lt;a href="///contact.html"&gt;open an issue or send a note&lt;/a&gt;. Real-world Terraform configs are the best test cases we have.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Try everything in your browser No account, no install. Paste your Terraform, plan JSON, Terragrunt, or docker-compose.yml and generate a diagram in seconds. &lt;a href="https://dev.to/"&gt;Open InfraSketch →&lt;/a&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

</description>
      <category>infrasketchupdate</category>
      <category>terraformdiagrameditor</category>
      <category>gcpterraformdiagram</category>
      <category>interactivearchitecturediagram</category>
    </item>
    <item>
      <title>"I built a free tool to generate AWS &amp; Azure architecture diagrams from Terraform — no signup needed"</title>
      <dc:creator>Raghvendra Pandey</dc:creator>
      <pubDate>Sat, 18 Apr 2026 19:37:33 +0000</pubDate>
      <link>https://dev.to/pandey-raghvendra/i-built-a-free-tool-to-generate-aws-architecture-diagrams-from-terraform-no-signup-no-e0o</link>
      <guid>https://dev.to/pandey-raghvendra/i-built-a-free-tool-to-generate-aws-architecture-diagrams-from-terraform-no-signup-no-e0o</guid>
      <description>&lt;p&gt;When someone asks "can you show me the architecture?", &lt;br&gt;
most DevOps engineers groan internally.&lt;/p&gt;

&lt;p&gt;Not because the architecture is complicated — because &lt;br&gt;
drawing it is. You open draw.io, spend 45 minutes dragging &lt;br&gt;
boxes, and by the time you share it, someone has already &lt;br&gt;
changed the infrastructure.&lt;/p&gt;

&lt;p&gt;Existing automated tools like Cloudcraft want $49/month &lt;br&gt;
&lt;strong&gt;and&lt;/strong&gt; read access to your AWS account. That's a non-starter &lt;br&gt;
for most individual engineers and small teams.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;InfraSketch&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Paste your Terraform HCL or docker-compose.yml → get a &lt;br&gt;
clean architecture diagram instantly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parses 25+ AWS resource types&lt;/li&gt;
&lt;li&gt;Detects relationships between resources automatically&lt;/li&gt;
&lt;li&gt;Groups by category (Networking, Compute, Database, 
Storage, Load Balancing, Messaging, Security)&lt;/li&gt;
&lt;li&gt;Uses official AWS Architecture icons&lt;/li&gt;
&lt;li&gt;Export as PNG, SVG, or draw.io file&lt;/li&gt;
&lt;li&gt;100% client-side — your code never leaves your browser&lt;/li&gt;
&lt;li&gt;No signup, no cloud credentials, completely free&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e8f7u49beuldl7hhaow.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e8f7u49beuldl7hhaow.gif" alt=" " width="720" height="332"&gt;&lt;/a&gt;&lt;br&gt;
The tool does static analysis of your HCL code using a &lt;br&gt;
custom JavaScript parser. It extracts resource type and &lt;br&gt;
name from each &lt;code&gt;resource&lt;/code&gt; block, detects cross-references &lt;br&gt;
between resources, groups them visually by category, and &lt;br&gt;
renders the diagram as SVG with official AWS icons.&lt;/p&gt;

&lt;p&gt;Everything runs in your browser. There is no backend server.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it with this example
&lt;/h2&gt;

&lt;p&gt;Paste this into InfraSketch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_vpc"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cidr_block&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;cidr_block&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_internet_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"gw"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lb"&lt;/span&gt; &lt;span class="s2"&gt;"app"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-alb"&lt;/span&gt;
  &lt;span class="nx"&gt;load_balancer_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"application"&lt;/span&gt;
  &lt;span class="nx"&gt;subnets&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_eks_cluster"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;
  &lt;span class="nx"&gt;role_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;subnet_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"eks"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eks-role"&lt;/span&gt;
  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_db_instance"&lt;/span&gt; &lt;span class="s2"&gt;"db"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;identifier&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod-db"&lt;/span&gt;
  &lt;span class="nx"&gt;engine&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"postgres"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"db.t3.medium"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"assets"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"my-app-assets"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_sqs_queue"&lt;/span&gt; &lt;span class="s2"&gt;"events"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"event-queue"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see VPC, subnet, IGW, ALB, EKS, IAM, RDS, S3, and &lt;br&gt;
SQS — all grouped, connected, and rendered with official &lt;br&gt;
AWS icons.&lt;/p&gt;

&lt;h2&gt;
  
  
  The draw.io export
&lt;/h2&gt;

&lt;p&gt;One feature people find particularly useful — after &lt;br&gt;
generating the diagram you can export it as a draw.io file. &lt;br&gt;
This means InfraSketch generates the base structure &lt;br&gt;
automatically, then you open it in diagrams.net and &lt;br&gt;
customize it for presentations or documentation. Best of &lt;br&gt;
both worlds.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CloudFormation template support&lt;/li&gt;
&lt;li&gt;Kubernetes manifest visualization
&lt;/li&gt;
&lt;li&gt;Azure and GCP resource icons&lt;/li&gt;
&lt;li&gt;Terragrunt support (top community request already!)&lt;/li&gt;
&lt;li&gt;Better connection routing and layout engine&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tool: &lt;a href="https://infrasketch.cloud" rel="noopener noreferrer"&gt;infrasketch.cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/pandey-raghvendra/infrasketch" rel="noopener noreferrer"&gt;pandey-raghvendra/infrasketch&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built by a DevOps/SRE engineer with 9 years of production &lt;br&gt;
experience, frustrated by the same problem you probably &lt;br&gt;
have. Feedback and contributions welcome.&lt;/p&gt;

&lt;p&gt;What resource types or features would you like to see next?&lt;br&gt;
If this saved you time, drop a ❤️ — it helps others find it.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
      <category>aws</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
