[Terraform] 로컬 변수 사용하기
안녕하세요, 오늘은 테라폼 로컬값에 대해서 정리한 내용을 가지고 포스팅합니다.
‘테라폼으로 시작하는 IaC’를 기준으로 내용 정리하였으며, Cloudnet의 테라폼 스터디 내용을 기반으로 하고 있습니다.
Terraform 코드에서 사용자가 지정한 값이나 속성 값을 가공해 참조할 수 있는 로컬 변수(Local Value)는 외부 입력 없이 코드 내에서만 가공되고 동작하는 값입니다.
로컬 변수는 입력 변수와 달리 선언된 모듈 내에서만 접근 가능하며, 실행 시에 입력받을 수 없습니다.
이를 통해 사용자에게 값이나 표현식을 반복적으로 사용할 수 있는 편의를 제공합니다. 그러나 빈번하게 여러 곳에서 사용되는 경우 실제 값에 대한 추적이 어려워져 유지 관리 측면에서 부담이 발생할 수 있으므로 주의해야 합니다.
로컬 변수 선언 방법
- 로컬 변수를 선언하는 블록은 locals로 시작합니다.
- 선언되는 인수의 값은 상수뿐만 아니라 리소스의 속성, 변수의 값 등을 조합하여 정의할 수 있습니다.
- 동일한 tf 파일 내에서 여러 번 선언할 수 있으며, 여러 파일에 걸쳐 선언하는 것도 가능합니다.
- 단, 로컬 변수 이름은 전체 루트 모듈 내에서 유일해야 합니다.
- 정의되는 속성 값은 지정된 값의 형태에 따라 다양한 유형으로 정의할 수 있습니다.
예제 코드를 통해서 좀 더 확인해 보겠습니다.
provider "aws" {
region = local.region
}
locals {
instance_type = "t2.micro"
region = "ap-northeast-2"
ami_id = "ami-0edc5427d49d09d2a"
tags = {
Name = "example-instance"
Environment = "dev"
}
}
resource "aws_instance" "example" {
ami = local.ami_id
instance_type = local.instance_type
tags = local.tags
}
main.tf 파일에
1. 프로바이더
2. 로컬 변수 (인스턴스 타입, 리전, ami_id, tag 변수)
3. 리소스 블록 (aws_instance 생성을 위한)을 선언했습니다.
보시다시피, 리소스 블록에서 ami_id와 instance_type, tag 값등을 locals 블록에 있는 값을 참조해서 가져올 수 있습니다.
테라폼 플랜 / 적용을 진행해 봅시다.
수행 화면 :
위와 같이 인스턴스가 생성된 것을 확인할 수 있습니다.
그런데 여기서 또 고민해 볼 내용이 있습니다.
locals의 사용법, locals에 내용이 많아질 경우 관리 방법 등에 대한 고민입니다.
먼저, locals를 사용할 경우 로컬 변수를 통해서 리소스 이름을 지정합니다.
locals {
name_suffix = "${var.resource_tags["project"]}-${var.resource_tags["environment"]}"
}
main.tf를 통해서 리소스의 이름을 지정한다고 가정할 때, locals에 다음과 같이 사용하여 프로젝트-환경 명의 prefix를 사용하는 리소스 이름을 할당할 수 있습니다.
이를 통해서 main.tf에는 다음과 같은 내용으로 리소스 생성이 가능해집니다.
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "2.66.0"
name = "vpc-${local.name_suffix}"
## ...
}
module "app_security_group" {
source = "terraform-aws-modules/security-group/aws//modules/web"
version = "3.17.0"
name = "web-sg-${local.name_suffix}"
## ...
}
로컬 변수를 입력 변수와 합쳐서 사용하기
variables.tf
variable "project_name" {
description = "Name of the project."
type = string
default = "my-project"
}
variable "environment" {
description = "Name of the environment."
type = string
default = "dev"
}
variables.tf에 위와 같이 선언되어 있다고 해보겠습니다.
resource_tags라는 맵 형태의 리소스를 받도록 생성하고,
variable "resource_tags" {
description = "Tags to set for all resources"
type = map(string)
default = { }
}
main.tf
locals {
required_tags = {
project = var.project_name,
environment = var.environment
}
tags = merge(var.resource_tags, local.required_tags)
}
main.tf에서 resource_tags와 required_tags를 합쳐서 tag를 생성할 수 있습니다.
이 방식을 사용하여 프로젝트와 환경 태그를 기본으로 설정하고, 추가적인 태그를 resource_tags 변수로 받아서 모든 리소스에 적용할 수 있습니다.
해당 내용은 공식 문서를 통해서도 확인하실 수 있습니다.