สวัสดีค่าา ยินดีต้อนรับสู่ EP.8!
ลองนึกภาพนะ สมมติว่าคุณออกแบบ program การซ้อมไว้ดีมาก squat วันนี้กี่ kg กี่ set deadlift อาทิตย์หน้าอะไร ทุกอย่างจดไว้ใน notebook ครบเลย พอเพื่อนอยากซ้อม program เดียวกัน คุณก็แค่ copy notebook ให้ ไม่ต้องมานั่งสอนทีละท่า
Infrastructure as Code คือแนวคิดเดียวกันค่ะ แทนที่จะกด click สร้าง server ทีละขั้นผ่าน cloud console ซึ่งทำซ้ำได้ยากและ error ง่าย เราเขียน infrastructure ทั้งหมดเป็นโค้ด แล้วสั่งให้มันสร้าง infrastructure ตาม spec ที่กำหนดได้เลย
ปัญหาของการทำ infrastructure แบบ manual
ก่อน IaC เป็นที่นิยม วิธีสร้าง server คือเข้าไปใน AWS Console กด click ตั้งค่าทีละหน้า ใช้เวลานาน ผิดพลาดง่าย และที่แย่ที่สุดคือ ทำซ้ำได้ยากมาก
ถ้าต้องสร้าง environment ใหม่สำหรับ staging หรือต้องสร้างซ้ำในอีก region หนึ่ง ก็ต้องไปกด click ทุกอย่างใหม่ทั้งหมด และไม่มีทางรู้ได้แน่ว่า environment ใหม่เหมือนเดิม 100% หรือเปล่า
IaC คืออะไร
Infrastructure as Code คือการนิยาม infrastructure ทั้งหมดในไฟล์โค้ด เช่น ต้องการ server กี่ตัว network config เป็นยังไง security group เปิด port อะไรบ้าง แล้วใช้ tool รัน code นั้นสร้าง infrastructure ให้อัตโนมัติ
ข้อดีหลักคือ
- Reproducible สร้างซ้ำได้เหมือนเดิมทุกครั้ง
- Version controlled เก็บใน Git ดูประวัติการเปลี่ยนแปลงได้
- Reviewable ก่อน apply ทีม review ใน PR ก่อนได้
- Automatable รันผ่าน CI/CD pipeline ได้
Terraform เครื่องมือ IaC ที่ดังที่สุด
Terraform เป็น IaC tool จาก HashiCorp ใช้ภาษา HCL (HashiCorp Configuration Language) และ support cloud providers เกือบทุกเจ้า
Concept หลัก
- Provider คือ plugin ที่เชื่อมกับ cloud (aws, google, azure)
- Resource คือ infrastructure ที่จะสร้าง (server, network, database)
- State คือไฟล์ที่ Terraform เก็บ record ว่า resource ไหนถูกสร้างไปแล้ว
# main.tf
# ระบุ provider
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-southeast-1" # Singapore
}
# สร้าง VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "my-vpc"
}
}
# สร้าง EC2 instance
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0" # Ubuntu 22.04
instance_type = "t3.micro"
subnet_id = aws_subnet.public.id
tags = {
Name = "web-server"
}
}
# output IP ที่ได้
output "server_ip" {
value = aws_instance.web.public_ip
}
คำสั่ง Terraform พื้นฐาน
# initialize (ดาวน์โหลด providers)
terraform init
# ดูว่าจะเปลี่ยนแปลงอะไรบ้าง (preview)
terraform plan
# apply สร้าง/เปลี่ยน infrastructure จริง
terraform apply
# ลบทุกอย่างที่ Terraform สร้างไว้
terraform destroy
💡 terraform plan สำคัญมากควรรันก่อน apply ทุกครั้ง มันจะ preview ว่าจะสร้าง เปลี่ยน หรือลบ resource อะไรบ้าง ป้องกันการทำอะไรพลาดไปโดยไม่ตั้งใจ
Terraform Modules โค้ดที่ reuse ได้
Module คือการรวม resources ที่ใช้บ่อยๆเข้าด้วยกัน แล้วเรียกใช้ซ้ำได้ทั้ง project
# เรียกใช้ module ที่เขียนเอง
module "web_server" {
source = "./modules/ec2"
instance_type = "t3.micro"
name = "web-prod"
}
# หรือใช้ module จาก Terraform Registry
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
}
Ansible จัดการ Configuration
ถ้า Terraform ทำหน้าที่ สร้าง infrastructure Ansible ทำหน้าที่ ตั้งค่า software บน infrastructure ที่สร้างแล้ว
เช่น หลังจาก Terraform สร้าง EC2 instance แล้ว Ansible จะเข้าไปติดตั้ง nginx, copy config file, start service ให้อัตโนมัติ
# playbook.yml
- name: Setup web server
hosts: web_servers
become: yes # sudo
tasks:
- name: Install nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Copy nginx config
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
- name: Start and enable nginx
systemd:
name: nginx
state: started
enabled: yes
- name: Deploy application
git:
repo: 'https://github.com/chawadesu/my-app.git'
dest: /var/www/my-app
version: main
# รัน playbook
ansible-playbook -i inventory.yml playbook.yml
Terraform vs Ansible ต่างกันยังไง
| Terraform | Ansible | |
|---|---|---|
| ทำอะไร | สร้างและจัดการ infrastructure | ตั้งค่า software บน server |
| แนวคิด | Declarative (บอกว่าต้องการอะไร) | Procedural (บอกว่าต้องทำอะไร) |
| State | มี state file ติดตาม resource | ไม่มี state ทำงานแบบ idempotent |
| เหมาะกับ | Cloud resources: EC2, VPC, RDS | OS config: install packages, config files |
ในทีมส่วนใหญ่ใช้ทั้งสองอย่างร่วมกันค่ะ Terraform สร้าง server ก่อน แล้ว Ansible configure server ต่อ
GitOps: IaC เข้า Git Workflow
GitOps คือแนวทางที่เอา Git เป็น source of truth ของ infrastructure ทุกการเปลี่ยนแปลง infrastructure ต้องทำผ่าน Pull Request และ review ก่อนเสมอ
วิธีนี้ทำให้ทุกการเปลี่ยนแปลง infrastructure มีประวัติใน Git ทุกคนในทีมเห็น และ revert ได้ถ้าพัง
สรุป EP.8
- IaC คือการเขียน infrastructure เป็นโค้ดแทนการกด click ทำซ้ำได้ reviewable และ automatable
- Terraform ใช้สร้างและจัดการ cloud infrastructure เขียน HCL แล้ว apply
planก่อนapplyทุกครั้งเสมอ- Ansible ใช้ configure software บน server ที่สร้างแล้ว
- GitOps เอา Git เป็น source of truth ของ infrastructure
🏋️ การบ้าน: ลอง install Terraform แล้วเขียน config สร้าง S3 bucket บน AWS (ถ้ามี account) หรือลองใช้ terraform plan ดูก่อนโดยไม่ต้อง apply จริงก็ได้ค่ะ จะได้รู้สึกว่า syntax เป็นยังไง
ซีรี่ส์ DevOps พังแล้วพังอีกพังต่อ