継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Python でクラウドの構成図を作ろう!『Diagrams』でね

タダです.

皆さん,普段システムの構成図ってどうやって管理していますか?ExcelPowerPoint,専用のツールを使われていたり色々な方法で管理されているのですが,以前 PlantUML の形式で作図できる「AWS-PlantUML」を紹介させてもらいました.

sadayoshi-tada.hatenablog.com

今回も同じコードでの作図ですが Python で記述できるツールの「Diagrams」を紹介します.

github.com

Diagrams の概要

Diagrams」は Pythonクラウドサービスのアーキテクチャを作図するツールです.「Diagrams」では AWS のほか,Azure,GCP,Alibaba,Oracle Cloud のアイコンに対応しています.

diagrams.mingrammer.com

diagrams.mingrammer.com

diagrams.mingrammer.com

diagrams.mingrammer.com

diagrams.mingrammer.com

このツールのメリットは,コードで構成図を管理するため変更の履歴追跡が可能になることです.そして,何より手で矢印やリソースのグルーピングを細かに弄らなくてもいいところです!僕は手で作図をしていて図の重なりで細かな調整をするのが面倒だと思ってしまいますが,その手間が何行かのコードで解決できます.

Diagrams の導入

Diagrams」の導入は簡単です.pipであれば次のコマンドで導入できます.また,Graphviz も必要なので適宜インストールしてください.

pip install diagrams

diagrams.mingrammer.com

Diagrams での描画

Diagrams」でどれくらいのコード量で作図ができるかを実際に2つの例でみていきます.

Web3層構造

1つ目のパターンとして Web の3層構造を AWS で構成するコード例です.

コード例

from diagrams import Diagram, Cluster
from diagrams.aws.compute import AutoScaling,EC2
from diagrams.aws.network import ELB
from diagrams.aws.database import RDS

with Diagram("Scale-Out Computing", show=False):
    lb = ELB("LB")
    db = RDS("DB")
    with Cluster("Scaling Servers"):
        srv_group = [EC2("web01"),
                    EC2("web02"),
                    EC2("web03")]

    lb >> srv_group >> db

図を出力するためには次のようにコードを実行します.コードの実行が成功すると,コードと同じ階層に構成図がデフォルトですとpng形式で生成されます.なお,形式は,svg,jpg,pdfに対応しています.

python xxx.py

ELB で受けたトラフィックを3台までスケールする EC2 とデータを格納する RDS を表現してみました.10数行でこの絵を書けるのだから楽ですね.

f:id:sadayoshi_tada:20200331001349p:plain

サーバレスアーキテクチャ

2つ目の例としてサーバーレスアーキテクチャを作図してみます.題材として「実践 AWS CDK - TypeScript でインフラもアプリも!」で扱った感情分析システムのワークフローのコード例です.

sadayoshi-tada.hatenablog.com

コード例

from diagrams import Diagram, Cluster
from diagrams.onprem.client import User
from diagrams.aws.storage import S3
from diagrams.aws.integration import SF,SNS
from diagrams.aws.compute import Lambda
from diagrams.aws.ml import Comprehend
from diagrams.aws.compute import Compute

with Diagram("Osenchi Architecture", show=False):

    with Cluster("Osenchi WorkFlow"):
        with Cluster("State Machine"):
            wf =  SF("Step Functions")

        with Cluster("Send E-mail"):
            wf >> SNS("Email Topic") >> User("Client")

        with Cluster("Delete Object"):
            wf >> Lambda("Delete Objects Functions")>>S3("Input")

        with Cluster("Call DetectStatement API"):
            wf >> Lambda("Call Comprehend Functions") >> Comprehend("DetectStatement API") >> S3("Ouput")

    User("Client") >> S3("Input") >> wf

出力された図が次のものです. f:id:sadayoshi_tada:20200331001836p:plain

Clustesを使うことで関連処理のグループ化が可能です.ワークフローで呼び出す各処理を1つずつグループ化していくとワークフローの作図もできます.

diagrams.mingrammer.com

まとめ

Diagrams」いかがでしたでしょうか? Pythonに慣れていて手での作図にモヤモヤしている人に有用なツールと思います.主要なクラウドサービスだけでなく,オンプレミスのリソース表現もあります.AWS 観点で行くとアイコンも最新になっているし,構成図もコードで管理できれば履歴の管理もし易いと感じました.興味を持った人はぜひ「Diagrams」使ってみて欲しいです!