Jeru helps refactor Terraform code.
One of Terraform's most valuable features is its plan command, which provides a safe preview of the changes it will make to infrastructure.
Unfortunately, this feature does not extend to state commands for moving resources,
which are often necessary while refactoring Terraform code to prevent Terraform from destroying and recreating resources that are only changing addresses.
Jeru will run terraform plan as part of its operation in order to get an up to date plan.
Additional flags for that underlying terraform plan can be passed through Jeru following a double-dash (--).
(This is most useful if you use a variables file, ex. terraform plan -var-file staging.tfvars.)
Jeru's find command suggests possible terraform state mv commands to run given the current terraform plan.
In normal mode, find will consider all possible valid refactors and return the "best" set of commands.
In interactive mode (--i), find will walk you through the plan, providing the opportunity to match resources being deleted with resources being created.
Jeru's plan command provides a safe way to preview how terraform plan would be affected by moving resources in state.
Jeru makes a copy of the current state, applies your proposed/WIP state commands to that copy, and finally runs terraform plan against that (now-mutated) copy.
The example directory provides a Terraform entrypoint with a module named original.
Running terraform init && terraform plan shows the local state is up to date with no changes to make.
Try changing the module name from original to new and re-running terraform init && terraform plan.
Terraform now reports 8 to add and 8 to destroy.
First, Jeru can suggest some commands to run that may help:
../out/jeru findYou can also step through this resource-by-resource by adding the --i flag.
Let's write this to a file for use with the next command:
../out/jeru find > ./move.shIf we ran the state commands in move.sh, a subsequent re-run of terraform plan would report no changes to make, infrastructure up to date.
Before changing the actual state, though, Jeru can safely test these changes in advance:
../out/jeru plan ./move.sh- Build Jeru via
make buildand call it via./out/jeru. - Run the tests via
make test.