จัดการระบบคลาวด์หลายภูมิภาคด้วย Terraform modules หลีกหนีกับดัก Copy-Paste
เรียนรู้วิธีเปลี่ยนจากการคัดลอกโฟลเดอร์ Terraform แบบเดิมๆ มาเป็นการใช้ Shared Modules เพื่อจัดการโครงสร้างพื้นฐานหลายภูมิภาคให้มีประสิทธิภาพและลดความผิดพลาด

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- การคัดลอกโฟลเดอร์ Terraform แยกแต่ละภูมิภาคทำให้ดูแลรักษายากและเสี่ยงต่อความผิดพลาด
- ทางออกคือการสร้าง Shared Module และแยกค่าความต่างออกมาเป็นชุดข้อมูล
- การเพิ่มภูมิภาคใหม่ทำได้ง่ายเพียงแค่สร้างไฟล์คอนฟิกูเรชันขนาดสั้น 5-6 บรรทัด
- หลักการสำคัญคือแชร์วิธีทำ (how) แต่แยกพื้นที่ตั้ง (where) ออกจากกันเพื่อความปลอดภัย
การบริหารจัดการโครงสร้างพื้นฐานไอทีในหลายภูมิภาคพร้อมกันมักเริ่มต้นด้วยวิธีง่ายๆ เช่น การสร้างเครื่องเสมือน (Virtual Machine) หนึ่งเครื่องต่อหนึ่งภูมิภาคโดยรันบริการชุดเดียวกัน เมื่อระบบเติบโตขึ้น การตั้งค่าผ่าน Terraform มักจะขยายตัวตามธรรมชาติ จนกระทั่งเมื่อต้องการเพิ่มภูมิภาคใหม่ วิธีที่หลายคนคุ้นเคยคือการคัดลอกโฟลเดอร์ของภูมิภาคเดิม เปลี่ยนชื่อบางจุด และปรับค่าที่แตกต่างกันออกไป เช่น ตำแหน่งที่ตั้ง ช่วงเครือข่าย และการตั้งชื่อทรัพยากร
หลังจากทำซ้ำเช่นนี้ไปจนถึงภูมิภาคที่สาม โครงการจะมีโฟลเดอร์ที่เกือบจะเหมือนกันทุกประการยาวหลายร้อยบรรทัด โดยมีเนื้อหาที่แตกต่างกันจริงเพียงแค่สิบบรรทัดเท่านั้น ปัญหาจะเกิดขึ้นเมื่อต้องการปรับแก้โครงสร้างพื้นฐาน เช่น การเพิ่มแท็ก ปรับขนาดดิสก์ หรือแก้ไขรูปแบบการตั้งชื่อ ผู้ดูแลระบบจะต้องตามไปแก้ในทุกๆ โฟลเดอร์ด้วยความระมัดระวังเพื่อไม่ให้หลงลืมหรือสร้างความไม่สอดคล้องกันระหว่างระบบในแต่ละภูมิภาค
กับดักการคัดลอกและวาง (Copy-Paste Infrastructure Trap) นี้ให้ความรู้สึกว่ารวดเร็วในตอนเริ่มต้น แต่ต้นทุนการดูแลรักษาจะพุ่งสูงขึ้นทุกครั้งที่มีการขยายระบบ การรวมศูนย์โค้ดให้เป็นมาตรฐานเดียวกันจึงเป็นกุญแจสำคัญในการลดภาระทางเทคนิค (Technical Debt) ในระยะยาว
แนวทางแก้ไขปัญหานี้คือการเลิกมองว่าแต่ละภูมิภาคเป็นโครงการ Terraform แยกขาดจากกัน แต่ให้มองว่าคำนิยามโครงสร้างพื้นฐานคือโค้ดชุดเดียวกันที่ใช้ร่วมกัน โดยแยกความแตกต่างให้อยู่ในรูปของข้อมูล โดยมีองค์ประกอบหลักดังนี้:
- Shared module: โมดูล Terraform หนึ่งชุดที่รวบรวมนิยามทรัพยากรทั้งหมด เช่น VM ระบบเครือข่าย และดิสก์ พร้อมตัวแปรรับค่าสำหรับส่วนที่เปลี่ยนแปลงตามภูมิภาค
- Shared entry point: จุดเริ่มต้นราก (Root configuration) เพียงชุดเดียวที่เรียกใช้งานโมดูล แทนที่จะมีโครงสร้างรากแยกตามภูมิภาค
- Regional config file: ไฟล์คอนฟิกูเรชันขนาดสั้นเพียง 5 ถึง 6 บรรทัดต่อหนึ่งภูมิภาค ระบุเฉพาะค่าเฉพาะตัว เช่น ตำแหน่งคลาวด์ ชื่อทรัพยากร และช่วงเครือข่าย
การเพิ่มภูมิภาคใหม่จึงทำได้เพียงแค่เพิ่มไฟล์คอนฟิกูเรชันขนาดเล็กหนึ่งไฟล์ โดยไม่ต้องเขียนโค้ดทรัพยากร Terraform ใหม่ ไม่ต้องสร้างไปป์ไลน์ใหม่ และไม่มีการคัดลอกเปลี่ยนชื่อโฟลเดอร์อีกต่อไป สิ่งนี้ไม่เพียงแต่ช่วยลดความซ้ำซ้อนของโค้ด แต่ยังช่วยยกระดับความถูกต้องแม่นยำของระบบอีกด้วย

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
"The pattern is share the how, isolate the where it lands. Sharing a module is safe. Sharing a blast radius is not."
Dev.to Tech Author
สิ่งสำคัญที่ควรตระหนักคือ การใช้โค้ดร่วมกันไม่ได้หมายความว่าต้องแชร์ทุกสิ่งทุกอย่างเข้าด้วยกัน แต่ละภูมิภาคยังคงรักษาขอบเขตความเป็นอิสระของตนเองไว้ แนวคิดหลักคือการแชร์วิธีการทำงานแต่แยกขอบเขตความเสียหาย (Blast radius) ออกจากกันอย่างเด็ดขาด เนื่องจากความปลอดภัยเป็นสิ่งที่ไม่ควรนำมารวมศูนย์ไว้ที่จุดเดียว
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น