ใช้ Python เพื่อวาด Diagram (as Code)

Use Python for Drawing Diagram (as Code)

Nopnithi Khaokaew (Game)
3 min readMar 25, 2021

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

ผมเองพยายามทำให้งานทุกอย่างเป็น … as code ทั้งหมด แน่นอนว่า diagram ของผมก็เก็บไว้บน Git repository อยู่แล้ว เพราะผมใช้ draw.io ซึ่งตัวไฟล์มันเป็น XML-based แบบนี้

<mxfile modified="2021-03-25T03:25:55.006Z" host="app.diagrams.net" agent="5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36" etag="A1uR2PbEoSHNft0VzZwM" version="14.5.1" type="device"><diagram id="Ht1M8jgEwFfnCIfOTk4-" name="Page-1">7ZxZc6M4EIB/TR4nhS4Ejz7ibKpma1OVnZrHlAIKZoORF+Qc8+tXMsLGyGcGY7aC/WBo3epPTatF+QqNZu+3GZtP/xQhT66gE75fofEVhAB4rvrRko9CQh1QCKIsDk2mteAh/sWN0DHSRRzyfCOjFCKR8XxTGIg05YHckLEsE2+b2Z5FstnqnEXcEjwELLGlP+NQTstxuf464Q8eR1PTtAdpkTBjZWYzknzKQvFWEaGbKzTKhJDF1ex9xBM9eeW8FOUmO1JXHct4Ko8p8OPm1/2PweCvu2zyLc69iIzov98A9Ezv5Ec5ZB6qGTC3IpNTEYmUJTdr6TATizTkul5H3a3zfBdiroRACf/hUn4YdbKFFEo0lbPEpOaSZXKg1aPbmPO0lE3iJDHV8jSs5VCSSnouM/GyUgpcSUYiEdlyJMhz9Fel2HNlpi8Xiyzg+ybIMYpWvYu43JcT4CKnnr9KI0Ybt1zMuMw+VIaMJ0zGr5uEMQNqtMpniqpJYB+VDHMRpzKv1HyvBSqDWXMIONekqNOsOewCI5kcXQZRd7OMuih6Ut5VhrQWLZk7iT/c87eXv9IQHsEf6AZ/Tp0liA/yZ5UBDmiHP9rz1xR/XbF/oM6fd9j+1cugus08F3+k528/f+Bo/mAn+CPooC37TJlz8ef2/O3nD13O/lV0/xnV+r1q96sWH61a0g3TYrvp/kHTcrjMmUwLcnr+9vNHjubP7QR/1HE2SSJwL3v1/AS1gR3osWsKO9oN7KBlwg5GNOwywIXtmD3Y89cUf343+HNrZo8eMHu1/NBz2uAO9dw1xF0Zsr88d3W7dzCSYZfBgLRj9/pIbmP8dSOSS/Hp2w27zDq2cWb+jLPyypKFmZCLA5mKlHcYSHr0g9hrGsjfC22gPrTR8VMjyzCozeA19LCLXYQ9TIm/6SIph96lLqYO8Ty1r0TuZv3FiE2Ve8wPhrDu9kN87UAfK9qL6ms1FzNk1dzAqcMRp671Msryt2Ircb9H7m7Ud0cczz5WVa6edu8Q9RFwEDbRldPXDPCusUsIoKayzUc+pmW7DS8ZAv26e0Fawv/ynkHH8b90ZNyGlFBrL+TWwTyWeOLbGyursqYo3/JqzSdi9vUy51oZfRCh48fRRzwYwNqvOHllUO9wZU2tDPvQu+7+fKbMmVZG+R5gZXsZMsmUJGEvXP2Mvt9Za0csZBKnisHy5VRNX5SxMFbklWSaTeKzWIsUrASToYstjMvMCvwq2dQHvqvkIcunq5X4yjMZB2odsiee3Is8lrFQC2f8JKQUs0qGQRJHOkHq9Tpk5i5QfeTZ5krVnTTLGMDy3oxXN8nyeTHQ5/hd92OYT9lcJ87eI/2C8DV7y/G16vxCDYvp/jyGPH8pGl4Cw7ObV665KRpMdN+HLHiJllamMubn5WffatbD4+9X+9Zembonaua8Vd77LQ+0ppVXfv2zbXPLXdxO5gKR5kJNfs/d6dylQsbPqhdF5zoFH1zZtIPweeeDD1jwDWbsl5osHR53E9WB4VOmriJ9NRJRGqvn+lEk1pBT34numUWoSpsQTLFfSRvHmaqoACrVvoZN5YgCBCbbPICV2v4fvGa8eG7fBUtE1W1xtZkrMFPfFq8Y1GMsFG/BlXo2raXsDLRCm9Zg6VVZqBYECdNqD2u7sCZiET6GKxW0BS1x645tF6BFFrTf2ewpZM2TSb0bB59G5tghI0C/DJlJMfNHAZnPWRCn0d/L/S1qyKxaQQkItrkBLSOKd3sBg/s727reMsnf9D6wntA40z4m4wk8jWkyQM6QfBmm2Tx+jIxC2rK0yLXCuohenmOy09TWQX1epAVFjQK7fQO1w8aazJ1DcdsmaSuehTF9XE1la495z4qcdgE+d7cRfbAjrr9rGF1noEZ9mmGElOpufhXDmKPWkPR0fNZZf+AGnqADXqj94szg54MS3Or7/qndOpzRUg/dwBOiy/Pp7XFB5ZSnzW+XekgPu5bFzLeFqb/l4KcDaNqHQiWaVtTpI2UzMR62sDHCY6oST6NXffDQ/zL0hktthE+f2O6TNuwuxPDicEP79GkX3DcJy5W2HzjLgqmd/MCz1zjYEortDXf76PNCV/lSV4+5UU033I31v85cEPvd517WoZcOZv9kchvzjaM9QRh7J6I9HAFEvs6ubnm48LbURzd4xv4ZI7jqdv3vYcV7Luv/YEM3/wE=</diagram></mxfile>

