MermaidでAWSアーキテクチャ図を描いてみた!
Mermaidが好きすぎるけど結局draw.ioにしがちな今日この頃ですが、ついにMermaidでAWSアーキテクチャ図が描けるようになったらしいので試してみました!
やってみた
感想としては、そこそこ複雑なものも描けそうです!
Mermaidのアーキテクチャドキュメントに飛んで、一番下のAWSアーキテクチャ図のサンプルコードに以下のコードをコピペして実行すると見ることができます
mermaidコード
architecture-beta
service dns(logos:aws-route53)[Route53]
service cdn(logos:aws-cloudfront)[CloudFront]
service cert(logos:aws-certificate-manager)[ACM]
service storage(logos:aws-s3)[S3]
group vpc(logos:aws-vpc)[VPC]
service loadbalancer(logos:aws-elb)[ALB] in vpc
group private_subnet1[Private Subnet 1] in vpc
service appserver1(logos:aws-ec2)[EC2 Instance 1] in private_subnet1
service db_primary(logos:aws-aurora)[Aurora Primary] in private_subnet1
group private_subnet2[Private Subnet 2] in vpc
service appserver2(logos:aws-ec2)[EC2 Instance 2] in private_subnet2
service db_replica(logos:aws-aurora)[Aurora Replica] in private_subnet2
junction asg_junction in vpc
junction aurora_junction in vpc
dns:R -- L:cdn
cdn:R -- L:loadbalancer
loadbalancer:R -- L:asg_junction
asg_junction:T -- B:appserver1
asg_junction:B -- T:appserver2
appserver1:R -- L:db_primary
appserver2:R -- L:db_replica
cdn:T -- B:storage
db_replica:T -- B:aurora_junction
aurora_junction:T --> B:db_primary
cert:B -- T:dns
ただし、デフォルトアイコンのみ対応で、上記の例のようにAWSリソースアイコンなどは使用できないようです
書き方
構成要素としてはサービス, エッジ, ジャンクション, グループがあります
サービス
AWSだとEC2やS3に使えそうです
アイコンとタイトルが付けられます
service {service id}({icon name})[{title}]
例:service ec2(logos:aws-ec2)[EC2]
エッジ
AWSだとネットワークに使えそうです
サービス間を線でつなぐことができます
{serviceId}:{direction} -- {direction}:{serviceId}
direction
はL, R, T, B
のいずれかで、それぞれアイコンの左・右・上・下方向に矢印を伸ばすことができます
また、エッジは矢印にすることができ-->
, <--
, <-->
のいずれかが使えます
architecture-beta
service ec2(logos:aws-ec2)[EC2]
service s3(logos:aws-s3)[S3]
ec2:R -- L:s3
ジャンクション
レイアウトをそろえるための点です
サービスと同じようにエッジに指定して位置を揃えることができます
junction {junction id}
architecture-beta
service alb(logos:aws-elb)[ALB]
service ec2A(logos:aws-ec2)[EC2 A]
service ec2B(logos:aws-ec2)[EC2 B]
junction jct
alb:B -- T:jct
jct:L -- R:ec2A
jct:R -- L:ec2B
グループ
AWSだとVPCやサブネット・Auto Scalingグループに使えそうです
アイコンとタイトルが付けられます
group {group id}({icon name})[{title}]
例:group vpc(logos:aws-vpc)[VPC]
グループの中にグループやサービス・ジャンクションを入れることができます
architecture-beta
group vpc(logos:aws-vpc)[VPC]
service alb(logos:aws-elb)[ALB] in vpc
service ec2A(logos:aws-ec2)[EC2 A] in vpc
service ec2B(logos:aws-ec2)[EC2 B] in vpc
junction jct in vpc
service s3(logos:aws-s3)[S3]
alb:B -- T:jct
jct:L -- R:ec2A
jct:R -- L:ec2B
アイコン
アイコンはデフォルトアイコンかIconifyのアイコンセット(インポートが必要)が使用できます
デフォルトアイコン
cloud
, database
, disk
, internet
, server
が使用できます
architecture-beta
service internet(internet)[Internet]
group cloud(cloud)[Cloud]
service server(server)[Server] in cloud
service db(database)[Database] in cloud
service disk(disk)[Storage] in cloud
Iconify アイコンセット
インポート方法はMermaidのアーキテクチャドキュメントを参照してください
import mermaid from 'mermaid';
import { icons } from '@iconify-json/logos';
mermaid.registerIconPacks([
{
name: icons.prefix, // To use the prefix defined in the icon pack
icons,
},
]);
今回の例で使用したAWSリソースアイコンはIconfyのサイトで探しましたが、代表的なAWSリソースしかありませんでした
おわりに
バージョンがまだまだ対応していないことと、アイコンはインポートが必要で種類が少ないことがあるので、Zennで使うことやREADME.mdで使うのはまだまだ難しそうです・・
コードでAWSアーキテクチャ図が描けるのはChatGPTが使えるなどかなり便利なので、今後のアップデートに期待です!
Discussion
こちらの記事を拝見して、Zennのmermaidのバージョンも v11.1.1 へアップデートしました。
architecture-beta
が利用できます。なお、AWSアイコンについては iconify に依存することになるのですが、こちらの導入は様子見とさせてください。GitHub の mermaid 記法が iconify を使うようであればZennも追従したいと思います。