| name | azure-diagrams |
| description | Azure architecture diagram generation skill for high-quality, non-Mermaid outputs. Produces deterministic Python `diagrams` + Graphviz artifacts (`.py` + `.png`/`.svg`) for design and as-built documentation. Use for Step 3 and Step 7 architecture visuals, dependency visuals, and topology diagrams with enforced layout and naming conventions. |
| compatibility | Requires graphviz system package and Python diagrams library; works with Claude Code, GitHub Copilot, VS Code, and any Agent Skills compatible tool. |
| license | MIT |
| metadata | {"author":"cmb211087","version":"4.0","repository":"https://github.com/mingrammer/diagrams"} |
Azure Architecture Diagrams Skill
A comprehensive technical diagramming toolkit for solutions architects, presales engineers,
and developers. Generate professional diagrams for proposals, documentation, and architecture
reviews using Python's diagrams library.
šÆ Output Format
Default behavior: Generate PNG images via Python code
| Format | File Extension | Tool | Use Case |
|---|
| Python PNG | .py + .png | diagrams library | Programmatic, version-controlled, CI |
| SVG | .svg | diagrams library | Web documentation (optional) |
Output Naming Convention
agent-output/{project}/
āāā 03-des-diagram.py # Python source (version controlled)
āāā 03-des-diagram.png # PNG from Python diagrams
āāā 07-ab-diagram.py/.png # As-built diagrams
ā” Execution Method
Always save diagram source to file first, then execute it:
python3 agent-output/{project}/03-des-diagram.py
python3 agent-output/{project}/07-ab-diagram.py
Required workflow:
- ā
Generate and save
.py source in agent-output/{project}/
- ā
Execute saved script to produce
.png (and optional .svg)
- ā
Keep source version-controlled for deterministic regeneration
- ā
Never use inline heredoc execution for diagram generation
š Architecture Diagram Contract (Mandatory)
For Azure workflow artifacts, generate non-Mermaid diagrams using Python diagrams only.
Required outputs
03-des-diagram.py + 03-des-diagram.png (Step 3)
04-dependency-diagram.py + 04-dependency-diagram.png (Step 4)
04-runtime-diagram.py + 04-runtime-diagram.png (Step 4)
07-ab-diagram.py + 07-ab-diagram.png (Step 7, when requested)
Required naming conventions
- Cluster vars:
clu_<scope>_<slug> where scope ā sub|rg|net|tier|zone|ext
- Node vars:
n_<domain>_<service>_<role> where domain ā edge|web|app|data|id|sec|ops|int
- Edge vars (if reused):
e_<source>_to_<target>_<flow>
- Flow taxonomy only:
auth|request|response|read|write|event|replicate|secret|telemetry|admin
Required layout/style defaults
direction="LR" unless explicitly justified
- deterministic spacing via
graph_attr (nodesep, ranksep, splines)
- short labels (2ā4 words)
- max 3 edge styles (runtime/control/observability)
Quality gate (score /10)
- Readable at 100% zoom
- No major label overlap
- Minimal line crossing
- Clear tier grouping
- Correct Azure icons
- Security boundary visible
- Data flow direction clear
- Identity/auth flow visible
- Telemetry path visible
- Naming conventions followed
If score < 9/10, regenerate once with simplification.
š„ Generate from Infrastructure Code
Create diagrams directly from Bicep, Terraform, or ARM templates:
Read the Bicep files in /infra and generate an architecture diagram
Analyze our Terraform modules and create a diagram grouped by subnet
See references/iac-to-diagram.md for detailed prompts and examples.
Prerequisites
pip install diagrams matplotlib pillow
apt-get install -y graphviz
Quick Start
from diagrams import Diagram, Cluster, Edge
from diagrams.azure.compute import FunctionApps, KubernetesServices, AppServices
from diagrams.azure.network import ApplicationGateway, LoadBalancers
from diagrams.azure.database import CosmosDb, SQLDatabases, CacheForRedis
from diagrams.azure.storage import BlobStorage
from diagrams.azure.integration import LogicApps, ServiceBus, APIManagement
from diagrams.azure.security import KeyVaults
from diagrams.azure.identity import ActiveDirectory
from diagrams.azure.ml import CognitiveServices
with Diagram("Azure Solution Architecture", show=False, direction="TB"):
users = ActiveDirectory("Users")
with Cluster("Frontend"):
gateway = ApplicationGateway("App Gateway")
web = AppServices("Web App")
with Cluster("Backend"):
api = APIManagement("API Management")
functions = FunctionApps("Functions")
aks = KubernetesServices("AKS")
with Cluster("Data"):
cosmos = CosmosDb("Cosmos DB")
sql = SQLDatabases("SQL Database")
redis = CacheForRedis("Redis Cache")
blob = BlobStorage("Blob Storage")
with Cluster("Integration"):
bus = ServiceBus("Service Bus")
logic = LogicApps("Logic Apps")
users >> gateway >> web >> api
api >> [functions, aks]
functions >> [cosmos, bus]
aks >> [sql, redis]
bus >> logic >> blob
Azure Service Categories
| Category | Import | Key Services |
|---|
| Compute | diagrams.azure.compute | VM, AKS, Functions, App Service, Container Apps, Batch |
| Networking | diagrams.azure.network | VNet, Load Balancer, App Gateway, Front Door, Firewall, ExpressRoute |
| Database | diagrams.azure.database | SQL, Cosmos DB, PostgreSQL, MySQL, Redis, Synapse |
| Storage | diagrams.azure.storage | Blob, Files, Data Lake, NetApp, Queue, Table |
| Integration | diagrams.azure.integration | Logic Apps, Service Bus, Event Grid, APIM, Data Factory |
| Security | diagrams.azure.security | Key Vault, Sentinel, Defender, Security Center |
| Identity | diagrams.azure.identity | Entra ID, B2C, Managed Identity, Conditional Access |
| AI/ML | diagrams.azure.ml | Azure OpenAI, Cognitive Services, ML Workspace, Bot Service |
| Analytics | diagrams.azure.analytics | Synapse, Databricks, Data Explorer, Stream Analytics, Event Hubs |
| IoT | diagrams.azure.iot | IoT Hub, IoT Edge, Digital Twins, Time Series Insights |
| DevOps | diagrams.azure.devops | Azure DevOps, Pipelines, Repos, Boards, Artifacts |
| Web | diagrams.azure.web | App Service, Static Web Apps, CDN, Media Services |
| Monitor | diagrams.azure.monitor | Monitor, App Insights, Log Analytics |
See references/azure-components.md for the complete list of 700+ components.
Common Architecture Patterns
Web Application (3-Tier)
from diagrams.azure.network import ApplicationGateway
from diagrams.azure.compute import AppServices
from diagrams.azure.database import SQLDatabases
gateway >> AppServices("Web") >> SQLDatabases("DB")
Microservices with AKS
from diagrams.azure.compute import KubernetesServices, ContainerRegistries
from diagrams.azure.network import ApplicationGateway
from diagrams.azure.database import CosmosDb
gateway >> KubernetesServices("Cluster") >> CosmosDb("Data")
ContainerRegistries("Registry") >> KubernetesServices("Cluster")
Serverless / Event-Driven
from diagrams.azure.compute import FunctionApps
from diagrams.azure.integration import EventGridTopics, ServiceBus
from diagrams.azure.storage import BlobStorage
EventGridTopics("Events") >> FunctionApps("Process") >> ServiceBus("Queue")
BlobStorage("Trigger") >> FunctionApps("Process")
Data Platform
from diagrams.azure.analytics import DataFactories, Databricks, SynapseAnalytics
from diagrams.azure.storage import DataLakeStorage
DataFactories("Ingest") >> DataLakeStorage("Lake") >> Databricks("Transform") >> SynapseAnalytics("Serve")
Hub-Spoke Networking
from diagrams.azure.network import VirtualNetworks, Firewall, VirtualNetworkGateways
with Cluster("Hub"):
firewall = Firewall("Firewall")
vpn = VirtualNetworkGateways("VPN")
with Cluster("Spoke 1"):
spoke1 = VirtualNetworks("Workload 1")
spoke1 >> firewall
Connection Syntax
a >> b
a >> b >> c
a >> [b, c, d]
[a, b] >> c
a >> Edge(label="HTTPS") >> b
a >> Edge(label="443") >> b
a >> Edge(style="dashed") >> b
a >> Edge(style="dotted") >> b
a >> Edge(color="red") >> b
a >> Edge(color="red", style="bold") >> b
a >> Edge(label="sync") << b
a - Edge(label="peer") - b
Diagram Attributes
with Diagram(
"Title",
show=False,
filename="output",
direction="TB",
outformat="png",
graph_attr={
"splines": "spline",
"nodesep": "1.0",
"ranksep": "1.0",
"pad": "0.5",
"bgcolor": "white",
"dpi": "150",
}
):
Clusters (Azure Hierarchy)
Use Cluster() for proper Azure hierarchy: Subscription ā Resource Group ā VNet ā Subnet
with Cluster("Azure Subscription"):
with Cluster("rg-app-prod"):
with Cluster("vnet-spoke (10.1.0.0/16)"):
with Cluster("snet-app"):
vm1 = VM("VM 1")
vm2 = VM("VM 2")
with Cluster("snet-data"):
db = SQLDatabases("Database")
Cluster styling:
with Cluster("Styled", graph_attr={"bgcolor": "#E8F4FD", "style": "rounded"}):
ā ļø Professional Output Standards
The Key Setting: labelloc='t'
To keep labels inside cluster boundaries, put labels ABOVE icons:
node_attr = {
"fontname": "Arial Bold",
"fontsize": "11",
"labelloc": "t",
}
with Diagram("Title", node_attr=node_attr, ...):
Full Professional Template
from diagrams import Diagram, Cluster, Edge
from diagrams.azure.compute import KubernetesServices
from diagrams.azure.database import SQLDatabases
graph_attr = {
"bgcolor": "white",
"pad": "0.8",
"nodesep": "0.9",
"ranksep": "0.9",
"splines": "spline",
"fontname": "Arial Bold",
"fontsize": "16",
"dpi": "150",
}
node_attr = {
"fontname": "Arial Bold",
"fontsize": "11",
"labelloc": "t",
}
cluster_style = {"margin": "30", "fontname": "Arial Bold", "fontsize": "14"}
with Diagram("My Architecture",
direction="TB",
graph_attr=graph_attr,
node_attr=node_attr):
with Cluster("Data Tier", graph_attr=cluster_style):
sql = SQLDatabases("sql-myapp-prod\nS3 tier")
Professional Standards Checklist
| Check | Requirement |
|---|
| ā
labelloc='t' | Labels above icons (stays in clusters) |
| ā
Bold fonts | fontname="Arial Bold" for readability |
| ā
Full resource names | Actual names from IaC, not abbreviations |
| ā
High DPI | dpi="150" or higher for crisp text |
| ā
Azure icons | Use diagrams.azure.* components |
| ā
Cluster margins | margin="30" or higher |
| ā
CIDR blocks | Include IP ranges in VNet/Subnet labels |
Troubleshooting
Overlapping Nodes
Increase spacing for complex diagrams:
graph_attr={
"nodesep": "1.2",
"ranksep": "1.2",
"pad": "0.5"
}
Labels Outside Clusters
Use labelloc="t" in node_attr to place labels above icons.
Missing Icons
Check available icons:
from diagrams.azure import network
print(dir(network))
See references/preventing-overlaps.md for detailed guidance.
Scripts
| Script | Purpose |
|---|
scripts/generate_diagram.py | Interactive pattern generator |
scripts/multi_diagram_generator.py | Multi-type diagram generator |
scripts/ascii_to_diagram.py | Convert ASCII diagrams from markdown |
scripts/verify_installation.py | Check prerequisites |
Reference Files
| File | Content |
|---|
references/iac-to-diagram.md | Generate diagrams from Bicep/Terraform/ARM |
references/azure-components.md | Complete list of 700+ Azure components |
references/common-patterns.md | Ready-to-use architecture patterns |
references/business-process-flows.md | Workflow and swimlane diagrams |
references/entity-relationship-diagrams.md | Database ERD patterns |
references/timeline-gantt-diagrams.md | Project timeline diagrams |
references/ui-wireframe-diagrams.md | UI mockup patterns |
references/preventing-overlaps.md | Layout troubleshooting guide |
references/sequence-auth-flows.md | Authentication flow patterns |
references/quick-reference.md | Copy-paste code snippets |
Workflow Integration
This skill produces artifacts in Step 3 (design) or Step 7 (as-built).
| Workflow Step | File Pattern | Description |
|---|
| Step 3 (Design) | 03-des-diagram.py, 03-des-diagram.png | Proposed architecture visualization |
| Step 7 (As-Built) | 07-ab-diagram.py, 07-ab-diagram.png | Deployed architecture documentation |
Artifact Suffix Convention
Apply the appropriate suffix based on when the diagram is generated:
Suffix Rules:
- Design/proposal/planning language ā use
-des
- Deployed/implemented/current state language ā use
-ab
Generation Workflow
Follow these steps when creating diagrams:
- Gather Context - Read Bicep templates, deployment summary, or architecture assessment
- Identify Resources - List all Azure resources to visualize
- Determine Hierarchy - Map Subscription ā RG ā VNet ā Subnet structure
- Generate Python Code - Create diagram with proper clusters and edges
- Execute Script - Run Python to generate PNG
- Verify Output - Confirm PNG file was created successfully
Guardrails
DO
- ā
Create diagram files in
agent-output/{project}/
- ā
Use step-prefixed filenames (
03-des-* or 07-ab-*)
- ā
Use valid
diagrams.azure.* imports only
- ā
Include docstring with prerequisites and generation command
- ā
Match diagram to actual architecture design/deployment
- ā
Use
Cluster() for Azure hierarchy (Subscription ā RG ā VNet ā Subnet)
- ā
Include CIDR blocks in VNet/Subnet labels
- ā
ALWAYS execute the Python script to generate the PNG file
- ā
Verify PNG file exists after generation
DO NOT
- ā Use invalid or made-up diagram node types
- ā Create diagrams that don't match the actual architecture
- ā Skip the PNG generation step
- ā Overwrite existing diagrams without user consent
- ā Output to legacy
docs/diagrams/ folder (use agent-output/ instead)
- ā Leave diagram in Python-only state without generating PNG
- ā Use placeholder or generic names instead of actual resource names
What This Skill Does NOT Do
- ā Generate Bicep or Terraform code (use
bicep-code agent)
- ā Create workload documentation (use
azure-artifacts skill)
- ā Deploy resources (use
deploy agent)
- ā Create ADRs (use
azure-adr skill)
- ā Perform WAF assessments (use
architect agent)