2017-09-21 225 views
1

我想爲幾個開發和生產環境使用相同的terraform模板。如何在Terraform中使用動態資源名稱?

我的方法: 據我所知,資源名稱必須是唯一的,並且terraform在內部存儲資源狀態。因此,我試圖爲資源名稱使用變量 - 但似乎不支持。我得到一個錯誤信息:

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

我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 
} 

我認爲,無論是我的做法是錯誤的,或者語法。有任何想法嗎?

+1

使用terraform模塊進行管理,您無需動態重新定義資源名稱。 – BMW

回答

1

我建議爲每個環境使用不同的workspace。這允許你指定你這樣的配置:

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 
} 

確認(例如,通過包括它的名稱),使依賴於環境的「aws_sqs_queue」資源的名稱,以避免在AWS名稱衝突。

1

您不能在資源名稱內插值。相反,你應該做的就是在註釋中提到的@BMW,你應該製作一個terraform模塊,其中包含SqsIntegrationOrderIn裏面並且需要env變量。然後你可以使用這個模塊兩次,他們根本不會發生衝突。你也可以看看我回答的similar question