Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Define tags in central section in TerraForm

I'm playing around with Terraform for a bit and I was wondering if this is possible. It's best practice to assign tags to each resource you create on AWS (for example). So, what you do first is come up with a tagging strategy (for example, which business unit, a name of the app, a team responsible for it, ...).

However, in Terraform, this means that you have to repeat each tags-block for each resource. This isn't very convenient and if you want to update 1 of the tag names, you have to update each resource that you created.

For example:

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

  tags {
    Name         = "${var.name}"
    Project      = "${var.projectname}"
    Environment  = "${var.environment}"
  }
}

If I want to create a Subnet and EC2 in that VPC with the same tags, I have to repeat that tags-block. If I want to update 1 of the tag names later on, I have to update each resource individually, which is very time consuming and tedious.

Is there a possibility to create a block of tags in a centralized location and refer to that? I was thinking of Modules, but that doesn't seem to fit the definition of a module.

like image 477
Bjorn121 Avatar asked May 15 '17 13:05

Bjorn121


People also ask

How do you use tags in Terraform?

The tags include the default ASG tags but not the default tags from your provider configuration. Use the -replace option for terraform apply to reprovision the Auto Scaling group and launch a new instance with the appropriate tags. Confirm that the new EC2 instance managed by the ASG has the default tags.

How do I pass multiple tags in Terraform?

However, in Terraform, this means that you have to repeat each tags-block for each resource. This isn't very convenient and if you want to update 1 of the tag names, you have to update each resource that you created. If I want to create a Subnet and EC2 in that VPC with the same tags, I have to repeat that tags-block.

How do I update Terraform tags?

You can update tags by changing the TF config of the EBS volume. If the EBS volume isn't managed by TF you'll need to write a config and import the resource. If so, how would one update the associated volume_tag's after the fact? Tagging ebs volumes in an instance resource was added to TF 0.11.

How do you define a variable in Terraform?

Terraform variables allow you to write configuration that is flexible and easier to re-use. Add a variable to define the instance name. Create a new file called variables.tf with a block defining a new instance_name variable. Note: Terraform loads all files in the current directory ending in .


3 Answers

You can also try local values from version 0.10.3. It allows you to assign a symbolic local name to an expression so it can be used multiple times in configuration without repetition.

# 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"
    )
  )}"
}
like image 116
dsumsky Avatar answered Oct 28 '22 02:10

dsumsky


Terraform version .12 onwords,

This is the variable

variable "sns_topic_name" {
  type        = string
  default     = "VpnTopic"
  description = "Name of the sns topic"
}

This is the code


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
    }
  )
}

Output will be

  + tags         = {
      + "Name"      = "VpnTopic"
      + "Terraform" = "true"
    }
like image 29
Jobin James Avatar answered Oct 28 '22 02:10

Jobin James


Terraform now natively support it for AWS provider.

Check out here

like image 32
Lior Sam Avatar answered Oct 28 '22 04:10

Lior Sam