株式会社Schooの@hiroto_0411です!
新卒研修でMermaidを使って以来、簡単な図はMermaidで書くようになりました!推しツールの1つになってきています🫶
そんなMermaidでアーキテクチャ図(Architecture Diagrams)を書けるようになったと聞いたので、実際に試してみました!
Mermaidとは
シーケンス図、クラス図、状態遷移図などをテキストベースで作ることができるツールです。
Mermaidを書くときに使うと便利なツール
Mermaid Live Editor
(2024/09/12現在、Mermaid v11.1.0以上に対応していないためアーキテクチャ図は見られないです)
ブラウザでMermaid記法を試すことができます。
Markdown Preview Mermaid Support(VSCode拡張機能)
マークダウンで記述しながらプレビューを見られます。
サンプル
2024/09/12現在、GitHubではデフォルトのアイコンは使えますがiconifyのアイコンは使えないみたいです。
draw.io
(2024/09/12現在、アーキテクチャ図は対応していないです。)
Mermaidのコードからdraw.ioで図を作成することができます。draw.ioを使うことで、どうしても人が修正したい箇所の微調整を行うことができます。
draw.ioの上のタブの配置→挿入→高度な設定→Mermaid
の流れで選択して、表示されるテキストエリアにMermaidのコードを入力します。
Mermaidの良いところ
- デザインや配置を自分で考える必要がない
- 図を書き換えるのが比較的楽
- テキストを書き換えるだけで変更できるので、矢印1つ1つを動かしたりしなくて良い
- 複雑な図になってくると微調整は必要
- version管理できる
- 生成AIに書いてもらうこともできる
- Notionやdraw.io、GitHubなどさまざまなサービスでテキストから図を作成・挿入することができる
アーキテクチャ図とは
システムやアプリケーションの構成要素とその相互関係、動作の流れを視覚的に表現した図のことです。
参考
Mermaidでアーキテクチャ図を書いてみよう!
ドキュメントを参考にして、実際に触ってみました!
今回試した環境
VSCode
Markdown Preview Mermaid Support(VSCode拡張機能)
VSCodeでMermaidを書くときの記法
マークダウンファイルを作成して以下のような記述方法で書くことができます。
```mermaid
architecture-beta
group public_api(cloud)[Public API]
group private_api(cloud)[Private API] in public_api
service database(database)[Database] in private_api
```
アーキテクチャ図の記法
Groups
group public_api(cloud)[Public API]
アイコンとタイトルを指定することができます。
group private_api(cloud)[Private API] in public_api
group内にgroupを配置する事もできます。
Services
service database(database)[Database] in private_api
EdgesとArrows
```mermaid
architecture-beta
group publicsubnet[Public subnet]
group privatesubnet[Private subnet]
service ec2(logos:aws-ec2)[EC2]in publicsubnet
service rds(logos:aws-rds)[RDS master] in privatesubnet
ec2:B -- T:rds
```
ec2:B -- T:rds
ec2のbottomとrdsのtopをつなぐイメージです。
ec2:L --> R:rds
こうすると横に並べることができます。
また、-->
みたいにすると矢印になります。
ec2:L -- T:rds
左と上を結ぶみたいな組み合わせもできます。
Junctions
分岐を表現する事もできます。
```mermaid
architecture-beta
service left_disk(disk)[Disk]
service top_disk(disk)[Disk]
service bottom_disk(disk)[Disk]
junction junctionCenter
left_disk:R -- L:junctionCenter
top_disk:B -- T:junctionCenter
bottom_disk:T -- B:junctionCenter
```
分岐点をjunctionで表現して、そこから各サービスのどこに向かって繋がりを作るか指定するイメージです。
ちょっと複雑なAWSのアーキテクチャ図を書いてみる
コード
sample.md architecture-beta
group vpc[VPC]
service elb(logos:aws-elb)[ELB] in vpc
group availabilityzone[Availability Zone ap northeast 1a] in vpc
group availabilityzone2[Availability Zone ap northeast 1c] in vpc
group publicsubnet[Public subnet] in availabilityzone
group publicsubnet2[Public subnet] in availabilityzone2
service ec2a(logos:aws-ec2)[EC2]in publicsubnet
service ec2b(logos:aws-ec2)[EC2] in publicsubnet2
group privatesubnet[Private subnet] in availabilityzone
group privatesubnet2[Private subnet] in availabilityzone2
service rds(logos:aws-rds)[RDS master] in privatesubnet
service rds2(logos:aws-rds)[RDS slave] in privatesubnet2
elb:B --> T:ec2a
elb:B --> T:ec2b
ec2a:B --> T:rds
ec2b:B --> R:rds
ちょっとずれていますが、いい感じにできました。
draw.ioではMermaidから実際に図を作成し、それぞれの要素の位置を微調整することができます。
まだMermaidのアーキテクチャ図には対応していないので、対応されるようになったらより複雑な図を作成することも可能になるかなと思いました!
アイコンについて
デフォルトではcloud
,database
,disk
,internet
,server
のアイコンを使用することができます。また設定によってiconifyのアイコンを使うこともできます。
設定の詳細はMermaidのドキュメントを確認してください!
使えるアイコンは以下のサイトを参照
現在、Markdown Preview Mermaid Supportはデフォルトのロゴのみの対応だったので、今回はMarkdown Preview Mermaid Supportのコードを修正してVSCodeで使えるようにして使ってみました!
PRも作成しているので、マージされればVSCodeでiconifyのアイコンが使えるようになるはずです!
Markdown Preview Mermaid Support(VSCodeの拡張機能)で一部のアイコンが使えるようになりました!
感想
- 現状だとdraw.io,Notion,VSCodeの拡張機能などがまだ未対応なので使い所が難しいですが、それらのサービスで使えるようになったらとても便利かなと思いました。
- 複雑なアーキテクチャはMermaidで作成して、draw.ioで微調整するなどの使い方ができたら可能性が広がるなと思いました!
皆さんもぜひ使ってみてください!
Qiitaでも使えるようになったらしい!
コード
architecture-beta
group vpc[VPC]
service elb(logos:aws-elb)[ELB] in vpc
group availabilityzone[Availability Zone ap northeast 1a] in vpc
group availabilityzone2[Availability Zone ap northeast 1c] in vpc
group publicsubnet[Public subnet] in availabilityzone
group publicsubnet2[Public subnet] in availabilityzone2
service ec2a(logos:aws-ec2)[EC2]in publicsubnet
service ec2b(logos:aws-ec2)[EC2] in publicsubnet2
group privatesubnet[Private subnet] in availabilityzone
group privatesubnet2[Private subnet] in availabilityzone2
service rds(logos:aws-rds)[RDS master] in privatesubnet
service rds2(logos:aws-rds)[RDS slave] in privatesubnet2
elb:B --> T:ec2a
elb:B --> T:ec2b
ec2a:B --> T:rds
ec2b:B --> R:rds
Qiitaも現状はデフォルトのアイコンのみに対応しているみたいですね!
参考
Schooでは一緒に働く仲間を募集しています!