Moving Terraform Resources’ States from One Remote State to Another
Terraform state can be managed in local file or remote file such as in AWS S3. As the resources go more and more, the state file becomes larger and the time will be longer when executing terraform apply
. To make changes be applied more quickly, we can use terraform apply —-target=
. Or, we could separate the state into small pieces. Move states between local files is easy. But move states between remote states needs a little bit more steps.
Move to an empty state
Assume we are in the directory global/
now (terraform state is set to AWS s3 of course) and want to move one of the resources, module.backend_parameter_store
to a complete new folder deployment/
.
1. Add terraform code in deployment/
, including provider, state settings of AWS S3 and the resource
2. Move the state of module.backend_paramter_store
from global/
to a local state file under deployment/
$ pwd
global
$ terraform state mv -state-out=../deployment/terraform.tfstate module.backend_parameter_store module.backend_parameter_store
3. Initialize terraform under deployment/
and just enter yes in the prompt
$ pwd
deployment
$ terraform init
After that, terraform.tfstate
is empty and all the content is pushed to remote state.
Move to a non-empty state
Assume that we are going to move another resource, module.frontend_parameter_store
to deployment/
and the state already contains module.backend_parameter_store
.
1. Add terraform code of the resource in deployment/
2. Pull the latest state of deployment/
into local file
$ pwd
deployment
$ terraform state pull > terraform.tfstate
3. Move the state of module.frontend_parameter_store
from global/
to deployment/
local state file
$ pwd
global
$ terraform state mv -state-out=../deployment/terraform.tfstate module.frontend_parameter_store module.frontend_parameter_store
4. Push the local state file of deployment/
to remote
$ pwd
deployment
$ terraform state push terraform.tfstate
Note
terraform state mv -state=terraform.tfstate module.frontend_parameter_store module.frontend_parameter_store
in the destination folderdeployment/
is not working for me, so I just push all the content- Be careful when using
state push
since it will overwrite the current state