DevOps/Terraform

[Terraform] merge를 사용하여 변수 합치기

돌돌김 2021. 7. 20. 21:28

 

AWS 태그와 같이 map 타입의 리소스에서 1개의 값만 바꾸고 싶을 경우가 있다. 예를 들어, default_tag를 다음과 같이 정의할 수 있다.

# vars.tf
variable "default_tags" {
  type = map(string)
  default = {
    Name = "resource_name"
    Owner = "doldol-dev"
    Author = "doldol@naver.com"
    Phase = "dev"
  }
}

 

 

생성할 AWS 리소스에 위의 태그를 똑같이 활용해야 하는데, 리소스 별로 Name 값만 다르게 하려면 아래와 같이 할 수 있다.

  • local 변수에 바꾸려는 값만 정의한다.
  • 바꾸려는 값과 기존의 값을 merge 한다.
    • 이때, default 값이 무조건 앞에 들어가야한다. merge 함수의 특징상 뒤에 오는 파라미터가 앞의 파라미터를 덮어쓰기 때문이다.
  • 해당 태그가 필요한 리소스에 merge된 값을 넣는다.
# main.tf
locals {
  state_tags = {
    Name = "doldol-tfstate"
  }
  tags_merge = merge(var.default_tags, local.state_tags)
}

resource "aws_s3_bucket" "tf-state" {
  bucket = "doldol-tf-state-bucket-test"
  acl = "private"
  versioning {
    enabled = true
  }

  tags = local.tags_merge

  lifecycle {
    prevent_destroy = true
  }
}

 

 

terraform plan을 보면 다음과 같다.

# aws_s3_bucket.tf-state will be updated in-place
  ~ resource "aws_s3_bucket" "tf-state" {
        id                          = "doldol-tf-state-bucket-test"
      ~ tags                        = {
          + "Author"    = "doldol@naver.com"
          ~ "Name"      = "doldol-tf-state" -> "doldol-tfstate"
          + "Owner"     = "doldol-dev"
          + "Phase"     = "dev"
        }
      ~ tags_all                    = {
          + "Author"    = "doldol@naver.com"
          ~ "Name"      = "doldol-tf-state" -> "doldol-tfstate"
          + "Owner"     = "doldol-dev"
          + "Phase"     = "dev"
        }
        # (9 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.