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 ประโยชน์ด้วยกัน
- ลดความผิดพลาดในการตั้งค่าได้ เพราะการตั้งค่า และรายละเอียดต่าง ๆ ที่เราต้องการมันถูกทำแบบ Automation ทั้งหมดแล้ว ดังนั้นเรื่องโอกาสพลาดถือว่าน้อยกว่าการทำมือมาก ๆ โดยเฉพาะเมื่อเทียบกับการทำมือในจำนวนเครื่องเยอะ ๆ ไม่ว่าเราจะ Provision ยังไง เาก็จะได้ Config เหมือนเดิม 100% แน่นอน
- ลดเวลาในการทำงานได้ โดยเฉพาะเมื่อเราต้องดีลกับระบบที่มีขนาดใหญ่ มีการ Scale up ขึ้นลงอีก ถ้าเราต้องมานั่ง Scale มือ สร้าง ๆ ลบ ๆ ทีละเครื่อง น่าจะสิ้นก่อนแล้วละ แต่ด้วย IaC เราสามารถบอกมันได้ยันว่า หากจะ Scale มันจะต้องสร้างและ Config อะไรอย่างไรบ้าง แล้วพอทุกอย่างทำแบบ Automation ทั้งหมด นั่นแปลว่า ความเร็วมันมากกว่าการที่เรามานั่งก๊อป Command สำหรับการตั้งค่าทีละเครื่องแน่นอน ยังไม่นับว่า ถ้าต้องมานั่งทำหลักร้อยเครื่อง มาด่าพ่องแน่นอนละ
- รองรับการ 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 กล่าวคือ เราไม่จำเป็นต้องบอกชั้นตอนการสร้าง เราบอกแค่เราอยากได้อะไรที่ปลายทางเท่านั้น แนะนำจริง ๆ ว่าอยากให้ลองมาใช้ดู แล้วชีวิตคุณจะเปลี่ยนไป