Jack Compton
Jack Compton

Reputation: 353

Rename instead of delete resource?

Is there any way to avoid resource deletion when reorganizing/renaming resources? Example: when I first implemented CloudFront Terraform it was an independent sub directory in my project, later I switched to using it as a module in. my root Terraform config but this caused Terraform to want to delete the old CloudFront distribution and create a new one:

Terraform will perform the following actions:
    - aws_cloudfront_distribution.main_site_distribution
    + module.cloudfront.aws_cloudfront_distribution.main_site_distribution

Is there any way to force Terraform to rename the resource instead?

Upvotes: 24

Views: 10430

Answers (2)

Firefishy
Firefishy

Reputation: 368

Terraform v1.1+ now has a moved {from... to...} block which can be used for these sort of refactoring.

I'd strongly recommend using moved {} over changing state via the terraform cli.

Per your example this would fix the delete and create:

moved {
  from = aws_cloudfront_distribution.main_site_distribution
  to   = module.cloudfront.aws_cloudfront_distribution.main_site_distribution
}

Terraform refactoring documentation has been updated.

Upvotes: 3

ydaetskcoR
ydaetskcoR

Reputation: 56869

Unfortunately Terraform doesn't know that you've renamed/moved the resource around but you could tell it where the resource should be stored in the state by using terraform state mv.

In your case if you ran:

terraform state mv aws_cloudfront_distribution.main_site_distribution module.cloudfront.aws_cloudfront_distribution.main_site_distribution

and then run another plan you should see no changes (or only the changes to the resource you have made as well as the move).

Upvotes: 34

Related Questions