Dans cette étape, vous apprendrez comment renommer une ressource dans le fichier d'état en utilisant terraform state mv. C'est une tâche courante lors de la refactorisation de votre code Terraform. Si vous renommez un bloc de ressource dans votre fichier .tf, Terraform pensera que vous souhaitez détruire l'ancienne ressource et en créer une nouvelle. La commande state mv vous permet de mettre à jour le fichier d'état pour qu'il corresponde aux modifications de votre code, évitant ainsi une destruction et une création inutiles.
Tout d'abord, renommons la ressource dans notre fichier de configuration. Ouvrez main.tf avec l'éditeur nano :
nano main.tf
Changez le nom de la ressource de example à example_renamed. Le fichier devrait ressembler à ceci :
resource "local_file" "example_renamed" {
content = "This is an example file managed by Terraform."
filename = "${path.module}/example.txt"
}
Appuyez sur Ctrl+X, puis Y, et Enter pour sauvegarder et quitter.
Maintenant, exécutez terraform plan pour voir ce que Terraform a l'intention de faire :
terraform plan
Le plan montrera que Terraform veut détruire local_file.example et créer local_file.example_renamed, ce qui n'est pas ce que nous voulons.
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.
Pour corriger cela, nous allons indiquer à Terraform que nous avons simplement déplacé la ressource. Exécutez la commande terraform state mv avec l'ancienne adresse et la nouvelle adresse :
terraform state mv local_file.example local_file.example_renamed
Vous verrez un message de confirmation :
Move "local_file.example" to "local_file.example_renamed"
Successfully moved 1 object(s).
Maintenant, exécutez à nouveau terraform plan :
terraform plan
Cette fois, Terraform signale qu'aucune modification n'est nécessaire car l'état correspond maintenant à la configuration.
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.