Cette rubrique explique comment résoudre les problèmes de gestion liés aux ressources cloud existantes à l'aide de Terraform.
Contexte
Cette rubrique s'applique aux scénarios d'exploitation et de maintenance suivants :
Scénario 1 : Vous utilisez Terraform pour la première fois, mais la console web, Alibaba Cloud CLI, ROS ou les API sont déjà utilisées pour créer et gérer des ressources.
Scénario 2 : Terraform est déjà utilisé pour gérer des ressources. Les états des ressources doivent rester inchangés si les propriétés d'une ressource sont modifiées.
Scénario 3 : Toutes les ressources sont définies dans un modèle. L'ajout de ressources ne complique pas la gestion des modèles ou des états des ressources lors de la reconstruction ou du fractionnement du modèle existant.
Scénario 4 : Les nouveaux paramètres issus des derniers providers doivent être synchronisés avec les documents d'origine.
Terraform permet non seulement de créer, modifier et supprimer de nouvelles ressources grâce aux définitions de modèles de ressources, mais aussi d'importer et de gérer des ressources externes au système de gestion Terraform via des commandes simples, afin d'en assurer une gestion centralisée.
Importer des ressources existantes
Vous pouvez effectuer les opérations suivantes pour importer des ressources existantes dans Terraform :
-
Obtenez les ID des ressources.
Interrogez les ressources en fonction de leurs ID et récupérez leurs propriétés.
-
Déclarez les ressources à importer dans le modèle.
Terraform utilise une méthode pilotée par le modèle. Vous devez déclarer les ressources à importer dans le modèle.
-
Finalisez les définitions du modèle de ressources.
Une fois les ressources importées, complétez les définitions des ressources déclarées dans le modèle en vous basant sur les propriétés des ressources.
-
Obtenez les ID des ressources.
Vous pouvez obtenir les ID des ressources via la console web, Alibaba Cloud CLI ou les API. La méthode la plus simple consiste à saisir des conditions de requête simples via les sources de données Terraform. L'exemple suivant montre comment obtenir l'ID d'une instance SLB :
data "alicloud_slbs" "default" { name_regex = "for-demo*" } output "slb_ids" { value = data.alicloud_slbs.default.ids }Exécutez la commande terraform apply pour afficher les ID de toutes les instances SLB correspondantes :
$ terraform apply data.alicloud_slbs.default: Refreshing state... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: slb_ids = [ "lb-gw8vinrqxxxxxxxxxxx", "lb-gw8axostxxxxxxxxxxx", ] -
Déclarez les ressources à importer dans le modèle.
Comme pour la création de ressources, vous devez déclarer les ressources dans le modèle avant de les importer afin de spécifier le chemin de stockage des ressources dans l'état. Les exemples suivants déclarent une instance SLB :
resource "alicloud_slb" "this" {}Vous pouvez importer des ressources sans définir de paramètres spécifiques après une déclaration simple. Dans Terraform, vous pouvez exécuter la commande import pour importer une ressource. Le format complet de la commande est
Terraform import <Resource type>.<Resource name> <Resource ID>.$ terraform import alicloud_slb.this lb-gw8vinrqxxxxxxxxxxx alicloud_slb.this: Importing from ID "lb-gw8vinrqxxxxxxxxxxx"... alicloud_slb.this: Import prepared! Prepared alicloud_slb for import alicloud_slb.this: Refreshing state... [id=lb-gw8vinrqxxxxxxxxxxx] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform. -
Finalisez les définitions du modèle de ressources.
Le modèle ne contient pas les définitions complètes des ressources importées ; par conséquent, le contenu du modèle diffère de celui stocké dans l'état après l'importation des ressources. Lorsque vous exécutez la commande plan, une mise à jour s'affiche.
$ terraform plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. data.alicloud_slbs.default: Refreshing state... alicloud_slb.this: Refreshing state... [id=lb-gw8vinrqxxxxxxxxxxx] ------------------------------------------------------------------------ An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # alicloud_slb.this will be updated in-place ~ resource "alicloud_slb" "this" { address = "47.254.181.122" ... ~ delete_protection = "on" -> "off" id = "id=lb-gw8vinrqxxxxxxxxxxx" ... ~ name = "for_demo-test" -> "tf-lb-20191108144235105700000001" ... } Plan: 0 to add, 1 to change, 0 to destroy. ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.Pour maintenir la cohérence entre le modèle et l'état de la ressource, vous devez ajouter manuellement les définitions de paramètres manquants dans le modèle jusqu'à ce qu'aucune mise à jour ne s'affiche lors de l'exécution de la commande plan.
resource "alicloud_slb" "this" { delete_protection = "on" name = "for_demo-test" }Vous devez ajouter les champs qui provoquent la mise à jour. Exécutez la commande plan pour vérifier les résultats après avoir finalisé les définitions des paramètres.
$ terraform plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. data.alicloud_slbs.default: Refreshing state... alicloud_slb.this: Refreshing state... [id=lb-gw8vinrqtqx1ro1r94c96] ------------------------------------------------------------------------ No changes. Infrastructure is up-to-date. This means that Terraform did not detect any differences between your configuration and real physical resources that exist. As a result, no actions need to be performed.Les informations ci-dessus indiquent qu'aucune autre modification n'est nécessaire et que le processus d'importation de la ressource est terminé.
Supprimer des ressources existantes
Certains problèmes peuvent survenir en pratique : importation de ressources incorrectes, importation de ressources vers des chemins erronés, nécessité de modifier les chemins des ressources ou besoin de conserver certaines ressources de manière permanente. Une solution simple à ces problèmes consiste à retirer les ressources importées de l'état, puis à les importer à nouveau.
Vous pouvez exécuter la commande state rm pour supprimer des ressources. Le format complet de la commande est terraform state rm <Resource type>.<Resource name>.
$ terraform state rm alicloud_slb.this
Removed alicloud_slb.this
Successfully removed 1 resource instance(s).
La commande state rm retire uniquement la ressource spécifiée du fichier d'état sans la supprimer. Par conséquent, vous pouvez importer à nouveau les ressources.
Résumé
Les solutions suivantes permettent de traiter les quatre scénarios précédents :
-
Solution pour le scénario 1 :
Exécutez la commande terraform import pour importer les ressources existantes et en assurer une gestion centralisée avec Terraform.
-
Solution pour le scénario 2 :
Vous devez déterminer les valeurs des propriétés des paramètres. Si vous souhaitez utiliser les valeurs du modèle, vous devez exécuter la commande apply, puis modifier les valeurs. Si vous souhaitez utiliser les valeurs de la console web, vous devez ajouter ou modifier les valeurs dans le modèle.
-
Solution pour le scénario 3 :
Exécutez la commande terraform state rm pour retirer de l'état toutes les ressources à reconstruire. Ensuite, exécutez la commande terraform import pour importer les ressources.
-
Solution pour le scénario 4 :
Comme pour la solution du scénario 3, retirez les ressources, puis importez-les.
Terraform propose des commandes simples. La commande terraform import permet une gestion centralisée des ressources existantes, selon le principe selon lequel le modèle et l'état doivent avoir un contenu cohérent. Il n'est pas nécessaire de s'inquiéter du fait que les ressources soient externes au système de gestion Terraform ou qu'elles soient retirées de l'état.