count đánh địa chỉ theo index, nên xoá phần tử ở giữa list làm mọi phần tử sau bị shift index và Terraform destroy/recreate hàng loạt.
hcl
# count: xoá "staging" khỏi list -> aws_s3_bucket.b[1] doi tu staging sang prod
resource "aws_s3_bucket" "b" {
count = length(var.envs) # ["dev", "staging", "prod"]
bucket = "acme-${var.envs[count.index]}"
}
# for_each: dia chi la aws_s3_bucket.b["prod"], on dinh
resource "aws_s3_bucket" "b" {
for_each = toset(var.envs)
bucket = "acme-${each.key}"
}Đây là cái bẫy tốn kém nhất với người mới: chèn một subnet vào giữa list và plan báo recreate 10 EC2.
Quy tắc thực dụng: count chỉ dùng cho bật/tắt một resource (count = var.enabled ? 1 : 0); mọi trường hợp tạo nhiều bản dùng for_each với key có ý nghĩa.
Đổi từ count sang for_each trên code đang chạy thì phải khai báo moved, không thì Terraform xoá sạch rồi tạo lại.