ใช้ Python เพื่อวาด Diagram (as Code)
Use Python for Drawing Diagram (as Code)
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (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">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</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 บทความนี้ให้ผมด้วยนะครับ ขอบคุณมากครับ