首页 文章

Terraform动态变量

提问于
浏览
0

我正在创建子网作为单独的terraform模板的一部分,并按如下方式导出ID .

output "subnet-aza-dev" {
  value = "${aws_subnet.subnet-aza-dev.id}"
}
output "subnet-azb-dev" {
  value = "${aws_subnet.subnet-azb-dev.id}"
}
output "subnet-aza-test" {
  value = "${aws_subnet.subnet-aza-test.id}"
}
output "subnet-azb-test" {
  value = "${aws_subnet.subnet-azb-test.id}"
}
...

然后,我打算在另一个模板中查找这些ID,这个模板可以重复用于配置多个环境 . 下面的示例显示我的第二个模板是调用模块来配置EC2实例并通过subnet_id .

variable "environment" {
    description = "Environment name"
    default     = "dev"
}

module "sql-1-ec2" {
  source     = "../modules/ec2winserver_sql"
  ...
  subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-dev}" 
}

我想要做的是传递环境变量作为subnet_id查找的一部分,例如

subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-${var.environment}"

但是我知道不支持变量插值 . 我已经尝试使用第一个terraform模板中的 Map 将它们全部导出到“子网”,然后我可以使用它从第二个模板中查找 . 这不起作用,因为我无法在 Map 内输出变量 .

这种设计模式是我以前在CloudFormation中使用的,但是我对terraform更新 . 我错过了一些明显的东西吗?

1 回答

  • 0

    使用数据源设计了一种方法

    variable "environment" {
        description = "Environment name"
        default     = "dev"
    }
    
    module "sql-1-ec2" {
      source     = "../modules/ec2winserver_sql"
      ...
      subnet_id  = "${data.aws_subnet.subnet-aza.id}" 
    }
    
    data "aws_subnet" "subnet-aza" {
      filter {
        name   = "tag:Name"
        values = ["${var.product}-${var.environment}-${var.environmentno}-subnet-aza"]
      }
    }
    data "aws_subnet" "subnet-azb" {
      filter {
        name   = "tag:Name"
        values = ["${var.product}-${var.environment}-${var.environmentno}-subnet-azb"]
      }
    }
    

    虽然这可以满足我的原始需求,但我想通过将 data 块移动到模块内来改进这一点,这样就可以减少重复次数 . 尽管如此......

相关问题