Terraform เป็นเครื่องมือ IaaC (Infrastructure as a Code) ตัวนึงที่ดังมากฮะ ใช้จัดการ resource ต่างๆ ของ platform โดยเฉพาะพวก cloud ได้ครอบคลุมมากๆ ไม่ว่าจะสร้าง เปลี่ยน ปรับ ไปจนถึงลบทิ้งก็ทำได้ง่ายดาย และครั้งนี้ก็เป็นบล็อกเล่าเรื่องตอนแรกฮะ


ใช้ Terraform ทำไม?

Cloud providers รวมถึง GCP เค้ามีหลากหลายวิธีให้ลูกค้าของเค้าเองจัดการ resource และ service ต่างๆ เช่น web UI หรือ gcloud command หรือ REST API และก็รวมถึง Terraform เช่นกันฮะ แถม Terraform เองก็เป็นที่นิยมของ DevOps ในงานกลุ่มนี้เหมือนกัน

แล้วก็ตามชื่อเลยฮะ  "as a Code" นั่นคือเราสามารถจัดการ infrastructure ผ่านการเขียน source code ทำให้ได้ความสามารถอื่นตามมาด้วย ไม่ว่าจะเป็นการทำ Versioning เอาไปต่อ CI/CD และการทำ batching process ก็ได้เหมือนกัน เราไม่ต้องมานั่งคลิกๆ แล้วก๊อปแปะค่านั่นนี่ใส่ช่องนี่นั่นให้มึนหัวอีกต่อไป ลดปัญหา human-error ได้อีกด้วยฮะ

Terraform เป็น open-source ซึ่งพัฒนาโดย HashiCorp ดูจากลิงก์ข้างล่างนี้ได้เลยฮะ

Terraform by HashiCorp
Terraform is an open-source infrastructure as code tool that enables you to safely and predictably provision and manage infrastructure in any cloud.

Concepts

Terraform ทำงานด้วย tf scripts และนี่คือหลักการสำคัญๆ ที่ผมสรุปมาจากที่ได้ใช้งานจริงฮะ

  1. เราจะเห็น tutorial บอกให้เขียน main.tf เป็นจุดเริ่ม แต่จริงๆ แล้วมันต้องการแค่ 1 tf file เป็นอย่างน้อยฮะ ชื่อจะเป็นอะไรก็ได้ แต่ที่แนะนำแบบนั้นเพื่อให้อ่านแล้วรู้เลยว่านี่คือ file ตั้งต้นนะ
  2. จะมี file terraform.tfstate กับ terraform.tfstate.backup สองตัวนี้คือ state files และเราไม่ต้องไปยุ่งอะไรกับมัน เพราะมันใช้เก็บประวัติและสถานะของ Terraform ถ้าเราเผลอลบมันไป เราอาจจะต้องมานั่ง import ใหม่นะฮะ
  3. 1 folder จะมี state file แค่ชุดเดียว และนั่นหมายความว่า tf script ทุกตัวจะถูก execute ทั้งหมด และเราก็เลือกไม่ได้ด้วยว่าจะเอาหรือไม่เอาตัวไหนบ้าง

การติดตั้ง Terraform

เข้าไปที่ลิงก์ข้างล่างนี้ แล้วเลือกวิธีที่ตัวเองสะดวกนะฮะ ส่วนตัวผมถนัดใช้ brew แหละ

Install | Terraform | HashiCorp Developer
Explore Terraform product documentation, tutorials, and examples.

ขั้นตอนเริ่มต้นสุดๆ

1. init

ก่อนอื่นเลย เราจะต้องมี tf script ตัวแรกมาก่อน และขอให้มี keyword provider แบบนี้

ก็ตั้งชื่อ main.tf ตามมาตรฐานไปนะฮะ (และเราก็ใช้ชื่ออื่นได้แหละ ไม่ได้ผิดอะไร) รายชื่อ provider ที่ใช้ได้ อยู่ในลิงก์นี้นะฮะ เราต้องการสร้างใน GCP เลยเลือกเป็น "google"

แล้วใช้คำสั่งนี้ เมื่อแน่ใจแล้วว่าเราอยู่ใน folder ของ tf script นี้

terraform init

มันจะสร้าง file backend และ provider ตามที่เราเลือกเอาไว้ ได้ output มาประมาณนี้

