Closed14

Diagramsを使い、コードで構成図を作成する練習

not75743not75743

コード

from diagrams import Diagram
from diagrams.onprem.client import Client

with Diagram('test'):
    Client('mypc')

できたもの

ポイント

  • オンプレミスプロバイダのClientNodeとして表示している
  • mypcという名前をつけている。
not75743not75743

コード

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.onprem.client import Client

with Diagram('test'):
    server = EC2('server')
    Client('PC1') >> server
    Client('PC2') >> server
    Client('PC3') >> server

できたもの

ポイント

複数→単体の図示も可能

not75743not75743

コード

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.onprem.client import Client

with Diagram('test'):
    server = EC2('server')
    [
        Client("PC1"),
        Client("PC2"),
        Client("PC3")
    ] >> server

できたもの(1つ前と同じ)

ポイント

グループ化し、コードをシンプルにできる

not75743not75743

コード

from diagrams import Cluster, Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.onprem.client import Client

with Diagram('test', show=False):
    client      = Client('Client')

    with Cluster('Web3Tier'):
        webserver   = EC2('web')
        appserver   = EC2('app')
        dbserver    = RDS('db')
        webserver - appserver - dbserver

    client >> webserver
    webserver >> client

できたもの

ポイント

  • Clusterクラスを使用し、複数のNodeをまとめることができる。
    • Cluster内で使用するNodeの定義はcluster内で実施する必要がある
not75743not75743

コード

from diagrams import Cluster, Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.onprem.client import Client

with Diagram('test', show=False, direction="LR"):
    with Cluster('flow'):
        client      = Client('Client')
        with Cluster('Web3Tier'):
            webserver   = EC2('web')
            appserver   = EC2('app')
            dbserver    = RDS('db')
            
    webserver - appserver - dbserver
    client >> webserver
    webserver >> client

できたもの

ポイント

Clusterはネストさせることができます。
以下qiita記事をとても参考にさせていただきました。
https://qiita.com/suo-takefumi/items/e070c09ce6541e614930

not75743not75743

コード(動作しません)

from diagrams import Cluster, Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.onprem.client import Client

with Diagram('test', show=False, direction="LR"):
    client      = Client('Client')
    dbserver    = RDS('db1')

    with Cluster('web'):
        webservers = [
            EC2('web1'),
            EC2('web2'),
            EC2('web3')
        ]

    with Cluster('app'):
        appservers = [
            EC2('app1'),
            EC2('app2'),
            EC2('app3')
        ]
            
    client >> webservers >> appservers >> dbserver
    webservers >> client

できたもの

なし

エラーメッセージ

Traceback (most recent call last):
  File "/code/test.py", line 24, in <module>
    client >> webservers >> appservers >> dbserver
    ~~~~~~~~~~~~~~~~~~~~~^^~~~~~~~~~~~
TypeError: unsupported operand type(s) for >>: 'list' and 'list'

ポイント

ClusterからClusterへ矢印を引くのは無理みたいです。
graphvizのドキュメント見れば頑張ればできそう?今後に期待
https://tech.gunosy.io/entry/diagram_as_code

not75743not75743

コード

from diagrams import Cluster, Diagram, Edge
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.onprem.client import Client

with Diagram('test', show=False):
    client      = Client('Client')

    with Cluster('Web3Tier'):
        webserver   = EC2('web')
        appserver   = EC2('app')
        dbserver    = RDS('db')
        webserver - appserver - dbserver

    client >> Edge(color="firebrick", style="dashed") >>webserver
    webserver >> Edge(color="green1", style="bold") >> client

できたもの

ポイント

Edgeを使うことでNode間のコネクション(線)を設定できます。
設定できるものはgraphvizのドキュメントを参照
https://graphviz.org/docs/edges/

not75743not75743

練習として、ECSで立てているgrowiの構成図を書いてみます

コード

from diagrams import Cluster, Diagram, Edge
from diagrams.aws.compute import ECS
from diagrams.aws.network import ElbApplicationLoadBalancer
from diagrams.aws.storage import SimpleStorageServiceS3
from diagrams.elastic.elasticsearch import Elasticsearch
from diagrams.onprem.client import Client
from diagrams.onprem.database import Mongodb

with Diagram('growi-develop', show=False):
    client = Client('client')

    with Cluster('AWS'):
        s3bucket = SimpleStorageServiceS3('growi-bucket')

        with Cluster('public subnet'): 
            ALB     = ElbApplicationLoadBalancer('ALB') 

        with Cluster('private subnet'): 
            growi = ECS('growi')
            with Cluster('growi backend'): 
                Mongo = Mongodb('mongodb')
                Elastic = Elasticsearch('elasticsearch')


    client >> ALB >> growi
    growi >> Mongo
    growi >> Elastic
    growi >> s3bucket

    ALB >> client

できたもの

所感

割とよさげ
サブネットの色分けなどはできていませんが、簡単な図ならよいですね

not75743not75743

注意点① 配置が自由に決められない

コード

from diagrams import Cluster, Diagram, Edge
from diagrams.aws.compute import ECS
from diagrams.aws.management import SystemsManager
from diagrams.aws.network import ElbApplicationLoadBalancer, Route53
from diagrams.aws.storage import SimpleStorageServiceS3
from diagrams.elastic.elasticsearch import Elasticsearch
from diagrams.onprem.client import Client
from diagrams.onprem.database import Mongodb

with Diagram('growi-develop', show=False):
    client = Client('client')

    with Cluster('AWS'):
        s3bucket = SimpleStorageServiceS3('growi-bucket')
        SystemsManager()
        Route53()

        with Cluster('public subnet'): 
            ALB     = ElbApplicationLoadBalancer('ALB') 

        with Cluster('private subnet'): 
            growi = ECS('growi')
            with Cluster('growi backend'): 
                Mongo = Mongodb('mongodb')
                Elastic = Elasticsearch('elasticsearch')


    client >> ALB >> growi
    growi >> Mongo
    growi >> Elastic
    growi >> s3bucket

    ALB >> client

できたもの

ポイント

うーん、S3やsystems managerなどはグローバルリソースとして揃えたい気持ちがある...
を叶えたい場合、ドキュメントを読んで頑張る必要があります。本格的な構成図は難しいかも...

not75743not75743

注意点② ドキュメントに記載がない場合、graphvizのドキュメントを漁る必要がある

https://graphviz.org/

凝った図を書こうとすると、graphvizのドキュメントを読む必要があります。
その場合手動作成に軍配が上がるかもしれません。diagrams.net簡単だし

not75743not75743

まとめ

簡単な図を書くのにとても便利でした。
またコードベースのためCIで自動生成などができるのがとても大きいです。

使い方も難しく無いため、日常で使ってなれてみる

このスクラップは2023/01/29にクローズされました