是否可以在Terraform中生成变量名

时间:2019-09-25 20:37:38

标签: terraform

所以我想在terraform远程状态下获取该变量,但是共享路由53上每个环境都有许多不同的变量

因此,对于给定的环境,我们要像这样拉出区域ID;

zone_id = data.terraform_remote_state.route_53.route53_zone_ $ {var.environment} _id

请问我该怎么做。

1 个答案:

答案 0 :(得分:1)

通常,不能将任意动态字符串用作变量名。

但是,在这种特殊情况下,terraform_remote_state的输出是集合值,因此您可以使用索引语法从映射值访问动态构建的键:

data.terraform_remote_state.outputs.route53["route53_zone_${var.environment}_id"]

话虽如此,如果可能的话,我建议更好地构造输出值,以便按环境将Route53区域ID作为地图给出,以便可以通过更直观的方式获得。

例如,您可以将route53输出作为对象的映射,这些对象的键是环境名称:

data.terraform_remote_state.outputs.route53[var.environment].zone_id
output "route53" {
  value = tomap({
    production = {
      zone_id = aws_route53_zone.production.id
    }
    staging = {
      zone_id = aws_route53_zone.staging.id
    }
  })
}

或者,如果您具有各种不同的每个环境设置,则可以将其构造为单个输出值,该输出值是所有以环境名称为键的每个环境设置的映射:

data.terraform_remote_state.outputs.environments[var.environment].route53_zone_id
output "environments" {
  value = tomap({
    production = {
      ec2_vpc_id      = aws_vpc.production.id
      route53_zone_id = aws_route53_zone.production.id
    }
    staging = {
      ec2_vpc_id      = aws_vpc.staging.id
      route53_zone_id = aws_route53_zone.staging.id
    }
  })
}

这不会改变最终结果,但是根据您的输出中的环境键对内容进行分组很可能使您的意图对这些配置的未来维护者更加清楚。

(您可能还会考虑在每个环境中单独配置/状态而不是完全管理它们会更好,但这本身就是一个大话题。)