首页 文章

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

提问于
浏览
3

我想为几个开发和 生产环境 环境使用相同的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
}

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

2 回答

  • 3

    我建议为每个环境使用不同的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中的名称冲突 .

  • 2

    您无法在资源名称内插值 . 相反,你应该做的是@BMW已经在评论中提到,你应该制作一个包含 SqsIntegrationOrderIn 里面的terraform模块,并采用 env 变量 . 然后你可以使用该模块两次,它们不会发生冲突 . 你也可以看一下我回答的similar question .

相关问题