การใช้ Terraform ใน Azure DevOps CD Pipeline

Rachanee Saengkrajai
3 min readNov 3, 2020

--

หลังจากที่เราได้ทำความรู้จักกับ 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 ใน CD Pipeline

วิธีใช้ Terraform ใน Azure DevOps CD Pipeline

ในที่นี้ เดาว่าทุกคนคงเคยลองเล่น Azure DevOps และได้สร้าง CI/CD Pipeline กันมาบ้างแล้วใช่ไหมคะ? หากยังไม่เคย แนะนำให้ลองทำตามบทความนี้เลยค่ะ อธิบายไว้ดีและเข้าใจง่ายมากค่ะ

ต่อไปเรามาลองสร้าง CD Pipeline ที่มีการรัน Terraform เพื่อสร้าง resources กันนะคะ

เราจะมาดูกันว่าในขั้นตอน Create Resources นั้น เราต้องทำยังไงบ้าง

ก่อนอื่นเรามาดูภาพใหญ่ก่อนว่าเรากำลังจะทำอะไรกัน แล้วค่อยทำตามทีละ step ต่อไปนะคะ

การ Create Resources ด้วย Terraform ใน Azure DevOps

จากภาพใหญ่ เราจะเห็นว่าใน stage Create Resources นั้น ประกอบด้วย 3 ขั้นตอนดังนี้

  1. ติดตั้ง Terraform CLI บน agent
  2. สร้าง Terraform workspace
    โดยในขั้นตอนนี้จะมีการใช้ Terraform script ร่วมกับไฟล์ state ของ Terraform
    - ในที่นี้เราเก็บ script ไว้ใน Git Repository ซึ่งตอนรัน pipeline จะถูก fetch มาเป็น artifact
    - เราเก็บไฟล์ state ไว้ใน Azure Storage Blob container ที่สร้างไว้แล้ว โดย state ของแต่ละ resource group จะถูกเก็บแยกคนละ container โดยตั้งชื่อ container ให้เป็นชื่อ resource group ไปเลยจะได้จำง่าย
  3. ตรวจสอบสอบว่า 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 ที่เราจะใช้หน้าตาเป็นยังไงบ้าง

Terraform script สำหรับสร้าง resorce group และ app service
ไฟล๋ variable difinition

ทีนี้มาดูกันว่าในแต่ละขั้นตอน เรา 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 ที่ระบุ

ไฟล์ Terraform state ใน Azure Blob Storage

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 ตามตัวอย่างด้านล่าง

Pipeline variables

Note: จริงๆแล้ว Terraform สามารถตั้งชื่อ variables ด้วยตัวเล็กหรือใหญ่ก็ได้ แต่ใน Azure Pipeline จะแปลงทุกตัวเป็นตัวใหญ่หมด เราจึงจำเป็นต้องใช้ตัวใหญ่ใน variables.tf ไปด้วย

เย้! เพียงแค่นี้เราก็ได้ Azure DevOps Release Pipeline ที่สามารถสร้าง resources ขึ้นมาในคลิกเดียวแล้ว

และเมื่อเราไม่ได้ใช้ environment นั้นแล้วเราก็แค่ลบ resource group ทิ้งได้เลย พอจะเอาขึ้นมาใหม่ก็กด Release อีกรอบก็เรียบร้อย เพราะ Terraform ฉลาดพอที่จะรู้ว่า Resources ถูกลบไปแล้วและสร้างให้ใหม่โดยที่เราไม่ต้องทำอะไรเพิ่ม

สุดยอดไปเลยใช่ไหมคะ Terraform เนี่ย :>

--

--

Rachanee Saengkrajai
Rachanee Saengkrajai

Written by Rachanee Saengkrajai

Senior Software Engineer and Team Lead

No responses yet