python Technology

Diagrams のコード構成を理解する

前回インストールから例を実行するところまで実施しましたが、
コード構成がどうなっているのか深掘りしてみます

Diagrams

Diagrams 基本

サンプルコードの基本の説明は以下です

  • from diagrams import Diagram →基本モジュールインポートでDiagramsはこれ必須
  • EC2("web") → EC2でモジュール名を指定、("web")はそのダイアグラムの名前指定

  • サンプルコード

    from diagrams import Diagram
    from diagrams.aws.compute import EC2
    
    with Diagram("Simple Diagram"):
        EC2("web")
  • 結果

Diagrams オプション

サンプルコードのオプションは以下です。

  • filename="my_diagram" →出力ファイル名を指定できる
  • outformat="jpg" → 出力ファイル形式(png、jpg、svg、pdf、デフォルトはpng) を指定できる
  • show=False →デフォルト(show=true)でコマンド実行すると自動で出力ファイルが開くが、Falseで無効にできる

    from diagrams import Diagram
    from diagrams.aws.compute import EC2
    
    with Diagram("Simple Diagram", filename="my_diagram", outformat="jpg", show=False):
        EC2("web")

Nodes

Nodes基本

Nodesオブジェクトは、provider、resource type、およびnameの 3 つの部分で構成されます。

サンプルコードの from diagrams.aws.compute import EC2

  • aws が provided
  • compute が resource type
  • EC2 が Name

となります。

  • サンプルコード ※EC2オブジェクトの詳細はここ参照

    from diagrams import Diagram
    from diagrams.aws.compute import EC2
    
    with Diagram("Simple Diagram"):
        EC2("web")

また、provided、resource typeが同じであれば、

    from diagrams.aws.network import ELB, Route53, VPC

のよに複数指定することも可能みたいです。

Data Flow

データ フローをは以下記号を使います。

  • 「>> 」→ ノードを左から右方向に接続
  • 「<< 」→ ノードを右から左方向に接続
  • 「 - 」→ ノードを無方向に接続

  • サンプルコード

    from diagrams import Diagram
    from diagrams.aws.compute import EC2
    from diagrams.aws.database import RDS
    from diagrams.aws.network import ELB
    from diagrams.aws.storage import S3
    
    with Diagram("Web Services", show=False):
        ELB("lb") >> EC2("web") >> RDS("userdb") >> S3("store")
        ELB("lb") >> EC2("web") >> RDS("userdb") << EC2("stat")
        (ELB("lb") >> EC2("web")) - EC2("web") >> RDS("userdb")
  • 結果 ※レンダリングされた図の順序は、宣言の順序の逆

データフローの方向は、direction(デフォルトはLR)で変更でき、設定できる値は以下

  • TB (Big-Endian):上から下の順
  • BT (Little-Endian):下から上の順
  • LR (Left-to-Right):左から右への順
  • RL (Right-to-Left):右から左への順

  • サンプルコード

    from diagrams import Diagram
    from diagrams.aws.compute import EC2
    from diagrams.aws.database import RDS
    from diagrams.aws.network import ELB
    
    with Diagram("Workers", show=False, direction="TB"):
        lb = ELB("lb")
        db = RDS("events")
        lb >> EC2("worker1") >> db
        lb >> EC2("worker2") >> db
        lb >> EC2("worker3") >> db
        lb >> EC2("worker4") >> db
        lb >> EC2("worker5") >> db
  • 結果

Group Data Flow

すべてのノードが一度に他のノードに接続されるように、ノードをリストにグループ化できます。
グループ化は、[XX,XX,]のようにします。

  • サンプルコード

    from diagrams import Diagram
    from diagrams.aws.compute import EC2
    from diagrams.aws.database import RDS
    from diagrams.aws.network import ELB
    
    with Diagram("Grouped Workers", show=False, direction="TB"):
        ELB("lb") >> [EC2("worker1"),
                      EC2("worker2"),
                      EC2("worker3"),
                      EC2("worker4"),
                      EC2("worker5")] >> RDS("events")

Clusters

