민한의 블로그

나의 인프라 구조(다이어그램)를 이쁘게 만들어 보자(peat. diagrams) 본문

기타 정리/기타

나의 인프라 구조(다이어그램)를 이쁘게 만들어 보자(peat. diagrams)

minhan2 2022. 8. 31. 18:16
728x90
반응형

직접 만든 다이어그램

참고로 실습하기 편하기 위해서 간단하게 python으로 진행한것이였는데,
이럴바에 docker-compose로 하는 방법이 훨씬 속편하고 스트레스 안받았을것같다.
가능하다면 jupyter notebook을 설치해서 사용하는걸 권장한다.
예시로 맨 아래에 docker-compose 파일을 만들어놓았다.

가끔씩 내가 만든 인프라 구조를 다른 사람들에게 설명해주고 싶은데,
말로만 으로는 부족함을 많이 느껴서 다이어그램만드는 법을 많이 찾아보았다.

https://www.diagrams.net/
같은 툴이 있지만, 뭔가 나에게는 불편하고 조금은 부족하게 느껴졌었다.

https://www.cloudcraft.co/
솔직히 이것도 이쁜데..

그러다가 찾은것이
https://diagrams.mingrammer.com/
이것이다.

아무래도 파이썬으로 되어있어서 접근성이 떨어지는가? 싶지만
우선 환경세팅만 해놓으면 그후로는 직관적으로 이해하기 편하다.

python 3.6이상이 본인의 운영체제에 설치되어 있어야 하며, 라이브러리 자체가 파이썬으로 사용해야한다.

그러므로 python 환경을 우선 구축해야하는데,
아무래도 global한 환경에 설치하는것 보다는, node의 package.json, spring boot의 gradle과 같은 python 의존성 관리 툴을 사용하면 편리하다.
그중에서 가상환경을 구축하여 사용하는 pipenv를 설치해보자.

pipenv 설치

mac에서는

$ brew install pipenv

그 외는 pip로

$ pip install pipenv

이렇게 설치하면 된다.

pipenv 사용법

이후 내가 사용할 폴더에서 아래와 같이 명령어를 치면,
파이썬 3.9 버전으로 가상환경이 만들어진후, 가상환경으로 접속한다는것이다.
Pipfile 이라는것이 생기고, package.json, pom.xml 같은 프로젝트의 메타 정보가 저장된다.

pipenv --python 3.9

그 이후로 접속할때는 shell명령어로 접속하면 된다.

pipenv shell

가상환경을 나가고싶을때는

exit

로 나가주면 된다.

내가 가상환경에 잘 들어온건가? 확인하고자 한다면.

 ~/Desktop/private/infra-diagrams  which python3
/usr/local/bin/python3

 ~/Desktop/private/infra-diagrams  pipenv shell
/Users/ujeongmin/.local/share/virtualenvs/infra-diagrams-vILSYjnf/bin/python3

 ~/Desktop/private/infra-diagrams  which python3
/Users/ujeongmin/.local/share/virtualenvs/infra-diagrams-vILSYjnf/bin/python3

shell 명령어를 쳤을때랑 안쳤을때랑 python명령어의 위치가 다른것을 확인할 수 있다.

앞으로는 pip 대신 pipenv를 사용하여 라이브러리를 설치하면 된다.
diagram은 우리가 diagram라이브러리를 사용하기위해,
ipython은 만든 다이어그램을 이미지로 볼수 있게 하기위하여.

graphviz를 사용하기 위해서는 mac에서 brew로 설치해준다.
파이썬에서 이미지를 그리기위해서 사용한다.
그리고 pipenv로도 설치를 더해준다.

?? 아니 brew로 설치를 해줬는데 뭐하러 pipenv로 한번 더 설치해줘?
라는 의문이 들지만
그런 의문은 집어 놓도록 하자. brew던 pipenv던 한쪽만 설치되어있으면 실행이 안된다.
아무리 찾아봐도 이해가 안되었다.


pipenv install diagrams
pipenv install ipython

brew install graphviz
pipenv install graphviz

그리고 나서

python diagram.py를 하면 이쁜 사진이 나오게 된다. :)

참고로 나의 diagram.py는 아래와 같은 모양이다.


from diagrams import Cluster, Diagram
from diagrams.custom import Custom
from IPython.display import Image
# AWS
from diagrams.aws.database import RDS
from diagrams.aws.network import Route53, ELB
from diagrams.aws.compute import EC2, ECS, EKS, AutoScaling
from diagrams.aws.storage import S3
# 쿠버네티스
from diagrams.k8s.compute import Pod, Job, ReplicaSet, Deployment
from diagrams.k8s.network import Ingress, Service
from diagrams.k8s.podconfig import ConfigMap
from diagrams.k8s.clusterconfig import HPA
# 모니터링
from diagrams.onprem.aggregator import Fluentd
from diagrams.onprem.monitoring import Grafana, Prometheus
from diagrams.elastic.elasticsearch import Elasticsearch, Kibana




with Diagram("Web Service", show=False, direction="TB"):
    tf = Custom("Terraform", "./terraform-icon.webp")
    dns = Route53("dns")
    lb = ELB("timeletter.net \n dev.timeletter.net")

    metrics = Prometheus("metric")
    metrics << Grafana("monitoring")

    tf
    with Cluster("EKS Cluster"):
        with Cluster("AutoScaler"):
            AutoScaling("AutoScaling")
            with Cluster("Production Namespace"):
                with Cluster("WorkerNode1"):
                    ECS1 = ECS("WorkerNode1")
                    net1 = Service("svc")
                    Job("ReserveMessage")
                    worker1 = [Pod("timeletter FE"),
                               Pod("timeletter BE1"),
                               Pod("timeletter BE2")]
                    deploy1 = ReplicaSet("rs") << Deployment(
                        "dp") << HPA("hpa")
                    worker1 << deploy1
                    net1 >> worker1

                    Fd1 = Fluentd("logging")

            with Cluster("Development Namespace"):
                with Cluster("WorkerNode2"):
                    ECS2 = ECS("WorkerNode2")
                    net2 = Service("svc")
                    Job("ReserveMessage")
                    worker2 = [Pod("timeletter FE"),
                               Pod("timeletter BE1"),
                               Pod("timeletter BE2")]
                    deploy2 = ReplicaSet("rs") << Deployment(
                        "dp") << HPA("hpa")
                    worker2 << deploy2
                    net2 >> worker2

                    Fd2 = Fluentd("logging")

    # AWS
    store = S3("timeletter store")
    dw = RDS("timeletter db")

    # K8S
    dns >> lb >> [net1, net2]
    worker1 >> store
    worker1 >> dw
    worker2 >> store
    worker2 >> dw

    # 모니터링
    ES = Elasticsearch("ES")
    KB = Kibana("Kibana")

    ECS1 << metrics
    ECS2 << metrics

    Fd1 >> ES
    Fd2 >> ES

    ES >> KB

Image(filename='web_service.png')
version: '3'
services:
  jupyter:
    image: jupyter/tensorflow-notebook
    container_name: jupyter
    user: root
    environment:
      - GRANT_SUDO=yes
      - JUPYTER_ENABLE_LAB=yes
      - JUPYTER_TOKEN="docker"
    volumes:
      - ./workspace:/home/jovyan/work
    ports:
      - "8888:8888"
    entrypoint:
      - start-notebook.sh
      - --NotebookApp.token=''
728x90
반응형
Comments