안녕하세요, 오늘은 테라폼 로컬값에 대해서 정리한 내용을 가지고 포스팅합니다.
‘테라폼으로 시작하는 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 변수로 받아서 모든 리소스에 적용할 수 있습니다.
해당 내용은 공식 문서를 통해서도 확인하실 수 있습니다.
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] cidrsubnet, cidrsubnets 함수 (0) | 2024.06.23 |
---|---|
[Terraform] count 사용하기 (0) | 2024.06.23 |
[Terraform] 입력 변수 사용하기 (0) | 2024.06.23 |
[Terraform] 테라폼을 이용한 vpc 배포 (0) | 2024.06.23 |
[Terraform] 테라폼으로 서브넷 생성하기 (0) | 2024.06.23 |