Terraform คืออะไร? พื้นฐาน Infrastructure Provisioning

Terraform เป็น Infrastructure as Code (IaC) tool ยอดนิยมที่ช่วยให้คุณสามารถจัดการโครงสร้าง cloud และทรัพยากร IT ในลักษณะเป็นโค้ด ด้วยการเขียน configuration ที่ประกาศ (Declarative) คุณสามารถสร้าง อัปเดต และลบทรัพยากรได้อย่างสอดคล้องและปลอดภัย บทความนี้จะอธิบายแนวคิดพื้นฐานของ Terraform และวิธีการเริ่มต้นใช้งาน

Terraform คืออะไร? ทำไมต้องใช้ Infrastructure as Code

ในอดีต การจัดการโครงสร้าง IT ต้องทำด้วยตนเองผ่าน web console ของ cloud provider ซึ่งเสี่ยงต่อความผิดพลาด ยากต่อการจัดการเวอร์ชัน และปัญหาการสอดคล้องระหว่างสภาพแวดล้อม Infrastructure as Code (IaC) มาเพื่อแก้ปัญหาเหล่านี้ โดยให้คุณเขียน configuration เป็นโค้ด ซึ่งสามารถเก็บใน version control (Git) ได้

Terraform เป็น IaC tool ที่พัฒนาโดย HashiCorp ใช้งาน declarative configuration language เรียกว่า HCL (HashiCorp Configuration Language) ที่ง่ายต่อการเข้าใจและบำรุงรักษา

ข้อดีของ Terraform

  • Declarative: เขียนสิ่งที่คุณต้องการ ไม่ใช่วิธีการ (How) Terraform จะจัดการรายละเอียด
  • Multi-cloud: สนับสนุน AWS, Azure, Google Cloud, Alibaba Cloud และอีกมากมาย ด้วย provider เดียว
  • State Management: ติดตามสถานะของทรัพยากรอย่างแม่นยำ
  • Plan before Apply: ดูการเปลี่ยนแปลงก่อนใช้งาน เพื่อป้องกันข้อผิดพลาด
  • Modular: ระหว่างสำหรับจัดโครงสร้างและนำกลับมาใช้ซ้ำ
  • Version Control: เก็บประวัติการเปลี่ยนแปลง ฟื้นฟูเวอร์ชันเก่า ทำงานร่วมกับทีม

แนวคิดพื้นฐานของ Terraform

  • Provider: Plugin ที่เชื่อมต่อกับ cloud provider (AWS, Azure, Google Cloud)
  • Resource: ทรัพยากร เช่น EC2 instance, VPC, Database ที่คุณต้องการสร้าง
  • Variable: ตัวแปรสำหรับเก็บค่าที่นำกลับมาใช้ซ้ำได้
  • Output: ค่าที่ส่งออกจาก configuration หลังจากทำการ apply
  • State: ไฟล์ terraform.tfstate ที่เก็บสถานะปัจจุบันของทรัพยากร
  • Module: กลุ่มของ resource และ configuration ที่บรรจุกันด้วย

ติดตั้ง Terraform บน Linux/Ubuntu

ขั้นตอนการติดตั้ง Terraform บน Ubuntu และ Linux:

# ดาวน์โหลด Terraform
wget https://releases.hashicorp.com/terraform/1.7.0/terraform_1.7.0_linux_amd64.zip

# ติดตั้ง unzip ถ้ายังไม่ได้ติดตั้ง
sudo apt-get install unzip

# แตกไฟล์
unzip terraform_1.7.0_linux_amd64.zip

# ย้ายไปยัง /usr/local/bin
sudo mv terraform /usr/local/bin/

# ตรวจสอบการติดตั้ง
terraform -v

เขียน Terraform Configuration แรก

สร้างไฟล์ main.tf เพื่อประกาศทรัพยากร (ตัวอย่างสำหรับ AWS):

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web_server" {
  ami           = "ami-0c02fb55731490381"
  instance_type = "t2.micro"

  tags = {
    Name = "Web Server"
  }
}

ตัวอย่างนี้จะสร้าง EC2 instance ขนาด t2.micro บน AWS region us-east-1

Terraform Workflow – ขั้นตอนหลัก

Terraform ทำงานตามขั้นตอนดังนี้:

1. terraform init – เริ่มต้น

terraform init

