Vấn đềBạn đang trong quá trình triển khai (deployment) thì terminal đột nhiên gặp trở ngại. Thay vì thanh tiến trình như thường lệ, bạn lại phải đối mặt với một thông báo lỗi màu đỏ: Instance cannot be destroyed. Đây không phải là lỗi của Terraform. Đó là một tính năng an toàn đang hoạt động đúng như những gì nó được thiết lập. Thông thường, một lập trình viên đã thêm một lớp bảo vệ cho một tài nguyên quan trọng—như cơ sở dữ liệu RDS production hoặc một VPC cốt lõi—để ngăn chặn việc vô tình xóa nó bằng một lệnh nhầm lẫn.
Thông báo lỗi```
Error: Instance cannot be destroyed
Resource aws_s3_bucket.example has lifecycle.prevent_destroy set, but the plan calls for this resource to be destroyed. To avoid this error and continue, you must remove the lifecycle.prevent_destroy configuration from this resource.
## Tại sao lỗi này lại xảy ra?Meta-argument `prevent_destroy` là chốt chặn an toàn cuối cùng. Khi được đặt thành `true`, Terraform sẽ từ chối bất kỳ kế hoạch (plan) nào dẫn đến việc tài nguyên đó bị xóa. Lớp bảo vệ này thường được kích hoạt trong hai trường hợp cụ thể:
- **Xóa có chủ đích:** Bạn đã chạy lệnh `terraform destroy` hoặc xóa khối tài nguyên (resource block) khỏi các tệp `.tf` của mình.- **Thay thế vô tình:** Bạn đã thay đổi một thiết lập yêu cầu hành động "Force New" (Bắt buộc tạo mới). Ví dụ, việc thay đổi `name` của một `aws_s3_bucket` hoặc `availability_zone` của một `aws_instance` sẽ buộc Terraform phải xóa tài nguyên cũ và tạo một tài nguyên mới.## Cách khắc phục nhanh: Tạm thời vô hiệu hóa bảo vệNếu bạn thực sự cần thay thế hoặc xóa tài nguyên, bạn phải sửa đổi mã nguồn. Terraform không cung cấp cờ dòng lệnh (như `--force`) để bỏ qua bước kiểm tra an toàn này. Bạn phải tắt chế độ bảo vệ theo cách thủ công.
- Mở tệp cấu hình chứa tài nguyên đó.- Tìm khối `lifecycle`.- Đặt `prevent_destroy = false` hoặc comment (vô hiệu hóa) toàn bộ khối này.```
resource "aws_s3_bucket" "example" {
bucket = "my-production-data-12345"
# lifecycle {
# prevent_destroy = true
# }
}
Sau khi lưu tệp, hãy chạy lại terraform plan. Lỗi sẽ biến mất và Terraform sẽ tiếp tục quá trình xóa hoặc thay thế theo yêu cầu.
Giải pháp lâu dài: Xử lý thay thế tài nguyênĐiều gì xảy ra nếu bạn không muốn xóa bất cứ thứ gì? Thông thường, lỗi này xuất hiện trong quá trình terraform apply định kỳ do một thay đổi cấu hình nhỏ. Nếu việc thay thế bị bắt buộc một cách bất ngờ, bạn cần điều tra nguyên nhân.
Bước 1: Phân tích PlanRun terraform plan và tìm kiếm cụm từ # aws_s3_bucket.example must be replaced. Terraform sẽ đánh dấu thuộc tính cụ thể gây ra xung đột bằng # forces replacement. Nếu bạn thấy rằng việc thay đổi một tag đơn giản hoặc mô tả lại bắt buộc phải thay thế tài nguyên, đó có thể là một đặc thù của provider.
Bước 2: Hoàn tác hoặc Di chuyểnNếu việc thay thế là một sai sót, hãy hoàn tác tệp .tf của bạn về trạng thái trước đó. Nếu thay đổi là bắt buộc nhưng bạn không thể để mất tài nguyên, hãy cân nhắc sử dụng khối moved (có sẵn trong Terraform 1.1+). Điều này cho phép bạn đổi tên tài nguyên trong tệp state mà không cần tạo lại hạ tầng thực tế.
Bước 3: Xóa khỏi State (Nâng cao)Sometimes you want to keep the resource in the real world (e.g., in the AWS Console) but stop managing it via Terraform. In this case, use the state rm command:
terraform state rm aws_s3_bucket.example
Lệnh này sẽ xóa tài nguyên khỏi tệp terraform.tfstate của bạn. Sau đó, bạn có thể xóa khối mã một cách an toàn mà không lo Terraform cố gắng tác động đến S3 bucket thực tế.
Các thực hành tốt nhất cho môi trường ProductionSử dụng prevent_destroy là một bước đi thông minh cho các tài nguyên lưu trữ trạng thái (stateful) như cơ sở dữ liệu hoặc bộ lưu trữ. Tuy nhiên, việc áp dụng nó cho mọi tài nguyên có thể làm cho các pipeline CI/CD của bạn trở nên cứng nhắc và gây khó khăn khi quản lý. Hãy chỉ dành nó cho những tài nguyên "sống còn" trong hạ tầng của bạn.
Lỗi cấu hình thường bắt nguồn từ dữ liệu sai định dạng trong các tệp bên ngoài. Nếu các biến Terraform của bạn được lấy từ các nguồn JSON hoặc YAML phức tạp, chỉ một lỗi thụt lề cũng có thể kích hoạt việc thay thế tài nguyên ngoài ý muốn. Tôi thường sử dụng YAML ↔ JSON Converter trên ToolCraft để kiểm tra cấu trúc cấu hình của mình. Nó giúp tôi phát hiện lỗi cú pháp trước khi chúng ảnh hưởng đến Terraform CLI.
Các bước xác minhĐể xác nhận việc khắc phục đã hoàn tất, hãy thực hiện theo quy trình sau:
- Chạy
terraform plan -out=tfplan.- Xác nhận plan hoàn tất mà không gặp lỗi "Instance cannot be destroyed".- Kiểm tra kỹ đầu ra để đảm bảo chỉ có 5 hoặc 10 tài nguyên dự kiến bị tác động.- Thực thiterraform apply tfplanđể áp dụng các thay đổi.Sau khi cập nhật hoàn tất, đừng quên đặtprevent_destroytrở lại thànhtrue. Thà có lớp bảo vệ mà không dùng đến còn hơn là mất một cơ sở dữ liệu production chỉ vì một lỗi đánh máy.

