web-dev-qa-db-fra.com

Comment utiliser les noms de ressources dynamiques dans Terraform?

Je voudrais utiliser le même modèle terraform pour plusieurs environnements de développement et de production.

Mon approche: Si je comprends bien, le nom de la ressource doit être unique et terraform stocke l'état de la ressource en interne. J'ai donc essayé d'utiliser des variables pour les noms de ressources - mais cela ne semble pas être pris en charge. Je reçois un message d'erreur:

$ terraform plan
var.env1
  Enter a value: abc

Error asking for user input: Error parsing address 'aws_sqs_queue.SqsIntegrationOrderIn${var.env1}': invalid resource address "aws_sqs_queue.SqsIntegrationOrderIn${var.env1}"

Mon modèle terraform:

variable "env1" {}

provider "aws" {
        region = "ap-southeast-2"
}

resource "aws_sqs_queue" "SqsIntegrationOrderIn${var.env1}" {
        name = "Integration_Order_In__${var.env1}"
        message_retention_seconds = 86400
        receive_wait_time_seconds = 5
}

Je pense que soit mon approche est fausse, soit la syntaxe. Des idées?

13
hey

Je recommande d'utiliser un espace de travail différent pour chaque environnement. Cela vous permet de spécifier votre configuration comme ceci:

variable "env1" {}

provider "aws" {
        region = "ap-southeast-2"
}

resource "aws_sqs_queue" "SqsIntegrationOrderIn" {
        name = "Integration_Order_In__${var.env1}"
        message_retention_seconds = 86400
        receive_wait_time_seconds = 5
}

Assurez-vous de définir le nom de la ressource "aws_sqs_queue" en fonction de l'environnement (par exemple en l'incluant dans le nom) pour éviter les conflits de nom dans AWS.

3
bitbrain

Vous ne pouvez pas interpoler à l'intérieur du nom de la ressource. Au lieu de cela, vous devez faire comme @ BMW comme mentionné dans les commentaires, vous devez créer un module terraform qui contient cette SqsIntegrationOrderIn à l'intérieur et prend la variable env. Ensuite, vous pouvez utiliser le module deux fois, et ils ne s'affronteront tout simplement pas. Vous pouvez également jeter un œil à une question similaire J'ai répondu.

3
Farid Nouri Neshat