คำสั่งนี้จะ:

  • ดาวน์โหลด provider plugins ที่จำเป็น
  • สร้างไดเรกทอรี่ .terraform
  • สร้างไฟล์ .terraform.lock.hcl สำหรับ lock version

2. terraform plan – วางแผน

terraform plan

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

3. terraform apply – ใช้งาน

terraform apply

คำสั่งนี้จะสร้างหรือแก้ไขทรัพยากรตามที่ planned Terraform จะขอให้คุณยืนยัน (approve) ก่อนดำเนินการ

4. terraform destroy – ลบ

terraform destroy

คำสั่งนี้จะลบทรัพยากรทั้งหมดที่ประกาศใน configuration ใช้เมื่อต้องการทำความสะอาดหรือปิดโครงการ

Terraform State – จัดการสถานะทรัพยากร

Terraform เก็บสถานะของทรัพยากรในไฟล์ terraform.tfstate ไฟล์นี้สำคัญมาก เพราะ Terraform ใช้มันเพื่อเปรียบเทียบกับ configuration ที่ต้องการ

Remote State – เก็บสถานะบน Cloud

ในสภาพแวดล้อม production ควรเก็บ state บน remote backend เช่น S3, GCS หรือ Terraform Cloud เพื่อความปลอดภัยและการทำงานร่วมกับทีม

terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
}

Terraform Variables – ตัวแปรและค่ากำหนด

สร้างไฟล์ variables.tf เพื่อประกาศตัวแปร:

variable "instance_type" {
  description = "ประเภท EC2 instance"
  type        = string
  default     = "t2.micro"
}

variable "environment" {
  description = "สภาพแวดล้อม (dev, staging, prod)"
  type        = string
}

variable "tags" {
  description = "Tags สำหรับทรัพยากร"
  type        = map(string)
  default = {
    Project = "MyProject"
  }
}

สร้างไฟล์ terraform.tfvars เพื่อกำหนดค่า:

instance_type = "t2.small"
environment   = "production"
tags = {
  Project     = "MyProject"
  Environment = "Production"
  ManagedBy   = "Terraform"
}

Terraform Modules – จัดโครงสร้าง Configuration

Module ช่วยจัดโครงสร้าง Terraform configuration ให้เป็นระเบียบและใช้ซ้ำได้ ตัวอย่างโครงสร้าง:

project/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars
└── modules/
    ├── vpc/
    │   ├── main.tf
    │   ├── variables.tf
    │   └── outputs.tf
    ├── security_group/
    │   ├── main.tf
    │   ├── variables.tf
    │   └── outputs.tf
    └── ec2/
        ├── main.tf
        ├── variables.tf
        └── outputs.tf

ในไฟล์ main.tf ของ root module คุณสามารถใช้ module:

module "vpc" {
  source = "./modules/vpc"
  
  cidr_block = "10.0.0.0/16"
  name       = "my-vpc"
}

module "security_group" {
  source = "./modules/security_group"
  
  vpc_id = module.vpc.vpc_id
  name   = "my-sg"
}

Best Practices สำหรับ Terraform

  • Version Control: เก็บ configuration ทั้งหมดใน Git แต่อย่าเก็บ state file หรือ secrets
  • Remote State: ใช้ remote backend สำหรับ production environment
  • State Locking: เปิดใช้งาน state locking เพื่อป้องกันการแก้ไขพร้อมกัน
  • Use Modules: จัดโครงสร้าง configuration ใหญ่ให้เป็น module ขนาดเล็ก
  • Plan before Apply: ตรวจสอบ terraform plan ก่อนทำ apply เสมอ
  • Sensitive Data: ใช้ sensitive variable สำหรับ password และ API key
  • Testing: ใช้ tools เช่น Terratest เพื่อทำ automated testing
  • Documentation: เขียนคำอธิบาย (description) สำหรับ variable และ output

บทสรุป

Terraform เป็น Infrastructure as Code tool ที่ทรงพลัง ช่วยให้คุณจัดการโครงสร้าง cloud อย่างมีประสิทธิภาพ ปลอดภัย และสอดคล้องกัน ด้วยการเขียน configuration เป็นโค้ด คุณสามารถ:

  • จัดการทรัพยากรหลาย cloud ด้วย configuration เดียว
  • ติดตามการเปลี่ยนแปลงในระบบ version control
  • ทำงานร่วมกับทีมได้อย่างง่ายดาย
  • ลดความผิดพลาดและเพิ่มความเร็ว