kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Python コードでアーキテクチャ図を生成できる Diagrams がめっちゃ便利!

「Diagrams」を使うと Python コードでアーキテクチャ図を生成できる.サポートされているアイコンセットがとても多く AWS や Google Cloud や Microsoft Azure もあれば,Kubernetes やプログラミング言語なども使える.試してみたけどめちゃくちゃ便利!まさに Diagram as Code だ✌️

diagrams.mingrammer.com

セットアップ

「Diagrams」Graphviz に依存しているため,macOS だと pipbrew ですぐにセットアップできる.

$ pip install diagrams
$ brew install graphviz

試してみた

さっそく Examples を参考にアーキテクチャ図を作ってみた!

サンプル : AWS

from diagrams import Cluster, Diagram
from diagrams.aws.compute import EC2, EC2AutoScaling, Lambda
from diagrams.aws.database import Aurora
from diagrams.aws.integration import SQS
from diagrams.aws.network import ALB, Route53
from diagrams.aws.storage import S3

with Diagram('AWS Architecture'):
    route53 = Route53('Route 53')

    alb = ALB('ALB')

    with Cluster('EC2 Auto Scaling'):
        instances = [
            EC2('Instance'),
            EC2('Instance'),
            EC2('Instance')
        ]

    aurora = Aurora('Aurora')

    sqs = SQS('SQS')

    function = Lambda('Lambda')

    s3 = S3('S3')

    route53 >> alb >> instances
    instances >> aurora
    instances >> sqs >> function >> s3

サンプル : Kubernetes

from diagrams import Cluster, Diagram
from diagrams.k8s.compute import Deployment, Pod, ReplicaSet
from diagrams.k8s.network import Ingress, Service
from diagrams.k8s.podconfig import ConfigMap

with Diagram('Kubernetes Architecture'):
    ingress = Ingress('Ingress')

    service = Service('Service')

    with Cluster(''):
        pods = [
            Pod('pod'),
            Pod('pod'),
            Pod('pod')
        ]

    replicaset = ReplicaSet('ReplicaSet')

    deployment =  Deployment('Deployment')

    configmap = ConfigMap('ConfigMap')

    ingress >> service >> pods << replicaset <<  deployment << configmap

サンプル : アプリケーション

from diagrams import Cluster, Diagram
from diagrams.programming.framework import React
from diagrams.programming.language import Go, Java
from diagrams.onprem.database import MySQL, PostgreSQL

with Diagram('SPA Architecture'):
    frontend = React('Frontend')

    with Cluster('Service A'):
        frontend >>  Go('Go API') >> MySQL('MySQL')

    with Cluster('Service B'):
        frontend >> Java('Java API') >> PostgreSQL('PostgreSQL')