Search code examples
terraformtagsterraform-provider-aws

How do I use the value of provider default tags in a data source or resource block in terraform?


Below is a small snippet of a set of terraform script I'm trying to build. The goal is to define an IAM policy that will be attached to a new IAM role that I will create.

My problem is I'm trying to use the environment tag that I've defined in my AWS provider's default_tags block but I'm not sure how. The goal is to pull the environment value as part of the S3 prefix in the IAM policy document instead of having it hard coded.

Is there a way to do this?

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "4.19.0"
    }
  }
  required_version = ">=1.2.3"
}

provider "aws" {
  default_tags {
      tags = {
        Environment = "dev"
        Application = "myapp"
        Terraform = "true"
      }
    }
}

data "aws_iam_policy_document" "this" {

  statement {
    sid = "S3BucketAccess"
    actions = "s3:*"
    resources = [
      "${data.aws_s3_bucket.this.arn}/dev"
    ]
  }
}

data "aws_s3_bucket" "this" {
  bucket = "myBucket"
}

Notice


Solution

  • A solution without code duplication is to use aws_default_tags:

    terraform {
      required_providers {
        aws = {
          source = "hashicorp/aws"
          version = "4.19.0"
        }
      }
      required_version = ">=1.2.3"
    }
    
    provider "aws" {
      default_tags {
          tags = {
            Environment = "dev"
            Application = "myapp"
            Terraform = "true"
          }
        }
    }
    
    # Get the default tags from the provider
    data "aws_default_tags" "my_tags" {}
    
    data "aws_iam_policy_document" "this" {
      statement {
        sid = "S3BucketAccess"
        actions = "s3:*"
        resources = ["${data.aws_s3_bucket.this.arn}/${data.aws_default_tags.my_tags.tags.Environment}/*"
        ]
      }
    }