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ถ้ารันapplyTerraform จะพยายามสร้าง 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 กัน