Terraform กับ Cloudflare จัดการ Infrastructure as Code อย่างมืออาชีพ
Terraform กับ Cloudflare นำการจัดการ Infrastructure as Code (IaC) ไปสู่ระดับใหม่ ช่วยให้คุณจัดการ DNS Records, Firewall Rules, Page Rules, และการตั้งค่าทั้งหมดของ Cloudflare ด้วยโค้ด แทนที่จะกดปุ่มในแดชบอร์ด ทำให้การจัดการ Infrastructure กลายเป็นเรื่องง่าย ปลอดภัย และสามารถควบคุมเวอร์ชันได้
ทำไมต้อง Terraform + Cloudflare
Infrastructure as Code (IaC): ทุกอย่างเป็นโค้ด ทำให้ง่ายต่อการจัดการ ถูกเอนกประสงค์และควบคุมเวอร์ชัน (Git versioning)
ทำซ้ำได้: เพียงรัน Terraform apply ครั้งเดียว และสามารถสร้าง Environment ใหม่ได้ (Dev, Staging, Prod) โดยไม่ต้องคลิกปุ่มในแดชบอร์ด
ควบคุม Git: ผู้ใช้สามารถตรวจสอบว่าใครเปลี่ยนการตั้งค่า Cloudflare ในไหน และเมื่อไร ผ่าน Git history
Automation: รวม Terraform เข้ากับ CI/CD Pipeline ทำให้การปรับใช้อัตโนมัติ
ติดตั้ง Terraform และ Cloudflare Provider
1. ติดตั้ง Terraform: https://www.terraform.io/downloads.html
2. สร้าง Directory ใหม่:
mkdir terraform-cloudflare
cd terraform-cloudflare
3. สร้างไฟล์ main.tf และตั้งค่า Provider:
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "~> 4.0"
}
}
}
provider "cloudflare" {
api_token = var.cloudflare_api_token
}
4. สร้างไฟล์ variables.tf:
variable "cloudflare_api_token" {
type = string
sensitive = true
}
variable "cloudflare_zone_id" {
type = string
}
variable "domain" {
type = string
}
5. สร้างไฟล์ terraform.tfvars (ไม่ให้เป็น Public):
cloudflare_api_token = "YOUR_API_TOKEN"
cloudflare_zone_id = "YOUR_ZONE_ID"
domain = "example.com"
ตัวอย่าง: จัดการ DNS Records
resource "cloudflare_record" "www" {
zone_id = var.cloudflare_zone_id
name = "www"
type = "CNAME"
value = "example.com"
ttl = 3600
}
resource "cloudflare_record" "mail" {
zone_id = var.cloudflare_zone_id
name = "mail"
type = "A"
value = "192.0.2.1"
ttl = 3600
proxied = false # ไม่ proxy ผ่าน Cloudflare
}
resource "cloudflare_record" "api" {
zone_id = var.cloudflare_zone_id
name = "api"
type = "A"
value = "192.0.2.2"
ttl = 3600
proxied = true # proxy ผ่าน Cloudflare (สีส้ม)
}
ตัวอย่าง: Firewall Rules
resource "cloudflare_firewall_rule" "block_china" {
zone_id = var.cloudflare_zone_id
description = "Block China traffic"
filter_id = cloudflare_firewall_filter.china.id
action = "block"
}
resource "cloudflare_firewall_filter" "china" {
zone_id = var.cloudflare_zone_id
description = "China country filter"
expression = "(ip.geoip.country eq \"CN\") and (cf.bot_management.score < 50)"
}
# Rate Limiting
resource "cloudflare_rate_limit" "login" {
zone_id = var.cloudflare_zone_id
disabled = false
threshold = 5
period = 60
match {
request {
url {
path {
matches = "/login"
}
}
}
}
action {
response_code = 429
}
}
ตัวอย่าง: Page Rules (แบบเก่า)
# ใช้ Cache Rules แทน (แบบใหม่)
resource "cloudflare_cache_rules" "static" {
zone_id = var.cloudflare_zone_id
rules {
description = "Cache static files"
expression = "(cf.mime_type matches \"image.*\" or cf.mime_type eq \"text/css\" or cf.mime_type eq \"application/javascript\")"
action = "set_cache_settings"
action_parameters {
cache = true
ttl = 86400
}
}
}
# Page Rules (ถ้ายังใช้)
resource "cloudflare_page_rule" "cache_everything" {
zone_id = var.cloudflare_zone_id
target = "example.com/cache/*"
actions {
cache_level = "cache_everything"
}
}
resource "cloudflare_page_rule" "bypass_cache" {
zone_id = var.cloudflare_zone_id
target = "example.com/admin/*"
actions {
cache_level = "bypass"
}
}
รัน Terraform
1. ตั้งค่า API Token:
export TF_VAR_cloudflare_api_token="YOUR_API_TOKEN"
export TF_VAR_cloudflare_zone_id="YOUR_ZONE_ID"
export TF_VAR_domain="example.com"
2. ตรวจสอบสิ่งที่จะเปลี่ยนแปลง:
terraform plan
3. ใช้การเปลี่ยนแปลง:
terraform apply
4. ลบทรัพยากร (ถ้าต้องการ):
terraform destroy
5. ดูสถานะปัจจุบัน:
terraform show
การใช้ Terraform Modules
สร้าง Directory: modules/cloudflare_dns
# modules/cloudflare_dns/main.tf
resource "cloudflare_record" "main" {
zone_id = var.zone_id
name = var.subdomain
type = var.type
value = var.value
ttl = var.ttl
proxied = var.proxied
}
# modules/cloudflare_dns/variables.tf
variable "zone_id" {}
variable "subdomain" {}
variable "type" {}
variable "value" {}
variable "ttl" { default = 3600 }
variable "proxied" { default = false }
# main.tf
module "dns_www" {
source = "./modules/cloudflare_dns"
zone_id = var.cloudflare_zone_id
subdomain = "www"
type = "CNAME"
value = "example.com"
proxied = true
}
module "dns_mail" {
source = "./modules/cloudflare_dns"
zone_id = var.cloudflare_zone_id
subdomain = "mail"
type = "A"
value = "192.0.2.1"
proxied = false
}
เทคนิคขั้นสูง: Remote State
# backend.tf - เก็บ State ใน AWS S3
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "cloudflare/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
# หรือใช้ Terraform Cloud
terraform {
cloud {
organization = "my-org"
workspaces {
name = "cloudflare-prod"
}
}
}
สรุป
Terraform กับ Cloudflare ทำให้การจัดการ Infrastructure กลายเป็นเรื่องง่าย ปลอดภัย และสามารถทำซ้ำได้ ด้วยการเขียน DNS Records, Firewall Rules, และการตั้งค่าทั้งหมดเป็นโค้ด คุณสามารถจัดการ Cloudflare ได้เสมือนเป็นส่วนหนึ่งของสภาพแวดล้อมการพัฒนา รวมกับการใช้ VPS เป็น Origin ทำให้ Infrastructure ของคุณเป็นระบบอัตโนมัติและน่าเชื่อถือ