作りたいものを書く
今作りたいと思っているものをブログに書こうとしたら、構成図を書く必要が出てきました。
そこでまずは描画について調べて試したことを書くことにします。
PowerPointはじめ、GUIの描画ツールは色々あるのですが、そこまで本格的に書くのはしんどいのでテキストで書いていい感じに描画してくれるものを探します。
AWSの構成図をPythonで書けたらいいと思ってaws 構成図 描画 python
でGoogle検索して最上位に出てきたDiagramsというライブラリが良さそうです。AWSの構成図をpythonで簡単に書けそうです。
GettingStartedを見ると、GraphVizが必要とのことです。私の開発環境のMacの場合はbrew install graphviz
でインストールできるようです。Homebrewはよくわからずにインストールしたはずなので早速上記コマンドでGraphvizをインストールします。
その後、python3 -m pip install diagrams
でDiagramsのインストール完了です。
早速QuickStartに書いてある以下のコードを実行して動作確認をします。
from diagrams import Diagram from diagrams.aws.compute import EC2 from diagrams.aws.database import RDS from diagrams.aws.network import ELB with Diagram("Web Service", show=False): ELB("lb") >> EC2("web") >> RDS("userdb")
ここでサンプルコードをdiagrams.pyとして実行したら以下のエラーが発生しました。
Traceback (most recent call last): File "diagrams.py", line 1, in <module> from diagrams import Diagram File "diagrams.py", line 1, in <module> from diagrams import Diagram ImportError: cannot import name 'Diagram' from partially initialized module 'diagrams' (most likely due to a circular import) (diagrams.py)
インストールに失敗したかと思いましたが、冷静になってエラーを見てみると、most likely due to a circular import
と書いてあり、most likelyなことをやっていることに思い当たりました。ファイル名(diagrams.py)がインポートするモジュール(diagrams)と同じというものすごく初歩的なミスです。こんな恥ずかしいミスもこのブログには書いておきます。
早速ファイル名をQuickStart通りにdiagram.py(末尾のsを削除)に変更して実行すると、web_service.pngというファイル名で、以下の画像ができていました。大成功です。
ようやく準備ができたので、作りたいものを書いてみます。 作りたいものは、カメラなどのデバイスをAWSとつないでAWS上でゴニョゴニョするというもので、AWSの部分はDiagramsで問題なく書けそうです(Diagrams-nodes-aws)。しかし、問題はデバイスの方で、Diagramsにどんなものが用意されているのか、Genericにあるものをとりあえず全部書いてみます。
from diagrams import Diagram, Cluster from diagrams.generic.blank import Blank from diagrams.generic.compute import Rack from diagrams.generic.database import SQL from diagrams.generic.device import Mobile, Tablet from diagrams.generic.network import Firewall, Router, Subnet, Switch, VPN from diagrams.generic.os import Android, Centos, IOS, LinuxGeneral, Suse, Ubuntu, Windows from diagrams.generic.place import Datacenter from diagrams.generic.storage import Storage from diagrams.generic.virtualization import Virtualbox, Vmware, XEN with Diagram("Generic", show=True): with Cluster("Blank"): blank = Blank("Blank") with Cluster("Compute"): rack = Rack("Rack") with Cluster("Database"): sql = SQL("SQL") with Cluster("Device"): mobile = Mobile("Mobile") tablet = Tablet("Tablet") with Cluster("Network"): firewall = Firewall("Firewall") router = Router("Router") subnet = Subnet("Subnet") switch = Switch("Switch") vpn = VPN("VPN") with Cluster("OS"): android = Android("Android") centos = Centos("Centos") ios = IOS("IOS") linuxgeneral = LinuxGeneral("LinuxGeneral") suse = Suse("Suse") ubuntu = Ubuntu("Ubuntu") windows = Windows("Windows") with Cluster("Place"): datacenter = Datacenter("Datacenter") with Cluster("Storage"): storage = Storage("Storagte") with Cluster("Virtualization"): virtualbox = Virtualbox("Virtualbox") vmware = Vmware("Vmware") xen = XEN("XEN")
ものすごく縦長になりました。
Diagram("Generic", show=True)
の引数にdirection="TB"
を追加すると、ものすごく横長になりました。
deviceにはMobileとTabletしかありません。カメラを構成図に入れようと思ったら、Diagramsにないアイコンを追加する必要がありそうです。
困った時の公式ドキュメントです。Examplesを見てみると、一番下にRabbitMQ Consumers with Custom Nodes
とあり、Custom Nodesという言葉がいい感じです。
サンプルコードを見てみると、ネットからpngファイルをローカルにダウンロードして、それをそのままCustomノードとして使えるようです。
ということで、独自アイコンの追加の仕方がわかったので必要なアイコンを探します。困った時のいらすとやから使えそうなアイコンを探してみようと思います。
早速アクセスしてみると、トップページのONE PIECEのイラストが気になります。カメラなどデバイスの画像を探しにきたのにONE PIECEのイラストが気になります。ONE PIECEなんて15年近く読んでないのにONE PIECEのイラストが気になります。
練習にルフィの絵を書いてみます。
from urllib.request import urlretrieve from diagrams import Cluster, Diagram from diagrams.custom import Custom luffy_url = "https://1.bp.blogspot.com/-tVeC6En4e_E/X96mhDTzJNI/AAAAAAABdBo/jlD_jvZvMuk3qUcNjA_XORrA4w3lhPkdQCNcBGAsYHQ/s1048/onepiece01_luffy.png" luffy_icon = "luffy.png" urlretrieve(luffy_url, luffy_icon) with Diagram("ONE PIECE", filename="onepiece", show=True): luffy = Custom("モンキー・D・ルフィ", luffy_icon)
書けました。
一人だと寂しいので増やしました。
関係性を書きたくなります(適当)。
相関図を書こうとして、相関図を書くほど詳しくなくて断念しました。
ということで、Diagramsを使うことで、好きな画像とAWSアイコンとを組み合わせて構成図が書けるところまでできました。
疲れたので書きたかった構成図はまた今度にします。