在TerraForm的中央部分定义标签

Bjo*_*121 4 amazon-web-services terraform

我正在玩Terraform一段时间,我想知道这是否可行.最佳做法是为您在AWS上创建的每个资源分配标签(例如).因此,您首先要做的是提出标记策略(例如,哪个业务部门,应用程序的名称,负责它的团队,......).

但是,在Terraform中,这意味着您必须为每个资源重复每个标记块.这不是很方便,如果要更新其中一个标记名称,则必须更新您创建的每个资源.

例如:

resource "aws_vpc" "vpc" {
  cidr_block = "${var.cidr}"

  tags {
    Name         = "${var.name}"
    Project      = "${var.projectname}"
    Environment  = "${var.environment}"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我想在具有相同标签的VPC中创建子网和EC2,我必须重复该标签块.如果我想稍后更新其中一个标签名称,我必须单独更新每个资源,这非常耗时且乏味.

是否有可能在集中位置创建一个标签块并参考?我在考虑模块,但这似乎不适合模块的定义.

dsu*_*sky 8

您还可以尝试0.10.3版本的本地值.它允许您为表达式分配符号本地名称,以便在配置中多次使用它而不重复.

# Define the common tags for all resources
locals {
  common_tags = {
    Component   = "awesome-app"
    Environment = "production"
  }
}

# Create a resource that blends the common tags with instance-specific tags.
resource "aws_instance" "server" {
  ami           = "ami-123456"
  instance_type = "t2.micro"

  tags = "${merge(
    local.common_tags,
    map(
      "Name", "awesome-app-server",
      "Role", "server"
    )
  )}"
}
Run Code Online (Sandbox Code Playgroud)


Job*_*mes 6

Terraform 版本 .12 onwords,

这是变量

variable "sns_topic_name" {
  type        = string
  default     = "VpnTopic"
  description = "Name of the sns topic"
}
Run Code Online (Sandbox Code Playgroud)

这是代码


locals {
  common_tags = {
    Terraform = true
  }
}

# Create a Resource

resource "aws_sns_topic" "sns_topic" {
  name         = var.sns_topic_name

  tags = merge(
    local.common_tags,
    {
      "Name" = var.sns_topic_name
    }
  )
}

Run Code Online (Sandbox Code Playgroud)

输出将是

  + tags         = {
      + "Name"      = "VpnTopic"
      + "Terraform" = "true"
    }
Run Code Online (Sandbox Code Playgroud)