Renaming a resource or moving it into a module makes Terraform plan a destroy and a create, and 1.1 lets the rename be declared instead.
moved {
from = aws_s3_bucket.uploads
to = module.storage.aws_s3_bucket.this
}
# the plan is now empty rather than proposing to destroy
# a bucket with four years of files in it.
# what it replaces:
# terraform state mv aws_s3_bucket.uploads
# module.storage.aws_s3_bucket.this
# — correct, and a manual step outside review
The value over state mv is that it appears in the plan and therefore in the review, so the rename is something a second person approves rather than something one person ran. The blocks accumulate and are never removed, which is the honest cost: a year later the file has fourteen of them describing history nobody needs.