State Commands ที่ใช้บ่อย

📖 text • 10 นาที

State Commands ที่ใช้บ่อย

Terraform มีคำสั่ง terraform state สำหรับจัดการ state file โดยตรง — ใช้เมื่อต้อง refactor หรือแก้ปัญหา

คำเตือน: คำสั่งเหล่านี้แก้ไข state โดยตรง ใช้อย่างระมัดระวัง!

terraform state list

แสดง resource ทั้งหมดใน state:

terraform state list
aws_instance.web
aws_security_group.web
data.aws_ami.amazon_linux
data.aws_vpc.default

Filter ด้วยชื่อ:

terraform state list aws_instance
aws_instance.web

terraform state show

แสดงรายละเอียดของ resource:

terraform state show aws_instance.web
# aws_instance.web:
resource "aws_instance" "web" {
    ami                          = "ami-0abc123"
    id                           = "i-0abc123def456"
    instance_type                = "t2.micro"
    public_ip                    = "54.123.45.67"
    tags                         = {
        "Name" = "web-server"
    }
    ...
}

ใช้ตรวจสอบค่าจริงของ resource ใน state

terraform state mv

ย้ายหรือเปลี่ยนชื่อ resource ใน state — ไม่แก้ไข infrastructure จริง

เปลี่ยนชื่อ resource

สมมติเปลี่ยนชื่อจาก web เป็น app ในโค้ด:

# ก่อน
resource "aws_instance" "web" { ... }

# หลัง
resource "aws_instance" "app" { ... }

ถ้า apply เลย — Terraform จะ ลบ web แล้วสร้าง app ใหม่ (ไม่ต้องการ!)

ใช้ state mv แทน:

terraform state mv aws_instance.web aws_instance.app
Move "aws_instance.web" to "aws_instance.app"
Successfully moved 1 object(s).

ตอนนี้ plan จะไม่เห็นการเปลี่ยนแปลง — Terraform รู้ว่า app คือ instance เดิม

ย้ายเข้า module

terraform state mv aws_instance.app module.compute.aws_instance.app

terraform state rm

ลบ resource ออกจาก state — ไม่ลบ infrastructure จริง

terraform state rm aws_instance.web
Removed aws_instance.web
Successfully removed 1 resource instance(s).

ใช้เมื่อ:

  • ต้องการให้ Terraform หยุดจัดการ resource นี้
  • resource ถูกสร้างด้วย Terraform แต่ต้องการให้ทีมอื่นดูแลต่อ

สำคัญ: หลัง state rm ถ้ารัน apply Terraform จะพยายามสร้าง resource ใหม่ (เพราะยังอยู่ในโค้ดแต่ไม่อยู่ใน state) — ต้องลบออกจากโค้ดด้วย

terraform import

นำ resource ที่มีอยู่แล้ว (สร้างด้วยมือ/เครื่องมืออื่น) เข้ามาใน Terraform state:

วิธีที่ 1: CLI command

terraform import aws_instance.web i-0abc123def456789

ต้องเขียน resource block ในโค้ดก่อน:

resource "aws_instance" "web" {
  # จะ fill arguments หลัง import
}

วิธีที่ 2: import block (Terraform 1.5+)

import {
  to = aws_instance.web
  id = "i-0abc123def456789"
}
# Generate โค้ดอัตโนมัติ
terraform plan -generate-config-out=generated.tf

Terraform จะสร้างไฟล์ generated.tf พร้อม arguments ให้:

resource "aws_instance" "web" {
  ami           = "ami-0abc123"
  instance_type = "t2.micro"
  # ... arguments ทั้งหมด
}

แนะนำ: ใช้ import block + -generate-config-out เพราะง่ายกว่าและ error-prone น้อยกว่า

terraform state pull / push

Pull — ดาวน์โหลด state

terraform state pull > state.json

ใช้ดูหรือ backup state file

Push — อัพโหลด state (อันตราย!)

terraform state push state.json

คำเตือน: ไม่ค่อยได้ใช้ ใช้เฉพาะกรณี emergency เท่านั้น

terraform force-unlock

ปลดล็อค state ที่ค้าง (เช่น process crash ระหว่าง apply):

terraform force-unlock LOCK_ID
# หา lock ID จาก error message
# Error: Error locking state: Lock ID: "abc-123-def"

terraform force-unlock abc-123-def

คำเตือน: ตรวจสอบให้แน่ใจว่าไม่มีใครกำลัง apply อยู่จริงๆ ก่อน force-unlock

สรุป Commands

Command หน้าที่ อันตราย?
state list ดู resource ทั้งหมด ไม่ (อ่านอย่างเดียว)
state show ดูรายละเอียด resource ไม่
state mv เปลี่ยนชื่อ/ย้าย resource ปานกลาง
state rm ลบ resource ออกจาก state สูง
import นำ resource เข้ามาใน state ปานกลาง
state pull ดาวน์โหลด state ไม่
state push อัพโหลด state สูงมาก
force-unlock ปลดล็อค state สูง

เมื่อไรใช้อะไร?

สถานการณ์ Command
เปลี่ยนชื่อ resource ในโค้ด state mv
ย้าย resource เข้า module state mv
หยุดจัดการ resource state rm + ลบจากโค้ด
นำ resource ที่สร้างมือเข้ามา import
State lock ค้าง force-unlock

บทถัดไปเรามา Lab ตั้งค่า Remote State บน S3 กัน