J'ai un petit exemple de code qui:
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>
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"
}
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