2017-09-21 38 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