การใช้ Terraform ใน Azure DevOps CD Pipeline
หลังจากที่เราได้ทำความรู้จักกับ Terraform ไปในบทความ “มาใช้ Terraform กันเถอะ” ซึ่งเราได้ลองสร้างและรัน Terraform script ที่เครื่องตัวเองไปแล้ว
วันนี้เราจะขยับไปอีกขั้น โดยการนำ Terraform ไปใช้ใน CD pipeline กันคร้าาา
ประโยชน์ของการใช้ Terraform ใน CD Pipeline
เรารู้แล้วว่า Terraform สามารถจัดการ infrastructure ได้ด้วย configuration syntax ที่สั้นและเข้าใจง่าย เมื่อเรารันเสร็จ เราจะมั่นใจได้เลยว่า Infrastructure ของเราอยู่ในสถานะที่เรา config ไว้และพร้อมใช้งานแล้ว
ข้อดีข้างต้นเหมาะมากที่จะนำมาใช้ใน CD Pipeline โดยให้ Terraform เช็คสถานะและจัดการ resources ให้พร้อมก่อน deploy app ในขั้นต่อไป
การทำแบบนี้มีประโยชน์มาก โดยเฉพาะในการสร้าง environment ที่ไม่ถาวร (เช่น Test/QA environment ที่เราจะสร้างเมื่อเราต้องการเทสระบบและลบทิ้งเมื่อใช้เสร็จ) เพราะเราสามารถนำทั้งระบบขึ้นมาได้เพียงแค่กด Release Pipeline ที่เราสร้างไว้ คลิกเดียวทั้งระบบพร้อมใช้งาน เย้!!
วิธีใช้ Terraform ใน Azure DevOps CD Pipeline
ในที่นี้ เดาว่าทุกคนคงเคยลองเล่น Azure DevOps และได้สร้าง CI/CD Pipeline กันมาบ้างแล้วใช่ไหมคะ? หากยังไม่เคย แนะนำให้ลองทำตามบทความนี้เลยค่ะ อธิบายไว้ดีและเข้าใจง่ายมากค่ะ
ต่อไปเรามาลองสร้าง CD Pipeline ที่มีการรัน Terraform เพื่อสร้าง resources กันนะคะ
เราจะมาดูกันว่าในขั้นตอน Create Resources
นั้น เราต้องทำยังไงบ้าง
ก่อนอื่นเรามาดูภาพใหญ่ก่อนว่าเรากำลังจะทำอะไรกัน แล้วค่อยทำตามทีละ step ต่อไปนะคะ
จากภาพใหญ่ เราจะเห็นว่าใน stage Create Resources
นั้น ประกอบด้วย 3 ขั้นตอนดังนี้
- ติดตั้ง Terraform CLI บน agent
- สร้าง Terraform workspace
โดยในขั้นตอนนี้จะมีการใช้ Terraform script ร่วมกับไฟล์ state ของ Terraform
- ในที่นี้เราเก็บ script ไว้ใน Git Repository ซึ่งตอนรัน pipeline จะถูก fetch มาเป็น artifact
- เราเก็บไฟล์ state ไว้ใน Azure Storage Blob container ที่สร้างไว้แล้ว โดย state ของแต่ละ resource group จะถูกเก็บแยกคนละ container โดยตั้งชื่อ container ให้เป็นชื่อ resource group ไปเลยจะได้จำง่าย - ตรวจสอบสอบว่า Terraform script เขียนถูกต้องและใช้งานได้ จากนั้นก็รัน script เพื่อสร้าง resources บน Azure
- ในการรัน จะใช้ 3 ไฟล์ร่วมกัน คือ main.tf (configuration script) และ variables.tf (variables definition) ใน artifact ร่วมกับไฟล์ terraform.tfstate (terraform state)
- ในที่นี้เราจะสร้าง resource group ชื่อ mwp-dev-com จากนั้นสร้าง app service plan ชื่อ test-appserviceplan และ app service ชื่อ test-appservice
พอเข้าใจภาพรวมแล้วใช่ไหมคะ ว่าเรากำลังจะทำอะไรกัน?
ต่อไปเรามาดูคร่าวๆก่อนนะคะว่า Terraform scripts ที่เราจะใช้หน้าตาเป็นยังไงบ้าง
ทีนี้มาดูกันว่าในแต่ละขั้นตอน เรา config Azure DevOPs ยังไงค่ะ
1. Install Terraform on the DevOps agent
เพื่อติดตั้ง Terraform CLI บน agent
2. Run Terraform Init
เพื่อสร้าง Terraform workspace โดยในขั้นตอนนี้จะมีการใช้ Terraform script ร่วมกับไฟล์ state ของ Terraform
ในการระบุ AzureRM backend configuration เราใส่ข้อมูลของไฟล์ state เข้าไป เมื่อรันขั้นตอนนี้ terraform จะสร้างไฟล์ใหม่ตามชื่อที่ระบุให้หากยังไม่มีไฟล์นั้นใน container ที่ระบุ
Note: Terraform backend คือการระบุให้ terraform อ่าน state จากไฟล์กลางที่แชร์กันในทีม สำหรับ Azure เราสามารถเก็บไฟล์ state ไว้ใน Azure Storage Blob Container ได้ โดยทุกครั้งที่รัน Terraform จะล็อกไฟล์ไม่ให้แก้ไขได้จนกว่าจะรันเสร็จ เพื่อให้ไฟล์ state สมบูรณ์และแสดงสถานะของ resources อย่างถูกต้อง
สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับ Terraform Backend ได้ที่
https://www.terraform.io/docs/backends/index.html
https://www.terraform.io/docs/backends/types/azurerm.html
3. Run Terraform validate and apply
เพื่อตรวจสอบสอบ Terraform script และรันเพื่อสร้าง resources บน Azure
4. Variables
ในการรัน Terraform script นั้น เราสามารถระบุค่า input variables ได้หลายรูปแบบตามนี้ ซึ่งวิธีหนึ่งที่ทำได้คือการใช้ environment variables โดย Terraform จะอ่าน variables ที่ขึ้นด้วย TF_VAR_xxx
ตามตัวอย่างด้านล่าง
Note: จริงๆแล้ว Terraform สามารถตั้งชื่อ variables ด้วยตัวเล็กหรือใหญ่ก็ได้ แต่ใน Azure Pipeline จะแปลงทุกตัวเป็นตัวใหญ่หมด เราจึงจำเป็นต้องใช้ตัวใหญ่ใน variables.tf ไปด้วย
เย้! เพียงแค่นี้เราก็ได้ Azure DevOps Release Pipeline ที่สามารถสร้าง resources ขึ้นมาในคลิกเดียวแล้ว
และเมื่อเราไม่ได้ใช้ environment นั้นแล้วเราก็แค่ลบ resource group ทิ้งได้เลย พอจะเอาขึ้นมาใหม่ก็กด Release อีกรอบก็เรียบร้อย เพราะ Terraform ฉลาดพอที่จะรู้ว่า Resources ถูกลบไปแล้วและสร้างให้ใหม่โดยที่เราไม่ต้องทำอะไรเพิ่ม
สุดยอดไปเลยใช่ไหมคะ Terraform เนี่ย :>