Nesta etapa, você aprenderá como renomear um recurso no arquivo de estado usando o terraform state mv. Esta é uma tarefa comum ao refatorar seu código Terraform. Se você renomear um bloco de recurso no seu arquivo .tf, o Terraform pensará que você deseja destruir o recurso antigo e criar um novo. O comando state mv permite que você atualize o arquivo de estado para corresponder às alterações do seu código, evitando destruição e criação desnecessárias.
Primeiro, vamos renomear o recurso no nosso arquivo de configuração. Abra o main.tf com o editor nano:
nano main.tf
Mude o nome do recurso de example para example_renamed. O arquivo deve ficar assim:
resource "local_file" "example_renamed" {
content = "This is an example file managed by Terraform."
filename = "${path.module}/example.txt"
}
Pressione Ctrl+X, depois Y e Enter para salvar e sair.
Agora, execute o terraform plan para ver o que o Terraform pretende fazer:
terraform plan
O plano mostrará que o Terraform quer destruir local_file.example e criar local_file.example_renamed, o que não é o que queremos.
local_file.example: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
- destroy
Terraform will perform the following actions:
## local_file.example will be destroyed
## (because local_file.example is not in configuration)
- resource "local_file" "example" {
- content = "This is an example file managed by Terraform." -> null
- content_base64sha256 = "F5EYZhFNzSXdE4CUftwQoDVqvdiufZpVyiLMqyZVOcQ=" -> null
- content_base64sha512 = "m1hvaxMuc/EhaKintyI54NSTTJ5yXpqHPCBNoHubF0rvF3JAj36lMj20aPcv21+3/OK+SqkiTlnT/LdvLCwqDA==" -> null
- content_md5 = "a43bdd236c2f0f4d87452ba2ef0867e4" -> null
- content_sha1 = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
- content_sha256 = "17911866114dcd25dd1380947edc10a0356abdd8ae7d9a55ca22ccab265539c4" -> null
- content_sha512 = "9b586f6b132e73f12168a8a7b72239e0d4934c9e725e9a873c204da07b9b174aef1772408f7ea5323db468f72fdb5fb7fce2be4aa9224e59d3fcb76f2c2c2a0c" -> null
- directory_permission = "0777" -> null
- file_permission = "0777" -> null
- filename = "./example.txt" -> null
- id = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
}
## local_file.example_renamed will be created
+ resource "local_file" "example_renamed" {
+ content = "This is an example file managed by Terraform."
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./example.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 1 to destroy.
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
Para corrigir isso, informaremos ao Terraform que simplesmente movemos o recurso. Execute o comando terraform state mv com o endereço antigo e o novo endereço:
terraform state mv local_file.example local_file.example_renamed
Você verá uma mensagem de confirmação:
Move "local_file.example" to "local_file.example_renamed"
Successfully moved 1 object(s).
Agora, execute o terraform plan novamente:
terraform plan
Desta vez, o Terraform relata que nenhuma alteração é necessária porque o estado agora corresponde à configuração.
local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.