在Terraform中将代码块提取为变量

在Terraform中将代码块提取为变量,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我现在有一些地形,看起来像这样: resource "aws_autoscaling_group" "my_asg" { ... tag { key = "ManagedBy" value = "Terraform" propagate_at_launch = true } } 问题是这个代码块相当大,而且许多标记在多个ASG中都是通用的,所以为了尝试将其缩小到更易于管理和减少重复,我想对通用标记执

我现在有一些地形,看起来像这样:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}
问题是这个代码块相当大,而且许多标记在多个ASG中都是通用的,所以为了尝试将其缩小到更易于管理和减少重复,我想对通用标记执行以下操作:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag = "${var.managed_by_tag}"
}

variable "managed_by_tag" {
  type = "map"
  default = {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}
不幸的是,当我对此运行
terraform apply
时,我得到以下错误:

Error: Error loading C:\path\to\file.tf: Error reading config for aws_autoscaling_group[my_asg]: At 32:9: unknown slice type: *ast.LiteralType
从这个错误来看,问题在于它试图把一个错误类型的东西——在这个例子中是一张地图——放在一个不属于它的地方。但让我感到困惑的是,以下内容是正确的,并且暗示(至少对我来说,作为一个地形noob)地图在这里应该是正确的:

resource "aws_autoscaling_group" "my_asg" {
  ...
  tag = {
    key                 = "ManagedBy"
    value               = "Terraform"
    propagate_at_launch = true
  }
}
因此,我的问题是:

  • 有没有办法将这些标记提取到变量中
  • 为什么我的上述方法不起作用

  • 您用于公共标记的变量是正确声明的,这取决于您如何将其传递给标记代码块。尝试插入过程标记的方式是错误的类型,如果使用merge函数,将以正确的格式返回。您可以在下面的文档中看到这一点


    tags=“${merge(var.managed\u by\u tag)}”

    仔细查看
    tag=“${var.managed\u by\u tag}”
    : 您将地图插入到一个字符串中,然后尝试在Terraform需要地图的地方使用该字符串

    请尝试以下方法:

     resource "aws_autoscaling_group" "my_asg" {
       ...
       tag = var.managed_by_tag
     }
    

    谢谢,但这会产生与以前完全相同的错误。问题是,尽管看起来标记块需要一个映射,但传入映射变量失败。如果merge函数可以工作,那么通过下面的map函数分配它也可以工作,但事实并非如此
    tag=“${map(“key”,“ManagedBy”,“value”,“Terraform”,“propagate_at_launch”,true)}”
    (我最初尝试过,但显然忘记了在原始问题中包括这一点-我对此表示歉意)嗨,不确定。我用Azure提供商(资源组)做了一个快速测试,结果很好。