Clustersを使用すると、分離されたグループ内のノードをグループ化 (またはクラスター化) できる

Clusters 基本

Cluster クラスを使用してクラスター コンテキストを作成できます。
また、クラスター内のノードをクラスター外の他のノードに接続することもできます

  • サンプルコード

    from diagrams import Cluster, Diagram
    from diagrams.aws.compute import ECS
    from diagrams.aws.database import RDS
    from diagrams.aws.network import Route53
    
    with Diagram("Simple Web Service with DB Cluster", show=False):
        dns = Route53("dns")
        web = ECS("service")
    
        with Cluster("DB Cluster"):
            db_primary = RDS("primary")
            db_primary - [RDS("replica1"),
                         RDS("replica2")]
    
        dns >> web >> db_primary
  • 結果

Nested Clusters

Clusters をネストすることも可能です。

例えば、AWSのよくある構成とかだと、以下コードになります。
※AWSのAZの良い表現は模索中。。

  • サンプルコード

    from diagrams import Cluster, Diagram, Edge
    from diagrams.aws.general import Users, InternetGateway
    from diagrams.aws.compute import EC2
    from diagrams.aws.database import RDS
    from diagrams.aws.network import ELB, Route53, VPC
    from diagrams.aws.storage import S3
    from diagrams.aws.management import Cloudwatch
    
    with Diagram("アーキテクチャ図", filename="sample", direction="TB"):
            with Cluster("AWS"):
                    with Cluster("VPC"):
                            with Cluster("Public Subnet"):
                                    Public = [EC2("EC2e"),
                                            EC2("EC2f"),
                                            EC2("EC2g")]
                            with Cluster("Private Subnet EC2"):
                                    PrivateEC = [EC2("EC2a"),
                                            EC2("EC2b"),
                                            EC2("EC2c")]
                            with Cluster("Private Subnet RDS"):
                                    PrivateRDS = RDS("RDS")
                            LBPublic = ELB("Public LB")
                            LBPrivate = ELB("Private LB")
    
                            IGW = InternetGateway("InternetGateway")
                    Route53 = Route53("Route53")
                    S3 = S3("S3")
                    Cloudwatch = Cloudwatch("Cloudwatch")
    
            Users("Users") - IGW   - LBPublic >> Public
            Public >> LBPrivate >> PrivateEC
            PrivateEC >> PrivateRDS
  • 結果

Edges

Edge は、ノード間の接続を表すオブジェクト(先のスタイル)を設定できます

Edgeは、以下3 つの属性があります。

  • label → Edge(label="ここがラベル") のようなフォーマット
  • color → Edge(color="firebrick") のようなフォーマット ※詳細はここを参照
  • style → Edge(style="dashed") のようなフォーマット ※指定できる値はここを参照

利用するには、モジュールで from diagrams import Diagram, Edge のようにEdgeを指定する必要があります。

from diagrams import Cluster, Diagram, Edge
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB
from diagrams.aws.storage import S3

with Diagram("Edge Diagram", show=False):
ELB("lb") >> EC2("web") 
ELB("lb") >> Edge(color="blue", style="dashed") >> EC2("web") 
ELB("lb") >> Edge(color="black", style="bold") >> EC2("web") 
ELB("lb") >> Edge(color="red",label="ここらべる")  >> EC2("web") 
  • 結果

人気記事

1

Kubernetes kubectl rollout コマンドでdeploymentをロールバックしてみる 概要 kubectl rollout コマンドでデプロイ履歴を確認してロールバックするやり方 ...

2

  terraformのバージョン管理どうすればいいのか? terraformの複数バージョンを簡単に動かしたい terraformのインストール方法が分からない と、疑問を抱えている人の疑 ...

3

本記事では どんな環境にterraformをインストールできるの? terraformのインストールどうしたらいいの? terraformのどのバージョンをインストールすればいいの? と、困っている人 ...

4

Kubernetes kubectl version コマンドでバージョンを調べてみる 概要 kubectl version は、Kubernetes の Client、Serverのバージョンを確認 ...

-python, Technology