Closed14
Diagramsを使い、コードで構成図を作成する練習
つかうものは以下
pythonコードで構成図を書くことができるシロモノです。
これの練習をしてみます。
環境の用意には以下ページを参考にさせていただきました。
コード
from diagrams import Diagram
from diagrams.onprem.client import Client
with Diagram('test'):
Client('mypc')
できたもの
ポイント
- オンプレミスプロバイダの
Client
をNode
として表示している- プロバイダ、リソース分類、リソースについては以下参照(オンプレミス)。
-
mypc
という名前をつけている。
コード
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.onprem.client import Client
with Diagram('test'):
Client('mypc') >> EC2('server')
できたもの
ポイント
>>
で左から右に矢印を出せる。Data Flow
というもの
コード
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
できたもの
ポイント
複数→単体の図示も可能
コード
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つ前と同じ)
ポイント
グループ化し、コードをシンプルにできる
コード
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内で実施する必要がある
コード
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記事をとても参考にさせていただきました。
コード(動作しません)
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のドキュメント見れば頑張ればできそう?今後に期待
コード
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のドキュメントを参照
練習として、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
できたもの
所感
割とよさげ
サブネットの色分けなどはできていませんが、簡単な図ならよいですね
注意点① 配置が自由に決められない
コード
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などはグローバルリソースとして揃えたい気持ちがある...
を叶えたい場合、ドキュメントを読んで頑張る必要があります。本格的な構成図は難しいかも...
注意点② ドキュメントに記載がない場合、graphvizのドキュメントを漁る必要がある
凝った図を書こうとすると、graphvizのドキュメントを読む必要があります。
その場合手動作成に軍配が上がるかもしれません。diagrams.net簡単だし
まとめ
簡単な図を書くのにとても便利でした。
またコードベースのためCIで自動生成などができるのがとても大きいです。
使い方も難しく無いため、日常で使ってなれてみる
このスクラップは2023/01/29にクローズされました