ทีนี้ เราจะสังเกตว่ามีของใหม่โผล่ขึ้นมา นั่นคือ folder .terraform และ file .terraform.lock.hcl คือ Terraform จะสร้างมาให้อัตโนมัติ และเราก็ไม่ต้องไปยุ่งอะไรกับมันนะฮะ

2. ใส่ resource

เอาล่ะ ทีนี้เราก็ได้เวลากำหนดว่าจะสร้างอะไรขึ้นมาบ้าง โดยแก้ที่ main.tf และใช้ keyword  resource

ใช้ syntax แบบนี้ฮะ

resource "<resource_type>" "<resource_name>" {
  attribute1 = value1
  attribute2 = value2 
}

Resource type จะต้องเป็นไปตาม Terraform registry กรณีนี้เราใช้บน GCP ก็ดูจาก ลิงก์นี้

Resource name เป็นการตั้งชื่อ internal กำหนดยังไงก็ได้ แต่ถ้าจะให้ดีก็ให้มี naming conventions สักหน่อย เช่น มี types, projects, หรือจุดประสงค์ ก็ว่าไปฮะ

Attribute อันนี้ต้องไปดูที่ registry เลย แต่ละ resource type จะมีไม่เหมือนกัน

3. validate

เขียนเสร็จแล้วก็ต้อง validate ว่าเขียนผิดตรงไหนมั้ย ด้วยคำสั่ง

terraform validate

ช่วยได้มากเลยแหละฮะ เพราะถ้าเราเขียนผิดตรงไหน มันจะบอกให้รู้แต่เนิ่นๆ เช่นแบบนี้

ผมลืม location ซึ่งเป็น required attribute ทีนี้เราก็แก้ main.tf ได้เป็นแบบนี้

แล้วก็ validate อีกรอบนึง

ผ่านแล้วล่ะ

4. Plan

เสร็จจาก validation ก็มา plan เพื่อ review change

terraform plan

Terraform จะแสดงผลมาละเอียดยิบเลยว่า ถ้าเราจะ deploy ตามนี้นะ จะมีอะไรเปลี่ยนไปบ้าง เปลี่ยนไปยังไง ก็เอาไว้เช็คอีกทีว่าถูกต้องรึเปล่า แล้วขั้นนี้ เราสามารถบันทึก plan ไว้ใช้ต่อได้อีกด้วย

5. Apply

เมื่อ validate และ plan เรียบร้อยแล้ว ทุกอย่างถูกต้อง ก็ได้เวลา apply ล่ะฮะ

terraform apply
terraform apply -auto-approve

ตรงนี้ ถ้าเราใช้ flag -auto-approve หมายความว่า เรากำลังสั่งให้มัน apply โดยไม่ต้องใส่ "yes" เพื่อยืนยันอีกทีนึง แต่รอบนี้ขอไม่ใส่ flag นะฮะ เพื่อเช็คอีกรอบก่อนจะ apply จริง

พอ apply ไปแล้ว ก็ไปเช็ค นี่ไง เราได้ bucket ที่เราเขียนไว้ใน tf ถูกต้องแล้ว

6. State

คำสั่งนี้ เพื่อดูว่าเราได้ apply อะไรไปบ้าง

terraform state list

มันก็จะไล่รายชื่อมาทั้งหมด

7. Destroy

และจบด้วยการลบทิ้ง ถ้าเราต้องการล้างทุกอย่างที่สร้างมา หรือก็คือ cleanup นั่นแหละ ก็ใช้คำสั่งนี้ได้ ย้ำว่าทุกอย่างเลยนะ

terraform destroy
terraform destroy -auto-approve

บาง resource จะมีกำหนดไว้ว่าจะลบไม่ได้ ถ้าไม่ได้กำหนด attribute บางตัวเอาไว้ เราก็ต้องไปเช็คกับ registry ก่อนนะฮะ ว่าต้องใส่ attribute อะไร


พื้นฐานก็ประมาณนี้แหละฮะ เดี๋ยวจะมีตอนต่อไปแน่นอน

ลองใช้กันดูนะฮะ เผื่อจะติดใจ แล้วไม่ต้องไปจิ้มๆ ให้ตาลายอีกต่อไป