Infrastructure as Code คืออะไร ทำไมถึงสำคัญมากในปัจจุบัน

เคยมั้ยเวลา Deploy โปรแกรมสักตัว เราจะต้องมานั่ง Provision Infrastructure ไหนจะ VM และ Settings อื่น ๆ อีกมากมาย มันจะดีกว่ามั้ยถ้าเรามีเครื่องมือบางอย่างที่จะ Automate งานที่น่าเบื่อเหล่านี้ออกไป และลดความผิดพลาดที่อาจจะเกิดขึ้น วันนี้เราจะพาทุกคนมาทำความรู้จักกับ Infrastructure as Code กัน

Infrastructure as Code คืออะไร ?

Infrastructure as Code (IaC) เป็นเทคนิคการที่เราใช้การเขียน Code เพื่อกำหนดลักษณะสำคัญเพื่อสร้างระบบขึ้นมาโดยอัตโนมัติ แทนที่จะเป็นการใช้มนุษย์ค่อย ๆ ทำทีละขั้นตอน โดย Code ที่เราเขียนจะสามารถนำมาใช้ซ้ำ ๆ ได้เรื่อยเมื่อเราเอามา Deploy หลาย ๆ ครั้ง ทำให้สามารถลดงานของทั้ง Developer และ DevOps ในการจัดเตรียมพื้นที่สำหรับการ Dev, Test และ Deploy Application ซึ่ง Infrastructure ที่เรากำลังพูดถึง ไม่ใช่แค่เรื่อง Database หรือพวก โปรแกรมต่าง ๆ เท่านั้นนะ เรากำลังพูดถึงอะไรที่ลึกกว่านั้นอีก เช่น Network, Security, OS และ Storage

ตัวอย่างเช่น Application ของเราออกแบบมาเป็น Microservice แยกส่วนเป็น Frontend, Backend และ Database แล้วต้องการยัดลงไปใน Google Cloud จากเดิมเราจะต้องไปนั่งสร้าง Service ขึ้นมาเองทีละตัว, กำหนด Security Policy และ Network Configuration ต่าง ๆ ให้กับแต่ละ Service ยังไม่นับการกำหนด Scaling Policy อีกสำหรับระบบที่มี Requirement ให้รองรับการ Scale และในแต่ละ Service เอง หากเป็นพวก VM เราจะต้องมานั่งกำหนด ขนาดของเครื่อง และภายในเครื่องเราจะต้องมาบอกอีกว่า มันจะมีโปรแกรม หรือ Runtime อะไรที่ต้องติดตั้งไว้ล่วงหน้าหรือไม่ ซึ่งงานในการ Setup ทั้งหมดนี้ในโปรแกรมขนาดใหญ่ มีจำนวน Service และเครื่องที่เกี่ยวข้องเป็นจำนวนมาก เป็นเรื่องที่กินเวลาเยอะมาก ๆ ต้องมานั่งคลิก ๆ ทีละขั้นตอน อะ รอมัน Deploy Config อีก กว่าจะติดตั้งนั่นนี่เสร็จ ก็จะกินเวลานานมาก ๆ ประกอบกับ บางที เราไม่ได้ทำครั้งเดียว เราอาจจะต้องทำบน Development, Stagging และ Production Site อย่างน้อย 3 ชุด ยังไม่นับว่า ถ้าอยู่ ๆ คุยกันบอกว่า เห้ย Env นี้ไม่เอาละ จะเปลี่ยนสเปกนิดนึง อะชิบหาย ต้องมานั่งระเบิดงานเดิม แล้วสร้างใหม่อีกแบบนี้ไปเรื่อย ๆ DevOps ด่าพ่องแน่นอน

แต่ถ้าเราใช้ IaC เราสามารถเขียน Definition ของแต่ละ Service ขึ้นมาได้ตรง ๆ เลยว่า เราอยากได้แบบไหน อยากได้อะไรบ้าง รวมไปถึงพวก Security Policy และ Scaling Policy ต่าง ๆ ใส่เข้าไปด้วย จากนั้น หากเราต้องการ Env นี้ใน Development ,Stagging และ Production Site สิ่งที่เราต้องทำมีเพียงแค่ กด Deploy เท่านั้น ทุกอย่างที่เรากำหนดไว้ใน Code ก็จะถูก Deploy ขึ้นมาเป็นระบบที่รันได้จริงทันที และหากบอกว่า เราจะเปลี่ยนแปลง เราก็แค่ Redeploy เดี๋ยวมันจะมานั่งคิดเองว่า มันต้องระเบิดอะไร เปลี่ยนอะไรบ้าง แล้วจัดการเอง เราไม่ต้องยุ่ง

