如何在Terraform中使用动态资源名称?

如何在Terraform中使用动态资源名称?,terraform,Terraform,我希望在几个开发和生产环境中使用相同的terraform模板 我的做法: 据我所知,资源名称必须是唯一的,terraform在内部存储资源的状态。因此,我尝试使用变量作为资源名称,但似乎不受支持。我收到一条错误消息: $ terraform plan var.env1 Enter a value: abc Error asking for user input: Error parsing address 'aws_sqs_queue.SqsIntegrationOrderIn${var.

我希望在几个开发和生产环境中使用相同的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}"
我的地形模板:

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
}

我认为,要么我的方法是错误的,要么语法是错误的。有什么想法吗?

您不能在资源名称内插入。相反,您应该做的是如注释中所述,您应该制作一个terraform模块,其中包含
SqsIntegrationOrderIn
,并采用
env
变量。然后您可以使用该模块两次,它们不会发生冲突。您还可以查看我回答的问题。

我建议为每个环境使用不同的解决方案。这允许您按如下方式指定配置:

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_队列”资源的名称取决于环境(例如,通过将其包含在名称中),以避免aws中的名称冲突。

使用terraform模块进行管理,您不需要动态重新定义资源名称。您应该将Farid的回答标记为正确。该答案中与之相关的类似问题也在现场。文件明确指出,
工作区
不是“适合系统分解的工具”,关于“不同的开发阶段(如分期与生产)”,它是“不适合的隔离机制”,请参见,您应该使用模块并将它们导入到不同的terraform init目录中,用于开发、登台、生产等,并在这些接口中执行特殊的环境操作。最佳实践也是使用不同的AWS帐户,因此名称冲突不是问题。更进一步,OP应该为不同的环境使用不同的AWS帐户,那么名称冲突就不是问题了。使用单独的帐户是一种方法。使用AWS组织,一致同意且易于实施。