แต่จากข้างบนจะเห็นว่า code มันอ่านยาก มองภาพไม่ออก แถมเราจะต้องวาด diagram ด้วยมือผ่าน web GUI อีกต่างหาก จนกระทั่งผมมาเจอตัวนี้เข้า…

Diagrams คือ Python package ที่ช่วยให้เราสามารถเขียน Python เพื่อใช้วาด diagram ได้กลายเป็น Diagram as Code ซึ่งเค้ามี stencil ของ cloud เจ้าใหญ่ ๆ เอาไว้แทบทั้งหมด เช่น AWS, Azure, GCP, Kubernetes และอื่น ๆ (เรายังสามารถ custom เองได้ด้วย)

สิ่งที่ต้องการ

  • Python เวอร์ชั่น 3.6 ขึ้นไป
  • ติดตั้ง Graphviz บนเครื่องเราให้เรียบร้อย

เริ่มกันเลยดีกว่า

สร้าง project directory

mkdir diagrams_tutorial
cd diagrams_tutorial

สร้าง Python virtualenv และ activate มันซะ

python3 -m venv venv
source venv/bin/activate

ติดตั้ง diagrams

pip install diagrams

สร้างไฟล์ diagram1.py ขึ้นมาแล้วใส่ code นี้ลงไป

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

with Diagram('MyDiagram1', show=False):
ALB('MyALB') >> EC2('MyEC2') >> RDS('MyRDS')

หลังจาก run เราจะได้ไฟล์ diagram1.png ขึ้นมาใน root ของ project

หรือประมาณนี้

from diagrams import Diagram, Cluster
from diagrams.aws.general import Users
from diagrams.aws.network import ALB, Route53
from diagrams.aws.compute import EC2Instance
from diagrams.aws.database import RDS


def generate(name, num_of_instances):
with Diagram(name, direction='TB', show=True):
with Cluster('Auto Scaling Group'):
app_group = [EC2Instance('App') for _ in range(num_of_instances)]
rds_master = RDS('DB (Master)')
rds_standby = RDS('DB (Standby)')
Users('Users') >> Route53('Route 53') >> ALB('ALB') >> app_group >> rds_master
rds_master - rds_standby


if __name__ == '__main__':
name = input('Diagram name: ')
num_of_instances = input('Number of instances: ')
generate(name, int(num_of_instances))

จะได้ไฟล์ test1.png ออกมาแบบนี้

ใครสนใจก็ลองไปดู document เพิ่มเติมได้ครับ

ถ้าคิดว่าบทความนี้มีประโยชน์ ฝากกด clap, follow และ share บทความนี้ให้ผมด้วยนะครับ ขอบคุณมากครับ

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.

No responses yet