2017-09-21 1 views
1

Ich möchte die gleiche Terraform-Vorlage für mehrere Entwicklungs- und Produktionsumgebungen verwenden.Wie werden dynamische Ressourcennamen in Terraform verwendet?

Mein Ansatz: Wie ich es verstehe, muss der Ressourcenname eindeutig sein, und Terraform speichert den Zustand der Ressource intern. Ich habe daher versucht, Variablen für die Ressourcennamen zu verwenden - aber es scheint nicht unterstützt zu werden. Ich erhalte eine Fehlermeldung:

$ 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}" 

Meine Terraforming Vorlage:

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 
} 

Ich denke, entweder mein Ansatz ist falsch, oder die Syntax. Irgendwelche Ideen?

+1

Mit Terraform-Modulen verwalten, müssen Sie den Ressourcennamen nicht dynamisch neu definieren. – BMW

Antwort

1

Ich empfehle die Verwendung einer anderen workspace für jede Umgebung. Auf diese Weise können Sie Ihre Konfiguration wie folgt angeben:

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 
} 

Achten Sie darauf, den Namen des „aws_sqs_queue“ Ressource abhängig von der Umgebung zu machen (zum Beispiel, indem sie es im Namen einschließlich) Namenskonflikte in AWS zu vermeiden.

1

Sie können den Namen der Ressource nicht interpolieren. Stattdessen was Sie tun sollten ist, wie @BMW in den Kommentaren erwähnt haben, sollten Sie ein Terraform-Modul machen, das das SqsIntegrationOrderIn enthält und env Variable nimmt. Dann können Sie das Modul zweimal verwenden, und sie werden einfach nicht kollidieren. Sie können auch einen Blick auf eine similar question ich antwortete.

Verwandte Themen