Terraform Workflow: Init → Plan → Apply → Destroy อธิบายทุกขั้นตอน

การใช้งาน Terraform ในชีวิตประจำวันหมุนเวียนอยู่รอบ 4 คำสั่งหลัก คือ init, plan, apply และ destroy แต่ละคำสั่งทำหน้าที่แตกต่างกันและออกแบบมาให้ทำงานเป็นขั้นตอนที่ปลอดภัย เปิดโอกาสให้ตรวจสอบก่อนเปลี่ยนแปลงโครงสร้างพื้นฐานจริง การเข้าใจ workflow นี้ให้ลึกช่วยให้ใช้ Terraform ได้อย่างมั่นใจและหลีกเลี่ยงความผิดพลาดที่อาจมีราคาแพง

บทความนี้จะไล่ไปทีละขั้นตอน อธิบายว่าแต่ละคำสั่งทำอะไร สถานะใดบ้างที่ถูกเปลี่ยน ไฟล์ใดบ้างที่ถูกสร้างหรืออัปเดต และแนวทางปฏิบัติที่ทีม DevOps ใช้กันในระดับ Production

ภาพรวม Terraform Workflow

Terraform ใช้วิธี declarative คือผู้ใช้เขียนไฟล์ .tf อธิบายสถานะที่ต้องการ จากนั้น Terraform จะเปรียบเทียบกับ state file ปัจจุบัน แล้วคำนวณชุดของการเปลี่ยนแปลงที่น้อยที่สุดเพื่อให้ถึงสถานะนั้น กระบวนการนี้ถูกแบ่งเป็น 4 ขั้นตอนเพื่อให้สามารถตรวจทาน pause และยกเลิกได้ทุกจุด

ขั้นตอนที่ 1: terraform init

คำสั่ง terraform init เป็นจุดเริ่มต้นของทุกโปรเจกต์ ใช้สำหรับติดตั้ง provider plugins, module dependencies และเตรียม backend สำหรับเก็บ state file สั่งครั้งแรกเมื่อเริ่มโปรเจกต์ใหม่ หรือเมื่อเพิ่ม provider/module ใหม่ในโค้ด

$ terraform init

Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 5.0"...
- Installing hashicorp/aws v5.31.0...

Terraform has been successfully initialized!

สิ่งที่เกิดขึ้นหลัง init คือ มีโฟลเดอร์ .terraform ถูกสร้างเก็บ provider plugins และ module downloads ไฟล์ .terraform.lock.hcl ถูกสร้างเก็บ checksum ของ provider version เพื่อล็อก version ให้สม่ำเสมอทั่วทั้งทีม

ขั้นตอนที่ 2: terraform plan

คำสั่ง terraform plan อ่าน state ปัจจุบัน เปรียบเทียบกับโค้ด .tf แล้วแสดงรายการการเปลี่ยนแปลงที่จะเกิดขึ้นหากสั่ง apply โดยไม่ได้เปลี่ยนแปลงอะไรจริง ๆ เครื่องหมายสำคัญที่ต้องอ่าน คือ + สำหรับ create, ~ สำหรับ update in-place, -/+ สำหรับ destroy-then-create และ – สำหรับ delete

$ terraform plan

