構成図をExcelやPowerPointで描いていると、機器が1台増えるたびに線を引き直すことになります。レビューで指摘が入れば、また図形を動かす作業です。
Mermaidはテキストで図を書ける記法で、差分がGitに残るのとレイアウトを自動でやってくれるのが利点です。GitHubやGitLabはコードフェンスをそのまま図として表示します。

この記事では、インフラの現場でよく描く4つの構成図を、コピーしてそのまま使える形で載せます。記法の基礎や環境構築はPyCharmのMarkdownでmermaidのフロー図を書くとVSCodeでmermaidの図を描く手順にまとめてあります。検証は Mermaid 11 で行いました。
1. ネットワーク構成図
セグメントを subgraph で囲むのが基本形です。ラベルにサブネットを書いておくと、それだけで構成図として成立します。
flowchart LR
INET([インターネット])
subgraph DMZ["DMZ 192.168.10.0/24"]
FW[ファイアウォール] --> REV[リバースプロキシ]
end
subgraph LAN["社内LAN 192.168.20.0/24"]
L3[L3スイッチ]
SRV[(ファイルサーバー)]
AD[ADサーバー]
L3 --> SRV
L3 --> AD
end
INET --> FW
REV --> L3

押さえるのはノードの形です。[] が四角、([]) が角丸、[()] が円筒になります。インターネットのような「外側」は角丸、ストレージは円筒にしておくと、凡例を書かなくても伝わります。
subgraph のラベルに空白を入れたい場合は ["..."] のようにダブルクォートで囲みます。囲まないとそこで切れます。
2. 機器の結線図
ポート番号まで載せたいときは、矢印にラベルを付けます。-- "ラベル" --> の形です。
flowchart TB
subgraph RACK["サーバーラック A-01"]
SW1["スイッチ1<br/>Gi0/1-24"]
SW2["スイッチ2<br/>Gi0/1-24"]
S1["サーバー1<br/>NIC0 / NIC1"]
S2["サーバー2<br/>NIC0 / NIC1"]
end
SW1 -- "Gi0/1" --> S1
SW2 -- "Gi0/1" --> S1
SW1 -- "Gi0/2" --> S2
SW2 -- "Gi0/2" --> S2
SW1 <-. "スタック" .-> SW2

ノード内で改行したいときは <br/> を使います。機器名と型番、ホスト名とIPのように2段で書くと読みやすくなります。
スイッチ間のスタック接続は <-. "ラベル" .-> で点線の双方向にしました。実線と点線で「データが流れる線」と「それ以外」を描き分けると、見る側が迷いません。
ただし結線が増えると線が交差します。自動レイアウトなので位置を指定できません。機器が5〜6台を超えるなら、この図は諦めて表にしたほうが読みやすくなります。
3. 冗長構成
主系と待機系は、線の太さと種類で描き分けます。==> が太線、-.-> が点線です。
flowchart LR
CL[クライアント] --> VIP(["仮想IP<br/>192.168.20.254"])
VIP ==> R1["ルーター1<br/>Master 優先度200"]
VIP -. "切替時のみ" .-> R2["ルーター2<br/>Backup 優先度100"]
R1 --> UP([上位回線])
R2 -.-> UP
R1 <-. "VRRP Advertisement" .-> R2

いま通っている経路を太線、切替時だけ使う経路を点線にすると、平常時の動きが一目で分かります。優先度のような設定値はノード名の2段目に入れておくと、設計書を見に行かずに済みます。
4. 3層構成
レイヤーごとに subgraph で囲みます。横向き(LR)にすると、リクエストの流れと図の向きが一致します。
flowchart LR
U([利用者]) --> LB{{ロードバランサ}}
subgraph WEB["Web層"]
W1[Web1]
W2[Web2]
end
subgraph APP["AP層"]
A1[AP1]
A2[AP2]
end
subgraph DB["DB層"]
D1[(Primary)]
D2[(Standby)]
end
LB --> W1
LB --> W2
W1 --> A1
W2 --> A2
A1 --> D1
A2 --> D1
D1 -. "レプリケーション" .-> D2

ロードバランサには {{}}(六角形)を使いました。処理の中継点だけ形を変えると、同じ四角の羅列になりません。
5. 本番と検証を色で分ける
同じ構成の環境が複数あるとき、形だけでは本番と検証が区別できません。classDef でクラスを定義して、ノードに割り当てます。
flowchart LR
subgraph PROD["本番環境"]
PW[Web] --> PA[AP] --> PD[(DB)]
end
subgraph STG["検証環境"]
SW[Web] --> SA[AP] --> SD[(DB)]
end
PD -. "日次でマスキング複製" .-> SD
classDef prod fill:#FDF2F2,stroke:#B91C1C,stroke-width:2px
classDef stg fill:#ECFDF3,stroke:#15803D,stroke-width:2px
class PW,PA,PD prod
class SW,SA,SD stg

classDef 名前 fill:背景色,stroke:線色 で定義し、class ノード1,ノード2 名前 で割り当てます。同じクラスを複数ノードにまとめて指定できるので、環境が増えても行数は増えません。
色は意味を決めて固定するのがおすすめです。触ってはいけないものを赤、作業してよいものを緑、という使い分けにしておけば、図を見た人が事故を起こしにくくなります。
6. 書くときに踏んだ点
実際に4枚作る過程で引っかかったところです。
6.1 subgraph の中の direction は効かないことがある
subgraph の中で向きを変えられる、とされていますが、外側の向きに引きずられることがありました。
flowchart LR
subgraph DMZ["DMZ"]
direction TB ← 縦に並べたいが
FW --> REV
end
この指定を入れても、1章の図ではファイアウォールとリバースプロキシが横並びのままです。向きを確実に変えたいなら、subgraph を分けるのではなく図そのものを分けたほうが早いです。
6.2 日本語は引用符で囲むと安全
ノードのラベルに半角の括弧やスラッシュが混ざると解釈が変わることがあります。A["1階(本社)/ 2階"] のようにダブルクォートで囲んでおけば、中身をそのまま文字として扱ってくれます。
全角スペースはそのまま使えました。サブネット表記の区切りなどに使うと、読点を打たずに整えられます。
6.3 ノードの形は4つ覚えれば足りる
| 記法 | 形 | 使いどころ |
|---|---|---|
A[文字] | 四角 | 機器全般 |
A([文字]) | 角丸 | 外部ネットワーク、始点終点 |
A[(文字)] | 円筒 | データベース、ストレージ |
A{{文字}} | 六角形 | ロードバランサ、中継点 |
このほかに菱形 A{文字} がありますが、こちらは判断分岐で使うものなので構成図では出番がありません。
7. まとめ
Mermaidでインフラの構成図を書く要点を整理します。
- セグメントは
subgraphで囲み、ラベルにサブネットを書く - ポート番号は矢印のラベル(
-- "Gi0/1" -->)で表す - 実線と点線、太線で「いま通っている経路」を描き分ける
- ノードの形は4つで足りる。 四角・角丸・円筒・六角形
subgraphの中のdirectionは効かないことがある- 結線が増えると線が交差する。 5〜6台を超えるなら表にする
テキストなので、機器が増えたら1行足すだけです。図形を動かす作業から解放されるのが一番の効果だと思います。
構成図以外の図(切り分けフロー・シーケンス図・ガントチャート・状態遷移図・ER図)はMermaidで運用ドキュメントの図を書くにまとめています。


コメント