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.