มาใช้ Terraform กันเถอะ – ตอนที่ 1 เรื่องพื้นฐาน
in this series
- มาใช้ Terraform กันเถอะ – ตอนที่ 1 เรื่องพื้นฐาน
- มาใช้ Terraform กันเถอะ – ตอนที่ 2 ตัวแปรและการแทนค่า
- มาใช้ Terraform กันเถอะ – ตอนที่ 3 state ร่วมกัน
- มาใช้ Terraform กันเถอะ – ตอนที่ 4 modular เอามาเชื่อม
- มาใช้ Terraform กันเถอะ – ตอนที่ 5 ของเก่าเรา import
- มาใช้ Terraform กันเถอะ – ตอนที่ 6 ประยุกต์ใช้ CI/CD
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 ดูจากลิงก์ข้างล่างนี้ได้เลยฮะ
Concepts
Terraform ทำงานด้วย tf
scripts และนี่คือหลักการสำคัญๆ ที่ผมสรุปมาจากที่ได้ใช้งานจริงฮะ
- เราจะเห็น tutorial บอกให้เขียน
main.tf
เป็นจุดเริ่ม แต่จริงๆ แล้วมันต้องการแค่ 1tf
file เป็นอย่างน้อยฮะ ชื่อจะเป็นอะไรก็ได้ แต่ที่แนะนำแบบนั้นเพื่อให้อ่านแล้วรู้เลยว่านี่คือ file ตั้งต้นนะ - จะมี file
terraform.tfstate
กับterraform.tfstate.backup
สองตัวนี้คือ state files และเราไม่ต้องไปยุ่งอะไรกับมัน เพราะมันใช้เก็บประวัติและสถานะของ Terraform ถ้าเราเผลอลบมันไป เราอาจจะต้องมานั่ง import ใหม่นะฮะ - 1 folder จะมี state file แค่ชุดเดียว และนั่นหมายความว่า
tf
script ทุกตัวจะถูก execute ทั้งหมด และเราก็เลือกไม่ได้ด้วยว่าจะเอาหรือไม่เอาตัวไหนบ้าง
การติดตั้ง Terraform
เข้าไปที่ลิงก์ข้างล่างนี้ แล้วเลือกวิธีที่ตัวเองสะดวกนะฮะ ส่วนตัวผมถนัดใช้ brew
แหละ
ขั้นตอนเริ่มต้นสุดๆ
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 อะไร
พื้นฐานก็ประมาณนี้แหละฮะ เดี๋ยวจะมีตอนต่อไปแน่นอน
ลองใช้กันดูนะฮะ เผื่อจะติดใจ แล้วไม่ต้องไปจิ้มๆ ให้ตาลายอีกต่อไป