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

whe*_*ere 9 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}"
Run Code Online (Sandbox Code Playgroud)

我的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
}
Run Code Online (Sandbox Code Playgroud)

我认为,无论是我的方法是错误还是语法.有任何想法吗?

Far*_*hat 7

您不能在资源名称内插入。相反,你应该做的是@BMW在评论中提到,你应该包含一个terraform模块SqsIntegrationOrderIn内,并采取env变量。然后您可以使用该模块两次,而且它们根本不会发生冲突。你也可以看看我回答过的类似问题


bit*_*ain 6

我建议为每个环境使用不同的工作区。这允许您像这样指定配置:

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
}
Run Code Online (Sandbox Code Playgroud)

确保根据环境创建“aws_sqs_queue”资源的名称(例如,将其包含在名称中)以避免 AWS 中的名称冲突。

  • 文档特别指出,“工作区”“不是适合系统分解的工具”,关于“不同的开发阶段(例如分期与生产)”,它“不是合适的隔离机制”,请参阅 https://www.terraform .io/docs/state/workspaces.html#when-to-use-multiple-workspaces 相反,您应该使用模块并将它们导入到不同的 terraform init 目录中,用于 dev、staging、prod 等,并在这些接口中执行特殊的环境操作。最佳实践也是使用不同的 AWS 账户,因此名称冲突不是问题。 (2认同)