Skip to main content

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

เปรียบเทียบ

AspectIaCCaC
โฟกัสที่infrastructure (สิ่งที่ยังไม่มี)configuration (ของที่มีแล้ว)
ทำงาน level ไหนcloud API levelOS / app level
Stateมี state file (Terraform)ส่วนใหญ่ stateless
เครื่องมือTerraform, CloudFormationAnsible, Chef, Puppet
ตัวอย่าง actionสร้าง EC2ติดตั้ง nginx บน EC2
เปลี่ยนได้ runtime?❌ ต้อง re-apply✅ idempotent runs

Workflow ที่ใช้ทั้งคู่ (Real-World)

ขั้นตอน:

  1. Terraform สร้าง EC2 → ได้ IP กลับมา
  2. 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