CaC vs IaC
Configuration as Code กับ Infrastructure as Code ต่างกันยังไง? มือใหม่มักสับสน 2 อย่างนี้ — มาดูเส้นแบ่งให้ชัด
ความหมาย
Infrastructure as Code (IaC)
สร้าง infrastructure (ที่ยังไม่มี) ให้เกิดขึ้น
- สร้าง VM, network, database, storage
- เครื่องมือ: Terraform, CloudFormation, Pulumi
Configuration as Code (CaC)
ตั้งค่า OS / software ที่อยู่บน infrastructure ที่มีอยู่แล้ว
- ติดตั้ง package, แก้ config file, start service
- เครื่องมือ: Ansible, Chef, Puppet, SaltStack
เปรียบเทียบ
| Aspect | IaC | CaC |
|---|---|---|
| โฟกัสที่ | infrastructure (สิ่งที่ยังไม่มี) | configuration (ของที่มีแล้ว) |
| ทำงาน level ไหน | cloud API level | OS / app level |
| State | มี state file (Terraform) | ส่วนใหญ่ stateless |
| เครื่องมือ | Terraform, CloudFormation | Ansible, Chef, Puppet |
| ตัวอย่าง action | สร้าง EC2 | ติดตั้ง nginx บน EC2 |
| เปลี่ยนได้ runtime? | ❌ ต้อง re-apply | ✅ idempotent runs |
Workflow ที่ใช้ทั้งคู่ (Real-World)
ขั้นตอน:
- Terraform สร้าง EC2 → ได้ IP กลับมา
- Ansible ssh เข้า EC2 → ติดตั้ง nginx, คัดลอก config, start service
ตัวอย่าง Code
IaC ด้วย Terraform (สร้าง EC2)
main.tf
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
key_name = "my-key"
tags = {
Name = "web-server"
}
}
CaC ด้วย Ansible (ตั้งค่า EC2)
playbook.yml
- hosts: web
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Start nginx
service:
name: nginx
state: started
enabled: yes
- name: Copy site config
copy:
src: nginx.conf
dest: /etc/nginx/sites-available/default
notify: Restart nginx
Terraform ทำ CaC ได้ไหม?
ทำได้ผ่าน provisioner (remote-exec, file) แต่ HashiCorp ไม่แนะนำ — ใช้ Ansible/Chef/cloud-init จะเหมาะกว่า
ดูเพิ่มที่ Section 13: Provisioners
เลือกใช้ตัวไหน?
ใช้ Terraform (IaC) เมื่อ:
- ✅ ต้องสร้าง infrastructure ใหม่
- ✅ ต้องการ multi-cloud
- ✅ ต้องการ state tracking
- ✅ ต้องการ plan-before-apply
ใช้ Ansible (CaC) เมื่อ:
- ✅ ตั้งค่า OS / app บน server ที่มีอยู่แล้ว
- ✅ ทำ config management ระดับ enterprise
- ✅ deploy application
- ✅ run ad-hoc commands บน server หลายตัว
ใช้ทั้งคู่เมื่อ:
- ✅ project ใหญ่ที่ต้องสร้าง infra และ ตั้งค่า — pattern ที่พบบ่อยที่สุดใน production
หรือใช้ทางเลือกอื่น?
ในยุค Cloud-Native บาง pattern ทำให้ CaC ลดความสำคัญลง:
- Immutable Infrastructure + AMI/Container Images — bake config ลง image แทน config ที่ runtime
- Cloud-init / User Data — script ที่รันตอน boot ครั้งแรก
- Kubernetes — ConfigMap/Secret เป็น CaC ในตัว
ตัวอย่าง: Terraform + cloud-init แทน Ansible
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
user_data = <<-EOF
#!/bin/bash
apt update
apt install -y nginx
systemctl start nginx
EOF
}
สรุป
- IaC = สร้าง infra (Terraform, CloudFormation)
- CaC = ตั้งค่า OS/app บน infra (Ansible, Chef)
- ใช้ คู่กัน เป็น pattern ที่พบบ่อย: Terraform สร้าง → Ansible ตั้งค่า
- ในยุค container/serverless CaC ลดบทบาทลง เพราะ config ถูก bake ลงใน image ตั้งแต่ build
ต่อไป → ติดตั้ง Terraform