สรุปงาน Cloud Talk ครั้งที่ 15 โดย Ascend (True)
Geek Alert!! ข้อมูลด้านล่างเป็นข้อมูลทางเทคนิคเยอะมาก และลึกมาก ผู้อ่านควรมีความเข้าใจเรื่อง Docker เบื้องต้น, Cloud เบื้องต้น, Micro Service และการ Scaling ระบบเว็บไซต์เบื้องต้นเพื่ออรรถรสในการอ่านให้เข้าใจมากขึ้น ผมจะพยายามอธิบายคร่าวๆ เท่าที่เป็นไปได้ แต่โดยเนื้อหาแล้วยังคงหนักไปทางเทคนิคมากครับ
เมื่อวานนี้ไปงาน Cloud Talk ที่ Office Ascend มาครับเพราะมีการตีแผ่สถาปัตยกรรมเบื้องหลังของระบบ True Money, iTruemart ที่ย้ายจาก Server ในประเทศไทยไปอยู่บน AWS มาเล่าให้ฟังครับ ซึ่งจากที่สอบถามเป็นการส่วนตัวเพิ่มเติมได้ความว่าได้รับโจทย์ว่าต้องมีการย้าย iTruemart ขึ้นไป AWS เพราะจะมีการออกโปรโมชั่น 1 บาท ซึ่งมั่นใจได้เลยว่าคนจะถล่มกันเข้ามาอย่างถาโถม ทางผู้บริหารต้องการมั่นใจว่าระบบจะต้อง Scale ได้อย่างรวดเร็วเมื่อคนแย่งกันซื้อโปร 1 บาทนี้โดยที่ Server ต้องไม่ล่ม การย้ายขึ้น Cloud AWS ของอเมซอนจึงเป็นทางออกของเรื่องนี้ ผู้พูดคือคุณกระแส่ วงศ์สวัสดิ์ เล่าว่าหลังได้โจทย์มาแล้ว 1 เดือนต่อมาก็เริ่มทยอยย้ายระบบ และใช้เวลาทั้งสิ้น 4 เดือนในการย้ายระบบส่วนใหญ่ขึ้นไปบน AWS โดยย้ายระบบไปประมาณ 60% ส่วน 40% ที่เหลือยังต้องอยู่ในไทยเพราะติดเรื่องข้อจำกัดทางกฎหมายว่าข้อมูล Transaction ส่วนที่เป็นกระเป๋าเงินอิเล็คทรอนิกส์ และข้อมูลการเงินบางส่วนต้องอยู่ในประเทศไทยเลยย้ายไปด้วยไม่ได้ ซึ่งทำให้ต้องใช้บริการ AWS Direct Connect ในการต่อตรงระหว่าง Server ที่ไทยกับ Server AWS ในการคุยกันระหว่าง Server เพื่อลด Latency ให้น้อยที่สุด
Docker คืออะไร? ก่อนจะเข้าเรื่องขออธิบายไว้ก่อนสำหรับคนไม่รู้จัก Docker ก่อน มันมีลักษณะคล้าย Virtual Machine ที่รันอยู่ในคอมพิวเตอร์ของเราเพื่อรัน OS ที่แตกต่างจาก OS ของเครื่องแม่ (Physical Server) แต่จุดต่างสำคัญที่ Docker แตกต่างคือ Docker จะใช้งานในส่วนของ Kernel (Core ของ Linux OS ทุกเจ้าซึ่งได้รับความนิยมในหมู่เครื่อง Server) ร่วมกันกับตัว Physical Server ทำให้ประหยัดทรัพยากรในการใช้งานมาก โดย Docker สามารถสร้าง OS จำลองนี้ขึ้นมาได้ซึ่งเราเรียกว่า Container และในเครื่อง Physical 1 เครื่องก็สามารถมี Container ได้หลายๆ ตัวพร้อมกัน หลังจากนั้นเรายังสามารถแพ็คใส่กล่องทำเป็น Image เพื่อย้ายไปเครื่อง Physical เครื่องอื่นๆ ได้ง่ายดาย ส่งผลให้สมมติเรามีเครื่อง Server จริงอยู่ 3 เครื่องแต่เราอาจจะสร้าง Container ไว้สำหรับงานที่แตกต่างกันหลายๆ งานโดยที่แยกส่วนของ Security ออกจากกันได้ขาด ทำให้จะลงโปรแกรมคนละเวอร์ชั่นใน Container คนละตัวกันก็ได้เพราะภายใน Container มันก็คือ OS แยกอีกตัวหนึ่งนั่นเอง ในขณะที่ถ้าเป็น Virtual Machine แบบเก่าที่หลายคนอาจจะเคยได้ยินในชื่อของ VMWare นั้นจะกินทรัพยากรเยอะกว่า Docker มากเพราะจำลองทุกอย่างแยกกันหมด ไม่มีส่วนที่ใช้งานร่วมกันเลย แต่ก็ไม่ได้หมายความว่า Virtual Machine จะไม่จำเป็นต่อโลกแล้วนะ เพียงแต่ในบทความนี้เราจะไม่ได้พูดถึงมันมากนัก
ถัดมาคือเรื่องของ Microservice ขออธิบายสั้นๆ แบบไม่ลงลึกว่ามันคือการออกแบบระบบให้แยกส่วนของฐานข้อมูลและระบบภายในแยกจากกันหมด และติดต่อกับอีก Service นึงผ่าน API เท่านั้นทำให้มีอิสระในการแก้ไขได้อย่างสะดวก และเวลา Service ล่มไปอัน Service อื่นๆ ก็ควรจะยังทำงานต่อได้ในตัวมันเอง เช่น Service กระเป๋าเงินอิเล็กทรอนิกส์, Service ระบบสมาชิก, Service E-commerce เป็นต้น
เนื่องจากการเกิดมาของ Docker ทำให้สถาปัตยกรรมแบบ Microservice นั้นเฟื่องฟูมากๆ เพราะแยก OS จากกันได้ขาดและเบา สามารถสร้างเป็น Image ย้ายเครื่องไปมาได้ง่ายขึ้นมาก จึงทำให้ Docker เป็น Core หลักในการบริหารจัดการระบบ Cluster บน Cloud อย่างแพร่หลาย
กลับมาเข้าเรื่องที่ฟังจากในงานกันต่อ เนื่องจาก AWS นั้นไม่มีเครื่องจริงที่เป็น Physical Server มีแต่เครื่อง Virtual Machine บน Cloud ให้ เราเลยต้องสร้าง Docker Container ขึ้นมาใช้แบ่งซอยเครื่องย่อยๆ ลงไปอีก เพราะในทาง Scaling แล้ว เราสามารถนำ Image ของ Docker ไปสร้างเครื่อง VM ในขนาดที่ใหญ่ขึ้น หรือเล็กลงได้ง่ายเพื่อประหยัดค่าใช้จ่ายในยามที่ Load ของ Server มากน้อยตามความเป็นจริง ลำดับชั้นของระบบควบคุมก็ตามภาพด้านบนครับ ในชั้นของ Container ไปจนถึง Physical Host (or VM) นั่นคือ 1 instance ใน AWS ครับ
ในส่วนของแต่ละชั้นจะอธิบายดังนี้
- Container Networking เนื่องจากมีการแบ่งแยกย่อย Container เป็นจำนวนมาก และแต่ละ Container ก็ไม่ได้ทำงานด้วยตัวคนเดียว ต้องคุยกันไปมาระหว่าง Container ได้ จึงต้องมีส่วนตรงนี้มาช่วยดูแลจัดสรรให้ เช่น Assign internal ip, วง network ที่สามารถมองเห็นกันได้ เป็นต้น
- Container Cluster Management ตรงนี้จะเป็นส่วนที่ใหญ่ขึ้นมาอีกชั้น คือทำหน้าที่จัดสรรทรัพยากร รวมไปถึง Load Balancer เวลาต้องการเพิ่ม Container เพื่อให้รองรับจำนวนคนที่เข้ามาใช้งานได้มากขึ้น แต่ยังเข้าจากทางเดียวกันอยู่ก็จะเป็นหน้าที่ในส่วนนี้
- Service Discovery คือส่วนที่ทำหน้าที่ตรวจสอบว่ามี Container อะไรเกิดใหม่บ้าง แล้วยังสามารถทำงานได้ดี (Healthy) หรือเปล่า ต้องระบุได้ว่า image ที่รันอยู่ version อะไร ประกอบด้วยอะไรข้างในบ้าง ซึ่งจะเป็นประโยชน์ในขั้นตอนการ Rollback หรือตรวจเช็คว่าปล่อย feature อะไรไปใน production ขณะนี้
- Container Scheduling อันนี้ผมไม่แน่ใจ แต่คิดว่าน่าจะเป็นส่วนของ Auto Scaling ว่าถ้ามีการใช้งาน Load มากเกินเท่านี้ๆ แล้วให้สร้าง Container ขึ้นใหม่
- Application Scheduling ก็คือ Cronjob หรืองานที่สั่งในระดับ Application ทั่วๆ ไป
- Configuration Management คือการควบคุมตั้งค่าต่างๆ ของทุกอย่างในระบบให้ตั้งค่าได้ถูกต้อง ได้ง่าย คล้ายมีศูนย์ปฏิบัติการแค่ 1 แห่งแต่สั่งการไปยังเครื่องลูกได้ทุกที่ ไม่ต้องเข้าไปที่เครื่องลูกแต่ละเครื่องเพื่อแก้ไขโดยตรง
อันนี้คือระบบของ OpenShift ซึ่งเป็นระบบ Cluster Management อีกเจ้าที่ไม่ใช่ของ Amazon ครับ โดยเป็นระบบที่สร้างขึ้นมาโดยใช้ Kubernetes เป็นฐานด้านล่าง มีโครงสร้างตามรูป ส่วนของ Persistent Storage คือพื้นที่เก็บข้อมูลที่จะยังคงอยู่ตลอดไม่หายไป แม้จะมีการทำลาย Instance แล้วสร้างใหม่ของ Cloud และ Registry คือ Docker Image Repository
ในส่วนนี้ Consul คือ service discovery monitor ว่ามี container เกิดใหม่ที่ไหนอย่างไรบ้าง และ Registrator ไว้ช่วย update config ของ load balance (เช่น nginx) ให้ถูกต้อง
ก่อนจะไปในส่วนเนื้อหาของ AWS บอกไว้ก่อนว่าหากเราไม่อยากจ่ายเงินให้ Amazon เราสามารถทำระบบ Private Cloud Cluster ใช้กับ Physical Server ตัวเองก็ได้โดยใช้ Docker Swarm หรือ Kubernetes ซึ่งเป็น Open Source มาเป็นฐานในการทำระบบข้างบนทั้งหมดเองได้ แต่ก็จะกินเวลาในการทำมากพอสมควรเพราะระบบจะไม่ได้มีพร้อมครบทุกอย่างแบบ AWS ครับ
AWS ณ ตอนนี้มีระบบจัดการ Cluster Container ที่รวบเรียกว่า ECS (Amazon EC2 Container Service) ซึ่งมันก็คือ Container Cluster Management ในภาพแรกสุดนั่นเอง จัดการให้ตั้งแต่นำ Docker image ไปเก็บไว้ที่ ECR ไปจนถึงระบบ Auto Scaling ซึ่งจะ Scale ได้ 2 ระดับคือระดับ Container และระดับ Instance (VM) และส่วนของ Replicate อัตโนมัติ ซึ่งตัวระบบ ECS เราไม่ต้องจ่ายตังให้ Amazon เพิ่มแต่อย่างใด เราจ่ายแค่ค่า EC2 ตามปกตินั่นเอง ฟังดูดีแต่จริงๆ มันมีที่อื่นที่เก็บเงินแหละ
ทีนี้มาดูสถาปัตยกรรม Cluster Management ของ Amazon กันบ้าง (ก่อนหน้านี้คือในระบบ Cluster ทั่วๆ ไป) ECR เอาไว้เก็บ Docker image ส่วน Task Definition คือ spec ของ container ที่จะสร้าง (Memory, CPU, Network)
จะมีส่วนเพิ่มเติมคือ Amazon มีส่วนของ Amazon Machine Images (AMI) ซึ่งก็คือ EC2 ที่เป็น template ของ amazon เอง setup ระบบที่เชื่อมกับระบบต่างๆ ของ AWS ไว้หมดแล้ว ทำให้สามารถเริ่มใช้งาน ECS ได้อย่างรวดเร็ว แต่หากมันทำงานไม่ได้ดั่งใจเราก็สามารถสร้าง EC2 ขึ้นมา setup ระบบของ ECS เพื่อใช้งานแทน AMI แทนก็ได้เช่นกัน
นอกจากนี้ยังมี Application Load Balancer (ALB) เพื่อจัดการบริหาร Service ภายในได้อย่างสะดวกโยธิน แต่อันนี้แหละที่ต้องเสียเงินเพิ่ม
ในส่วนของการบริหารจัดการ Image ซึ่งต้องผ่านการรัน CI/CD เพื่อทดสอบให้ผ่านก่อนนำไปใช้จริงเสมอ จะแบ่งเป็น 3 level คือ
- Base Image คือ Image ตั้งต้นพื้นฐานที่เอามาสร้างระบบของเราเอง
- Middleware Image คือ Image ที่ปรับแต่งจาก Base Image ให้รองรับระบบพื้นฐานของเราเองตามต้องการ
- Application Image คือนำ Middleware Image มากำหนดหน้าที่และใส่รายละเอียดงานเฉพาะทางที่พร้อมจะรันในแต่ละ Cluster เรียบร้อยแล้ว
Flow การ Deployment ตามรูปเลย ซึ่งต้องมีการแยก Application Config ออกจาก image เพื่อความสะดวกในการแก้ไข Container เนื่องจากเป็นส่วนที่มีการแก้ไขบ่อยที่สุดตามแต่สถานการณ์
สำหรับขั้นตอนการ Deploy ก็จะเป็นแบบ Blue-Green Deployment ก็คือสร้าง Service แยกออกมาและทำการ Health Check ให้เรียบร้อยว่าไม่มีปัญหาอะไร พอผ่านและ setup config ทุกอย่างพร้อมค่อย switch ตัว Load Balance มาชี้ที่ Service ตัวใหม่ หลังจากนั้นค่อยทำลาย Service ตัวเก่าทิ้ง ซึ่งสุดท้ายก็จะทำให้ระบบไม่เกิด Downtime เลย (Zero Downtime) นั่นเอง
สรุปหากต้องการใช้ระบบ ECS จะมีส่วนที่ต้องจ่ายเงินเพิ่มจากปกติคือ ALB, ECR และ Cloudwatch หากต้องการใช้ Auto-Scaling
และในส่วนของ Monitoring นี้เองที่ ECS ให้มาแค่ CPU และ Memory ของแต่ละ Container ซึ่งหากเราอยากได้ข้อมูล Monitor ที่มากกว่านั้นต้อง setup ลง Grafana + Prometeus + Node Exporter เพื่อดูกราฟส่วนอื่นเพิ่มเติมเอาเอง
มีคำเตือนสุดท้ายจากทีมงาน บอกว่าเราจะได้ไม่ต้องเสียเวลาไปงมเอง
- 1 target group ต่อ 1 ALB เท่านั้น อย่าเกิน
- อย่าลืมแก้ไฟล์ /etc/ecs/ecs.config แก้ ECS_CLUSTER = acm-th-alp-cluster เพื่อให้ ec2 ที่สร้างมาเอาตัวเองเข้าไปอยู่ในระบบ cluster โดยอัตโนมัติ
- ใช้ image tag ในการ reference ไปยัง image ที่อยู่ใน ECR
- อย่าลืมแก้ไฟล์ task-definition.json แก้ “hostport”: 0 เพื่อให้ระบบ ECS ทำการ map host กับ port แบบ auto
- ECS ตอนนี้ยังขาดไปอย่างนึงคือระบบ Hardening (Update Security) อัตโนมัติ ตอนนี้ยังต้องทำมืออยู่ แต่ในอนาคตคาดว่าคงจะมีมาให้
- การ set cpu ในระบบ cluster ไม่ได้คิดเป็น core เช่นอยากได้ 0.5 core ต้องใส่ 512 mb
- วิธีเริ่ม scaling infrastructure ให้เริ่มจากเครื่องเล็กๆ หลายเครื่องแล้วเบิ้ลเครื่องไปสองเท่า ดูว่าผลลัพธ์ ok ไหม ถ้าเบิ้ลเครื่องแล้วเริ่มไม่คุ้มค่อย optimize code แสดงว่าเป็นความผิดที่ code
สุดท้ายช่วงขายของของ Amazon
- Amazon Athena คือระบบที่เราโยนไฟล์ excel, csv, text และข้อมูลในรูปแบบอื่นๆ ลงไปกองๆ รวมกันแล้วเราจะสามารถ query ข้อมูลทั้งหมดผ่าน SQL แทนได้
- Amazon Rekonition คือ API Service ที่ให้เรา upload รูปไปให้ Amazon เช็คให้ว่าในรูปนั้นมีองค์ประกอบอะไรบ้าง ในงานคนพูดทดลอง Upload รูปนางแบบในชุดชั้นในเข้าไป ระบบก็สามารถแยกแยะได้ถูกว่าในรูปมี Human, เตียง, เก้าอี้ และบรา ได้อย่างถูกต้อง 555
- Amazon Polly คือ Speech Recognition เหมือนของ Google แต่ทำเป็น API มาให้เราเรียกใช้ได้
- Amazon Lightsail เหมือน Digital Ocean
- AWS AppSteam 2.0 บริการเรียกใช้ App ใน VM (ส่วนใหญ่จะเป็น Windows) โดย Steam ส่งตรงมายัง Browser เป็น HTML5 ไม่ต้องใช้ Remote Desktop เข้าไป จ่ายแค่ค่าเครื่อง Windows Instance
- AWS CodeBuild ตามชื่อเลยครับ ช่วย Build ทำ CI/CD ได้ตามสะดวก และ Build Docker Image ได้ด้วย
- AWS X-Ray บริการเก็บข้อมูล HTTP Request ทุก Request มาวิเคราะห์เป็นกราฟ
- VMWare on Cloud ก็ตามชื่อครับ จะยก VMWare ไปใช้บน AWS ได้เร็วๆ นี้
- EC2 System Manager
- Amazon Pinpoint ตัวช่วยจัดการ Service ของมือถือเช่น Notification
- AWS Artifact ตัวออกใบรับรอง Certificate ทาง IT ต่างๆ เพื่อใช้ในทางกฎหมาย
- AWS Organization เอาไว้บริหารจัดการ Cloud เป็นลำดับชั้น เหมาะกับเฉพาะคนที่จะเอา Cloud ไปแบ่งขายต่อเท่านั้นแหละ
- Amazon Shield บริการป้องกัน DDos เหมือน Cloudflare
หมดแล้ว ยาวมาก ขอบคุณที่อ่านจนจบครับ 555