DevOps
น้องๆ เคยเจอปัญหาไหม? สมัยผมทำร้านเน็ต SiamCafe เนี่ย, server เป็นสิบๆ เครื่อง, แต่ละเครื่อง config ไม่เหมือนกันซักที! พอจะ scale ระบบที วุ่นวายสุดๆ Infrastructure As Code (IaC) เนี่ยแหละคือทางออก! มันคือการที่เราเอา Infrastructure ทั้งหมดของเรา (server, network, database) มาเขียนเป็น code แทนที่จะมาคลิกๆ ใน GUI
Terraform เนี่ยเป็นเครื่องมือ IaC ตัวนึงที่ฮิตมากๆ เพราะมันจัดการพวก cloud resources ได้หลากหลาย ทั้ง AWS, Azure, Google Cloud และอื่นๆ อีกเพียบ! ที่สำคัญคือมันทำให้เราจัดการ Infrastructure ได้อย่างเป็นระบบ, ทำซ้ำได้, และลดความผิดพลาดที่เกิดจากคน (human error) ไปได้เยอะเลย
ลองนึกภาพว่าเราต้องสร้าง server 10 เครื่อง, แต่ละเครื่องต้องลง package ต่างๆ, set firewall rules, และ config อีกเพียบ! ถ้าทำมือทีละเครื่อง คงใช้เวลาเป็นวัน แถมโอกาสผิดพลาดก็สูงมาก แต่ถ้าเราใช้ Terraform เราแค่เขียน code บอกว่าเราต้องการอะไร แล้ว Terraform จะจัดการให้เราเองทั้งหมด! ง่ายกว่าเยอะ!
อีกอย่างคือเรื่อง version control สมัยก่อนเวลา config server ผิด, กว่าจะรู้ว่าผิดตรงไหน แก้ไขยังไง แทบแย่! แต่ถ้าใช้ Terraform เราสามารถเก็บ code ไว้ใน Git ได้ พอมีปัญหาอะไร ก็ย้อนกลับไปดู version เก่าได้ง่ายๆ เหมือนกับการเขียนโปรแกรมเลย
Terraform ใช้ภาษา HCL (HashiCorp Configuration Language) ในการเขียน code มันเป็นภาษาที่ค่อนข้างอ่านง่าย คล้ายๆ JSON แต่มีความยืดหยุ่นกว่า ลองดูตัวอย่าง:
resource "aws_instance" "example" {
ami = "ami-0c55b80165505a82e"
instance_type = "t2.micro"
tags = {
Name = "MyInstance"
}
}
จาก code ข้างบน เรากำลังบอก Terraform ว่าให้สร้าง AWS EC2 instance โดยใช้ AMI (Amazon Machine Image) ชื่อ "ami-0c55b80165505a82e" และ instance type เป็น "t2.micro" แล้วตั้งชื่อ instance ว่า "MyInstance" เห็นไหม? ไม่ยากเลย!
Provider คือตัวที่ Terraform ใช้ในการติดต่อกับ Cloud Provider ต่างๆ เช่น AWS, Azure, Google Cloud หรือแม้แต่ Docker Terraform จะใช้ Provider ในการสร้าง, แก้ไข, และลบ resources ต่างๆ ใน Cloud นั้นๆ
เราต้อง config Provider ก่อนที่จะเริ่มใช้งาน Terraform โดยระบุ credentials และ region ที่เราต้องการใช้งาน เช่น:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
provider "aws" {
region = "us-west-2"
}
Code นี้บอกว่าเราจะใช้ AWS Provider version 4.0 และ region คือ "us-west-2" อย่าลืมใส่ AWS credentials ของเราด้วยนะ (สามารถ config ผ่าน environment variables หรือ AWS CLI)
มาถึงส่วนที่สำคัญที่สุดแล้ว! วิธีการใช้งาน Terraform จริงๆ แล้วไม่ยากอย่างที่คิด แค่ต้องเข้าใจ concept และขั้นตอนหลักๆ ก็พอ
ก่อนอื่นเลย เราต้องติดตั้ง Terraform ก่อน สามารถ download ได้จาก Terraform website เลือก version ที่ตรงกับ OS ของเรา แล้ว extract file ไปไว้ใน path ที่เราต้องการ
จากนั้นให้เพิ่ม path ของ Terraform ไปใน environment variables ของเรา เพื่อให้เราสามารถเรียกใช้ Terraform จาก command line ได้ทุกที่
สร้าง directory สำหรับเก็บ Terraform configuration file ของเรา (เช่น "my-infrastructure") แล้วสร้าง file ชื่อ "main.tf" (หรือชื่ออะไรก็ได้ที่ลงท้ายด้วย ".tf") แล้วเขียน code Terraform ของเราลงไป
ลองใช้ code ตัวอย่างที่เราเขียนไว้ข้างบน:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-0c55b80165505a82e"
instance_type = "t2.micro"
tags = {
Name = "MyInstance"
}
}
เปิด command line แล้ว cd ไปที่ directory ที่เราสร้างไว้ จากนั้น run command terraform init Terraform จะ download Provider ที่เราใช้ (ในที่นี้คือ AWS Provider) และ initialize project ของเรา
terraform init
หลังจาก initialize แล้ว เราสามารถ run command terraform plan เพื่อดูว่า Terraform จะสร้าง, แก้ไข, หรือลบอะไรบ้างใน Infrastructure ของเรา Terraform จะแสดงรายละเอียดทั้งหมดให้เราตรวจสอบก่อนที่จะทำการเปลี่ยนแปลงจริง
terraform plan
ถ้าทุกอย่างถูกต้อง เราสามารถ run command terraform apply เพื่อให้ Terraform สร้าง Infrastructure ของเราได้เลย Terraform จะถามเราว่าเราต้องการที่จะ apply จริงๆ หรือไม่ ให้พิมพ์ "yes" แล้วกด enter
terraform apply
รอ Terraform สร้าง Infrastructure ของเรา (อาจจะใช้เวลาซักพัก) หลังจากเสร็จแล้ว เราก็จะได้ AWS EC2 instance ที่เรา config ไว้ใน code
อย่าลืมไปดูใน AWS console นะ ว่า instance ของเราถูกสร้างขึ้นมาจริงๆ
เข้าไปดู SiamCafe Blog เพิ่มเติมได้นะ มี content เกี่ยวกับ DevOps อีกเยอะเลย!
ดูวิดีโอเพิ่มเติมเกี่ยวกับTerraform Infrastructure As Co:
Terraform ไม่ใช่เครื่องมือ IaC ตัวเดียวในตลาด ยังมีตัวอื่นๆ อีก เช่น Ansible, Chef, Puppet, CloudFormation แต่ละตัวก็มีข้อดีข้อเสียต่างกัน
Ansible เป็น configuration management tool ที่เน้นการ config server หลังจากที่ server ถูกสร้างขึ้นมาแล้ว ส่วน Chef และ Puppet ก็คล้ายๆ กัน แต่มีความซับซ้อนมากกว่า
CloudFormation เป็น IaC tool ของ AWS เอง ซึ่งใช้งานได้เฉพาะกับ AWS resources เท่านั้น
| เครื่องมือ | ข้อดี | ข้อเสีย |
|---|---|---|
| Terraform | รองรับหลาย Cloud Provider, ใช้งานง่าย, มี community ใหญ่ | ต้องเรียนรู้ภาษา HCL |
| Ansible | ใช้งานง่าย, ไม่ต้องมี agent บน server | ไม่เหมาะกับการสร้าง infrastructure ตั้งแต่เริ่มต้น |
| Chef/Puppet | มีความยืดหยุ่นสูง | มีความซับซ้อนสูง, ต้องมี agent บน server |
| CloudFormation | รองรับ AWS resources ได้อย่างครบถ้วน | ใช้งานได้เฉพาะกับ AWS |
สรุปคือ ถ้าเราต้องการเครื่องมือ IaC ที่รองรับหลาย Cloud Provider และใช้งานง่าย Terraform เป็นตัวเลือกที่ดี แต่ถ้าเราใช้ AWS อย่างเดียว CloudFormation ก็เป็นตัวเลือกที่น่าสนใจ
อ่านบทความอื่นๆ เกี่ยวกับ IT ได้ที่ SiamCafe Blog นะน้องๆ!
เอาล่ะน้องๆ มาถึงส่วนสำคัญแล้ว ผมจะมาแชร์ Best Practices จากประสบการณ์จริงที่ SiamCafe.net ที่ทำ Terraform มาตลอด สมัยก่อน Infrastructure as Code ยังไม่ฮิตขนาดนี้ แต่เราก็เริ่มๆ ลองผิดลองถูกมาเยอะ เจ็บมาเยอะ เลยอยากมาเล่าให้ฟังกัน
1. Version Control คือชีวิต: เรื่องนี้สำคัญมากๆๆๆๆๆๆ ต้องย้ำเลยว่า Terraform code ทุกบรรทัดต้องอยู่ภายใต้ Version Control (Git, Bitbucket) เพื่อ track changes, collaborate, และ rollback ได้สบายใจ สมัยผมทำร้านเน็ต เคยมีน้องคนนึงแก้ Terraform แล้วไม่ได้ commit พอ server ล่ม หาต้นตอไม่ได้ ปวดหัวไปทั้งคืน
# ตัวอย่างการ commit code ขึ้น Git
git add .
git commit -m "Fix: แก้ไข security group ให้รัดกุมขึ้น"
git push origin main
2. State Management สำคัญไฉน: Terraform state file คือหัวใจสำคัญในการจัดการ infrastructure อย่าเก็บไว้ในเครื่องตัวเองเด็ดขาด! (ย้ำอีกที) ให้ใช้ Remote State Storage เช่น AWS S3, Azure Blob Storage, Google Cloud Storage แล้ว lock state file ด้วย DynamoDB หรือเทียบเท่า เพื่อป้องกันการแก้ไขพร้อมกัน
# ตัวอย่างการ config remote state ใน Terraform
terraform {
backend "s3" {
bucket = "siamcafe-terraform-state"
key = "terraform.tfstate"
region = "ap-southeast-1"
dynamodb_table = "terraform-locks"
}
}
3. Modules ช่วยชีวิต: อย่าเขียน code ซ้ำๆ! สร้าง Terraform modules เพื่อ reusable components เช่น module สำหรับสร้าง EC2 instance, module สำหรับสร้าง VPC แล้ว import มาใช้ใน project ต่างๆ ช่วยลด code duplication และทำให้ maintain ง่ายขึ้นเยอะ เคยเจอเคสที่ copy paste code ไปมา พอแก้ที่นึง ต้องแก้ทุกที่ เหนื่อยมาก
# ตัวอย่างการเรียกใช้ module
module "web_server" {
source = "./modules/ec2"
instance_type = "t2.micro"
ami = "ami-xxxxxxxxxxxxx"
security_group_ids = [aws_security_group.web_sg.id]
}
4. Plan ก่อน Apply: ก่อนที่จะ apply changes ใดๆ ให้รัน terraform plan เสมอ เพื่อดูว่าจะเกิดอะไรขึ้นกับ infrastructure ของเราบ้าง จะมีการสร้าง แก้ไข หรือลบ resource อะไรบ้าง จะได้ไม่พลาดไงล่ะ
# ตัวอย่างการรัน terraform plan
terraform plan
อันนี้เป็นฝันร้ายของทุกคน! ถ้า state file หาย (ซึ่งไม่ควรหายถ้าทำตามที่ผมบอกข้างบน) ต้อง import resource เข้าไปใน state file ใหม่ทีละตัว ซึ่งเป็นงานที่น่าเบื่อและผิดพลาดได้ง่าย ดังนั้นป้องกันไว้ดีกว่าแก้!
อ่าน Error Message อย่างละเอียด! ส่วนใหญ่ Error Message จะบอกใบ้ว่าเกิดอะไรขึ้น ลองแก้ code ตาม Error Message แล้วรัน terraform apply ใหม่อีกครั้ง ถ้ายังไม่ได้ ให้ลอง debug ทีละ step
ได้แน่นอน! Terraform ถูกออกแบบมาให้ทำงานร่วมกับ CI/CD tools ต่างๆ ได้อย่างราบรื่น เช่น Jenkins, GitLab CI, GitHub Actions, CircleCI ช่วยให้เรา automate การ deploy infrastructure ได้
Terraform core เป็น Open Source ใช้งานได้ฟรี แต่ Terraform Cloud (ซึ่งมี features เพิ่มเติม เช่น collaboration, remote state management) มีแบบเสียเงิน
Terraform เป็นเครื่องมือที่ทรงพลังในการจัดการ infrastructure แต่ต้องใช้ให้ถูกวิธี อย่าลืม Best Practices ที่ผมแนะนำไปนะครับ จะช่วยให้ชีวิตง่ายขึ้นเยอะ และอย่าลืมไปอ่าน SiamCafe Blog นะครับ มีบทความดีๆ อีกเยอะเลย เกี่ยวกับ DevOps และอื่นๆ อีกมากมาย ถ้าใครสนใจเรื่อง Forex ลองแวะไปดู iCafeForex ได้นะครับ