web-dev-qa-db-fra.com

terraform: comment rendre une ressource idempotente - c'est-à-dire créer si elle n'existe pas mais ne rien faire si elle existe

J'ai un petit exemple de code qui:

  1. crée une instance EC2
  2. crée et ajoute ma clé publique

mais je voudrais que ce soit idempotent. c'est-à-dire que si la clé existe, elle fonctionnera toujours et n'échouera pas avec une erreur.

Je ne sais pas comment faire ça. Aucune suggestion?

Exemple de code:

provider "aws" {
  region = "eu-west-1"
}

module ec2 {
  source = "./ec2_instance"
  name = "EC2 Instance"
} 

resource "aws_key_pair" "my_key" {
  key_name   = "my_key"
  public_key = "<string>"
}

et son aws_key_pair.my_key que j'essaye de rendre idempotent.

En ce moment, je reçois des erreurs comme:

Error: Error applying plan:

1 error(s) occurred:

* aws_key_pair.my_key: 1 error(s) occurred:

* aws_key_pair.my_key: Error import KeyPair: InvalidKeyPair.Duplicate: The keypair 'my_key' already exists.
    status code: 400, request id: <request id>
8
Snowcrash

C'est exactement le comportement de Terraform tant que toutes les ressources du fournisseur ont été créées ou gérées par Terraform.

Si vous avez un compte AWS vide et appliquez Terraform au code de la question, il créera une paire de clés AWS et tout ce qui est inclus dans votre ec2 module.

Si vous exécutez ensuite un plan après cela, il ne montrera aucun changement.

Là où cela tombe, c'est où l'API AWS n'autorise qu'une seule version d'une ressource par quelque chose qui est configurable et qui existe déjà en dehors de ce que Terraform sait. Cela s'applique à la paire de clés AWS où chaque combinaison de compte/région AWS ne peut avoir qu'une seule paire de clés nommée par la même chose.

À ce stade, vous avez deux options: vous pouvez faire en sorte que Terraform gère directement la paire de clés AWS ou vous pouvez simplement vous y référer avec une source de données au lieu d'essayer d'en créer une nouvelle.

Pour que Terraform gère la paire de clés AWS, vous pouvez l'importer en exécutant:

terraform import aws_key_pair.my_key my_key

Si au lieu de cela vous voulez simplement vous y référer, vous pouvez normalement utiliser un source de données mais dans ce cas ce serait inutile (et en tant que tel il n'y a pas de aws_key_pair source de données) car vous vous référez simplement à la paire de clés par son nom, comme dans cet exemple:

resource "aws_instance" "web" {
  AMI           = "am-123456"
  instance_type = "t2.micro"
  key_pair      = "my_key"
}
5
ydaetskcoR

Il semble que vous ayez besoin d'importer le my_key paire de clés dans votre état terraform. Une fois la ressource importée, terraform ne tentera pas de créer la paire de clés existante.

terraform import aws_key_pair.my_key my_key

https://www.terraform.io/docs/import/index.html

0
manojlds