반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

클라우드 시스템 아키텍처를 파이썬코드로 그리기 본문

Python

클라우드 시스템 아키텍처를 파이썬코드로 그리기

현무랑 니니 2020. 9. 23. 14:06
반응형

개요

제안서를 쓰거나 설계를 할 때 아키텍처가 필수 요소이다.

전체 시스템 개요를 설명하고 시스템 아키텍처를 작성한다.

지금까지는 시스템 아키텍처는 마이크로 소프트의 비지오와 같은 디자인 도구로 그리거나 파워포인트를 사용했다.

 

하지만 다이어그램 패키지를 사용하면 파이썬 코드에서 시스템 아키텍처를 그릴 수 있다.

다이어그램 패키지는 AWS, Azure, GCP 등 주요 클라우드와 온프레미스 노드 및

주요 프로그래밍 프레임워크도 지원한다.

 

설치하기

1. Python 3.6 이상 설치

2. graphviz 설치

3. diagram 패키지 설치

# using pip (pip3) 
$ pip install diagrams 

# using pipenv 
$ pipenv install diagrams 

# using poetry 
$ poetry add diagrams

diagram 패키지는 아래와 같이 설치된다. (가상환경에서 설치함.)

 

사용법

간단한 IoT 시스템 아키텍처 그리는 예제로 사용법을 설명한다.

# -*- coding: utf-8 -*-

import os
os.environ["PATH"] += os.pathsep + 'C:/Program Files/Graphviz 2.44.1/bin/'

from diagrams import Cluster, Diagram
from diagrams.aws.database import DocumentDB
from diagrams.generic.network import Router

# IoT
from diagrams.aws.iot import IotCamera, IotHardwareBoard, IotCore
from diagrams.azure.iot import IotHub

#with Diagram("IoT System Architecture", show=False):
with Diagram("IoT System Architecture"):
    legacyRouter = Router("legacy Router")
    iotPF = IotCore("oneM2M platform")
    myDB = DocumentDB("MongDB database")

    with Cluster("센서망"):
        with Cluster("WSN1"):
            iotDevice1 = IotCamera("IoT 장치1")
            iotDevice2 = IotHardwareBoard("IoT 장치2")

        with Cluster("WSN2"):
            iotDevice3 = IotCamera("IoT 장치3")
            iotDevice4 = IotHardwareBoard("IoT 장치4")

        with Cluster("IoT GWs"):
            iotGW1 = IotHub("Iot Gateway1")
            iotGW2 = IotHub("Iot Gateway2")

    [iotDevice1, iotDevice2] >> iotGW1
    [iotDevice3, iotDevice4] >> iotGW2

    [iotGW1, iotGW2] >> legacyRouter >> iotPF >> myDB

이 코드는 IoT 장치 2개당 1개의 IoT Gateway에 연결되고 GW들은 기존 라우터에 연결되어 IoT 플랫폼을 통해 몽고 데이터베이스에 데이터가 적재되는 시스템이다.

 

이 코드를 실행하면 다이어그램을 이미지로 만든다. (기본 png 형식이며 svg 등도 지원한다.)

$ python example.py

코드 설명

1. 시스템 구성 요소 포함하기

from diagrams import Cluster, Diagram
from diagrams.aws.database import DocumentDB
from diagrams.generic.network import Router

# IoT
from diagrams.aws.iot import IotCamera, IotHardwareBoard, IotCore
from diagrams.azure.iot import IotHub

첫 줄의 Diagram은 다이어그램을 나타내는 기본 개체로 필수적으로 포함되어야 한다.

Cluster는 동일한 노드나 일련의 하위 시스템을 그룹화한다.

 

설치된 diagrams 패키지에서 aws의 구성요소들을 주로 사용할 것이며 아래의 경로에 소스 파일과 이미지가 있다.

즉, diagrams.aws.database와 diagrams.aws.iot를 임포트하면 \venv\Lib\site-packages\diagrams\aws 경로에 있는 database.py iot.py의 소스를 포함한다.

2. 시스템 구성 요소 생성하기

 with Diagram("IoT System Architecture"):

다이어그램은 전역 다이어그램 컨텍스트로 다이어그램 생성자의 첫 번째 매개 변수에 출력 파일 이름을 넣어 만든다.

출력 파일은 모두 소문자로 변환되고 공백은 '_'로 치환되어 iot_system_architecture.png 이름으로 생성된다.

 

    legacyRouter = Router("legacy Router")
    iotPF = IotCore("oneM2M platform")
    myDB = DocumentDB("MongDB database") 

개별 구성요소 중 게이트웨이 뒷단의 플랫폼과 데이터 적재할 NoSQL DBMS를 생성한다.

구성요소는 노드로 표시되면 노드 개체는 provider, resource type 및 name의 세 부분으로 구성된다.

 

        with Cluster("WSN1"):
            iotDevice1 = IotCamera("IoT 장치1")
            iotDevice2 = IotHardwareBoard("IoT 장치2")

        with Cluster("WSN2"):
            iotDevice3 = IotCamera("IoT 장치3")
            iotDevice4 = IotHardwareBoard("IoT 장치4")

        with Cluster("IoT GWs"):
            iotGW1 = IotHub("Iot Gateway1")
            iotGW2 = IotHub("Iot Gateway2")

센서 별 디바이스를 만들어 디바이스 계층을 그룹으로 모으도록 클러스터를 사용한다.

 

3. 데이터 흐름 나타내기

아래 세 가지 연산들을 사용하여 노드들 간의 데이터 흐름을 표시한다.

  • >>: 노드들을 왼쪽에서 오른쪽으로 연결
  • <<: 노드들을 오른쪽에서 왼쪽으로 연결
  • -: 노드들을 방향없이 연결

즉, iotDevice1에서 iotGW1로 데이터 흐름을 표시하려면 아래와 같이 코딩할 수 있다.

iotDevice1 >> iotGW1

장치가 많이지면 모든 장치가 게이트웨이로 연결되므로 이런 경우 그룹화하는 것이 좋다.

[]로 그룹을 지을 수 있다.

 

    [iotDevice1, iotDevice2] >> iotGW1
    [iotDevice3, iotDevice4] >> iotGW2

    [iotGW1, iotGW2] >> legacyRouter >> iotPF >> myDB

위 코드는 장치 1, 2는 그룹화되어 iotGW1에 데이터를 전송하는 것을 나타낸다.

이상으로 간략하게 시스템 아키텍처를 만들어 보았으며 세부적인 제어는 아래 사이트를 방문하기 바란다.

 

https://diagrams.mingrammer.com/

4. 문제 해결

Graphviz 설치 후 경로가 인식되지 않을 경우 이미지 파일을 생성하지 못하고 오류가 발생할 때 아래 코드를 추가하여 해결한다.

 

 import os
 os.environ["PATH"] += os.pathsep + 'C:/Program Files/Graphviz 2.44.1/bin/'

즉, 강제로 환경 변수에 Graphviz 설치 경로를 추가하는 것이다.

 

반응형
Comments