พีคกว่านั้นคือ อยู่ ๆ เราอาจจะอยากเอา Application ของเราขึ้น Cloud แทนที่จะเป็น On-Prem ละ ถ้าเป็นเมื่อก่อน เราก็ต้องไปนั่งเข้าเว็บ ไปสร้าง Service ต่าง ๆ แต่ด้วย IaC เราสามารถเอา Code ที่ระบุสภาพแวดล้อมนี่แหละไปใช้ได้เลย แล้วตั้ง Target เป็น Cloud ที่เราต้องการ เราก็จะได้ Infra แบบเดิมที่เราตั้งไว้บน Cloud ได้เลย หรือกระทั่งถ้าเราเปลี่ยน Cloud Provider เราก็แทบไม่ต้องมานั่งเปลี่ยนอะไรมากเลย

ประโยชน์ของการใช้ Infrastructure as Code

การใช้งาน IaC มีหลากหลายประโยชน์ด้วยกัน แต่เราขอแบ่งประโยชน์ที่เราคิดว่ามันได้เต็ม ๆ มาสัก 3 ประโยชน์ด้วยกัน

  1. ลดความผิดพลาดในการตั้งค่าได้ เพราะการตั้งค่า และรายละเอียดต่าง ๆ ที่เราต้องการมันถูกทำแบบ Automation ทั้งหมดแล้ว ดังนั้นเรื่องโอกาสพลาดถือว่าน้อยกว่าการทำมือมาก ๆ โดยเฉพาะเมื่อเทียบกับการทำมือในจำนวนเครื่องเยอะ ๆ ไม่ว่าเราจะ Provision ยังไง เาก็จะได้ Config เหมือนเดิม 100% แน่นอน
  2. ลดเวลาในการทำงานได้ โดยเฉพาะเมื่อเราต้องดีลกับระบบที่มีขนาดใหญ่ มีการ Scale up ขึ้นลงอีก ถ้าเราต้องมานั่ง Scale มือ สร้าง ๆ ลบ ๆ ทีละเครื่อง น่าจะสิ้นก่อนแล้วละ แต่ด้วย IaC เราสามารถบอกมันได้ยันว่า หากจะ Scale มันจะต้องสร้างและ Config อะไรอย่างไรบ้าง แล้วพอทุกอย่างทำแบบ Automation ทั้งหมด นั่นแปลว่า ความเร็วมันมากกว่าการที่เรามานั่งก๊อป Command สำหรับการตั้งค่าทีละเครื่องแน่นอน ยังไม่นับว่า ถ้าต้องมานั่งทำหลักร้อยเครื่อง มาด่าพ่องแน่นอนละ
  3. รองรับการ Review และ Audit ได้เหมือน Souce Code ทั่วไป เพราะพอเราเขียน Definition ของ Infra ที่เราต้องการเป็น Code แล้ว เราสามารถใส่มันเข้ากับ Version Control ต่าง ๆ สำหรับการตรวจสอบปัญหาย้อนหลังได้เมื่อเกิดปัญหาบางอย่าง

ทั้ง 3 ข้อ สรุปออกมาเป็นประโยคเดียวสั้น ๆ คือ มันทำให้เรา Treat Infra ได้เหมือน Code รองรับการ Automate ยัดลงไปใน CI/CI Pipeline จะ Spin up กี่รอบก็ใช้เวลาไม่นาน

สรุป

เอาจริง ๆ นะ เราสนับสนุนให้ทีมทำ IaC จริง ๆ นะ หลังจากเรา Adopt มาใช้งานแล้ว เรารู้สึกว่า มันทำให้การทำงานง่ายขึ้น และลดโอกาสการเกิดข้อผิดพลาดในการ Provision Infra มหาศาลมาก ๆ (เจ็บกับเรื่องนี้มาแล้ว บรรทัดเดียวสยองไป 1 อาทิตย์) นอกจากนั้นยังสามารถลดการหยุมหัวระหว่าง Dev และ DevOps ได้ดีมาก ๆ ส่วน Tools ในท้องตลาดมีให้เราเลือกเลอะมาก ๆ แต่ตัวที่เราทดลองแล้วรู้สึกชอบมี 2 ตัวคือ Terraform ตัวนี้มันยืดหยุ่นในการทำงานมาก ๆ เราสามารถตั้งค่าได้หลากหลายสุด ๆ ตั้งแต่ On-Prem ง่าย ๆ ยัน Cloud ท่ายากนางก็เล่นได้หมดไม่หวั่น เรียกว่าสารพัดท่าเลยทีเดียว สิ่งที่ทำให้เราคิดว่าทั้งมันเริ่ดมาก ๆ คือ มันใช้ลักษณะการกำหนดลักษณะแบบ Declarative กล่าวคือ เราไม่จำเป็นต้องบอกชั้นตอนการสร้าง เราบอกแค่เราอยากได้อะไรที่ปลายทางเท่านั้น แนะนำจริง ๆ ว่าอยากให้ลองมาใช้ดู แล้วชีวิตคุณจะเปลี่ยนไป