DiagramsでAWS構成図をパッと記載しよう!

AWS
AWS画像
AWS
目次

概要

突然ですが、AWS構成図は皆さんどうしていますか?
コーディングで構成図を作成する方法を最近知ったので、本記事で紹介します!

AWSアーキテクチャ図を手軽に可視化できるので、インフラ設計の効率化に役立ちます!

女性

コードで構成図が書けるのは面白そう!

Diagramsとは?

  • Pythonでインフラ図を作成できるライブラリ
  • コードを実行するとPNGファイル等として出力が可能

公式サイトはこちら↓

https://diagrams.mingrammer.com

メリット・デメリット

メリット・デメリット

・AWSだけでなくGCP、Azureなどの構成図も対応可
・コードでリソース管理できるので、変更等が柔軟に!
・ソースなのでバージョンGitで管理も可能

・AWSのアイコンが一部存在しない
・複雑な設計になるとコーディングに時間がかかる

教師

こう見るとかなり複雑な構成になるのであれば、
draw.ioなどの使用を検討してもいいかもしれません。

女性

コーディングで作成できるのはも楽しそう!
選択肢が増えること自体は良いことだよね!

diagramsが対応してないAWSサービス

  • IoT Core
  • Bedrock
  • Local Zones

公式サイトに詳しい情報があります!

https://diagrams.mingrammer.com/docs/nodes/aws

コーディング準備

Diagramsのインストール

pip install diagrams

Graphvizインストール

Graphvizというライブラリも必要になります。
テキストデータをグラフ画像に変換するツールになります。

sudo apt-get install graphviz

実際に作成してみよう!

では実際に記載してみましょう。
まずは公式を参考に、EC2等をいくつか書いてみましょう。

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Grouped Workers", show=False, direction="TB"):
    ELB("lb") >> [EC2("worker1"),
                  EC2("worker2"),
                  EC2("worker3"),
                  EC2("worker4"),
                  EC2("worker5")] >> RDS("events")

コード解説

  • name: 図の名前(ここではGrouped Workers)
  • filename: ファイル名(デフォルト: nameによって決まる)
  • outformat: 図の保存形式(デフォルト: png)
  • png、jpg、pdfなど
  • show: スクリプト実行時に作成した図を表示するか(デフォルト: True)
  • direction: データフローの向き
  • TB、BT、LR、RL

:::note info

directionについて

  • TB (Top to Bottom): 上から下への配置
  • BT (Bottom to Top): 下から上への配置
  • LR (Left to Right): 左から右への配置
  • RL (Right to Left): 右から左への配置

例えば、direction=”LR” を設定すると、ノードが左から右へ順に並びます。
:::

上記コードを実行

python3 sample.py

出力画像

スクリーンショット 2024-10-28 0.04.49.png

実行が完了すると、作成した図が表示されます。
png形式で画像がPythonコードと同じ場所に出力されます。

AWS以外にも記載可能

Kubernetes

from diagrams import Diagram
from diagrams.k8s.clusterconfig import HPA
from diagrams.k8s.compute import Deployment, Pod, ReplicaSet
from diagrams.k8s.network import Ingress, Service

with Diagram("Exposed Pod with 3 Replicas", show=False):
    net = Ingress("domain.com") >> Service("svc")
    net >> [Pod("pod1"),
            Pod("pod2"),
            Pod("pod3")] << ReplicaSet("rs") << Deployment("dp") << HPA("hpa")

結果

Exposed Pod with 3 Replicas on Kubernetes

スクリーンショット 2024-10-28 0.14.24.png

k8s + AWS + Monitoring

一時期私が個人開発で使用していた設計を思い出して書いてみました。
監視やKubernetesの混合です。

構成

AWSリソース

  • VPC: ネットワークの基盤となる仮想NW
  • Public Subnet: インターネットアクセスを必要とするリソース(NLBやGrafana)を配置
  • Private Subnet: Kubernetesクラスタのワーカーやデータベースなど、内部専用リソースを配置
  • NAT Gateway: プライベートサブネットからインターネット接続を提供
  • RDS: MySQLを使用したDB

Kubernetesクラスタ

  • Node Group: アプリケーションを稼働するためのワーカーノードグループ
  • Prometheus: メトリクスを収集するモニタリングサービス
  • Grafana: Prometheusからメトリクスを取得し、視覚化して監視

コード

from diagrams import Diagram, Cluster, Edge
from diagrams.aws.network import VPC, PublicSubnet, PrivateSubnet, NATGateway, InternetGateway
from diagrams.aws.database import RDS
from diagrams.aws.compute import EKS
from diagrams.k8s.compute import Pod
from diagrams.k8s.controlplane import API
from diagrams.k8s.network import Ingress, Service
from diagrams.onprem.monitoring import Prometheus, Grafana

with Diagram("Modern Kubernetes on AWS with Grafana Monitoring", direction="TB"):

    # AWS Infrastructure
    with Cluster("AWS Cloud"):
        vpc = VPC("VPC")

        igw = InternetGateway("Internet Gateway")
        nat_gw = NATGateway("NAT Gateway")

        with Cluster("Public Subnet"):
            public_subnet = PublicSubnet("Public Subnet")
            grafana = Grafana("Grafana")
            nlb = Service("Network Load Balancer")

        with Cluster("Private Subnet"):
            private_subnet = PrivateSubnet("Private Subnet")
            rds = RDS("Database")

            with Cluster("Kubernetes Cluster"):
                eks = EKS("EKS Cluster")
                with Cluster("Node Group"):
                    app_pod = Pod("App Pod")
                    ingress = Ingress("Ingress Controller")
                    prometheus = Prometheus("Prometheus")

                    # Application Pod and Services
                    app_pod - Edge(label="Metrics") - prometheus
                    prometheus >> Edge(label="Metrics") >> grafana

        # Networking Connections
        vpc >> igw
        vpc >> public_subnet >> nlb >> ingress >> eks
        eks >> private_subnet

結果

スクリーンショット 2024-10-28 0.18.48.png

まとめ

こんな感じでAWSを始めとした様々な構成図を
コーディング可能です!

業務はもちろん、個人開発や提案資料などにも何かと便利です!
紹介した内容以外にも、公式にコーディング例がありますので
参考になれば幸いです!

https://diagrams.mingrammer.com/docs/getting-started/examples

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次