Terraform Notes
Moving resources and backing up tf state
This will illustrate process of migrating resources from one state to another as well as backing up and reverting to different states.
In your working directory, you should have at least terraform.tfstate. If you have defined an external backend, then this file may be cached under .terraform directory (and your actual changes are happening on remote location).
if your main.tf is this:
variable "timestamps" { type = bool default = false } resource "null_resource" "exampleA" { triggers = { key = formatdate("YYYY-MM-DD hh:mm:ssZZZZZ", timestamp()) } }
Then your intial terraform.tfstate would look like this:
{ "version": 4, "terraform_version": "0.12.24", "serial": 1, "lineage": "d0427b0f-6517-25bb-f708-6666666666", "outputs": {}, "resources": [ { "mode": "managed", "type": "null_resource", "name": "exampleA", "provider": "provider.null", "instances": [ { "schema_version": 0, "attributes": { "id": "8139684392621207633", "triggers": { "key": "2020-04-23 17:41:12+00:00" } }, "private": "bnVsbA==" } ] } ] }
To get list of all your resource, you can run "terraform state list"
From the output from above, you can use the mv command to move resources to be managed by different terraform state. You can also use this command to refactor the name of the resource.
terraform state mv
-backup='terraform.backup.tfstate'
-state-out='terraform.new.tfstate'
null_resource.exampleA
null_resource.exampl
The above command will create two additional terraform state files.
terraform.tfstate
{ "version": 4, "terraform_version": "0.12.24", "serial": 2, "lineage": "d0427b0f-6517-25bb-f708-6666666666", "outputs": {}, "resources": [] }
terraform.new.tfstate
{ "version": 4, "terraform_version": "0.12.24", "serial": 1, "lineage": "c7e1be5e-5363-39be-7078-6666666666", "outputs": {}, "resources": [ { "mode": "managed", "type": "null_resource", "name": "exampleB", "provider": "provider.null", "instances": [ { "schema_version": 0, "attributes": { "id": "8139684392621207633", "triggers": { "key": "2020-04-23 17:41:12+00:00" } }, "private": "bnVsbA==" } ] } ] }
terraform.backup.tfstate
{ "version": 4, "terraform_version": "0.12.24", "serial": 1, "lineage": "d0427b0f-6517-25bb-f708-6666666666", "outputs": {}, "resources": [ { "mode": "managed", "type": "null_resource", "name": "exampleA", "provider": "provider.null", "instances": [ { "schema_version": 0, "attributes": { "id": "8139684392621207633", "triggers": { "key": "2020-04-23 17:41:12+00:00" } }, "private": "bnVsbA==" } ] } ] }
Note that lineage of terraform.tfstate and terraform.backup.tfstate is going to be identical.
If you run terraform state list now you'll get nothing.
To go back to previous tf state, you can run the command in reverse where source (-state) is the new terraform state file and destination (-state-out) is the original state file.
terraform state mv -backup='terraform.backup2.tfstate' -state-out='terraform.tfstate' -state='terraform.new.tfstate' null_resource.exampleB null_resource.exampleA
If this is just a local state, you can also just rename terraform.backup.tfstate to terraform.tfstate.
Now if you run terraform state list again you'll get your resource back.
No comments:
Post a Comment