Terraform will perform the following actions:

  # aws_instance.web will be created
  + resource "aws_instance" "web" {
      + ami           = "ami-0c55b159cbfafe1f0"
      + instance_type = "t3.micro"
      + tags          = {
          + "Name" = "web-server"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Plan output เป็นโอกาสสุดท้ายที่จะตรวจสอบก่อนเปลี่ยนแปลง Production ทีมที่ทำงานเป็นระบบจะรัน plan อัตโนมัติใน Pull Request ให้ reviewer ดูก่อน merge และบันทึก plan file ด้วย -out=tfplan เพื่อ apply ซ้ำโดยไม่มีความคลาดเคลื่อนจากการเปลี่ยน state ระหว่างเวลา

ขั้นตอนที่ 3: terraform apply

คำสั่ง terraform apply นำ plan ไปดำเนินการจริง สร้าง/แก้ไข/ลบทรัพยากรตามที่ plan ระบุ หลัง apply สำเร็จ state file จะถูกอัปเดตให้สะท้อนสถานะปัจจุบันของโครงสร้างพื้นฐาน ถ้าไม่ระบุ plan file จะรัน plan อีกครั้งและถาม confirmation ด้วย yes ก่อนเริ่ม

$ terraform apply tfplan

aws_instance.web: Creating...
aws_instance.web: Still creating... [10s elapsed]
aws_instance.web: Creation complete after 32s [id=i-0abc1234567890]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

ข้อควรระวังในขั้น apply คือ หากโค้ดและ state ไม่ sync กัน (เช่น มีคนไปคลิกเปลี่ยนใน console) Terraform อาจ detect drift และพยายามเปลี่ยนกลับ ต้องตรวจ plan ให้ละเอียดก่อนกด apply โดยเฉพาะใน Production

ขั้นตอนที่ 4: terraform destroy

คำสั่ง terraform destroy ลบทรัพยากรทั้งหมดที่ถูกจัดการโดย Terraform ใน working directory นั้น ระบบจะสร้าง plan ของการลบทั้งหมดและขอ confirmation ก่อนเริ่ม destroy ใช้บ่อยในสภาพแวดล้อม dev/staging ที่ต้องการ teardown หลังทดสอบเสร็จ ควรใช้ด้วยความระมัดระวังสูงใน production

$ terraform destroy

Terraform will perform the following actions:

  # aws_instance.web will be destroyed
  - resource "aws_instance" "web" {
      - id = "i-0abc1234567890" -> null
    }

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Enter a value: yes

คำสั่งเสริมที่มักใช้ในชีวิตจริง

  • terraform validate — ตรวจไวยากรณ์ .tf file ก่อน plan
  • terraform fmt — จัด format โค้ดให้ตรงตามมาตรฐาน
  • terraform show — แสดงเนื้อหา state file ในรูปแบบอ่านง่าย
  • terraform state list — ดูรายการทรัพยากรที่ Terraform manage อยู่
  • terraform output — แสดงค่า output ที่กำหนดใน outputs.tf
  • terraform refresh (deprecated แล้วใน v1.4+) — sync state file กับสถานะจริง

Workflow ในทีม: Plan-Then-Apply Pattern

ทีม DevOps นิยมใช้ pattern plan-then-apply ใน CI/CD pipeline โดยแยกสองขั้นตอนเป็น 2 jobs เมื่อเปิด PR job แรกรัน init + validate + plan และโพสต์ output ลง PR comment ให้ reviewer ดู เมื่อ merge เข้า main job ที่สองถึงจะรัน apply โดยอาจต้อง manual approval เพิ่ม

Pattern นี้ลดความเสี่ยงมาก เพราะ reviewer เห็นการเปลี่ยนแปลงจริงก่อนลงมือ ไม่ต้องพึ่งแค่การอ่านโค้ด .tf ซึ่งบางครั้งไม่เห็นผลกระทบที่แท้จริง เช่น การเปลี่ยนชื่อทรัพยากรอาจทำให้ต้อง destroy-then-create ซึ่งเห็นได้จาก plan เท่านั้น

สรุป

Terraform workflow ประกอบด้วย 4 คำสั่งหลัก init สำหรับเตรียมโปรเจกต์ plan สำหรับดูการเปลี่ยนแปลงก่อน apply สำหรับลงมือจริง และ destroy สำหรับ teardown การใช้ plan-then-apply pattern ใน CI/CD pipeline ช่วยให้ทีมทำงานร่วมกันได้อย่างปลอดภัย ลดความเสี่ยงจากการเปลี่ยนแปลงที่ไม่ได้ตั้งใจ และสร้างวินัยในการตรวจทานโครงสร้างพื้นฐานทุกครั้งก่อนแก้ไขจริง