Terraform의 Variables에는 input, local, output가 있다.
해당 글에서는 각 변수의 역할을 정리하고 어떻게 사용하는지 간단한 예제를 살펴보겠다.
내용과 관련된 Terraform 공식 문서는 다음과 같다.
input
input 변수는 사용자의 입력을 받을 수 있는 변수이다.
variable "image_id" {
type = string
}
variable "availability_zone_names" {
type = list(string)
default = ["us-west-1a"]
}
variable "docker_ports" {
type = list(object({
internal = number
external = number
protocol = string
}))
default = [
{
internal = 8300
external = 8300
protocol = "tcp"
}
]
}
variable 키워드 뒤의 label은 변수의 이름이며 동일한 모듈의 모든 변수 간에 고유해야 한다.
이 이름은 외부에서 변수에 값을 할당하고 모듈 내에서 변수 값을 참조하는데 사용된다.
변수의 이름은 source, version, providers, count, for_each, lifecycle, depends_on, local을 제외하고 유효한 식별자가 될 수 있다.
input 변수를 정의할 때 default 필드가 존재하지 않는 경우, 사용자에게 직접 입력을 받는 프롬프트를 발생시켜서 값을 받을 수 있다.
예를 들어 string 타입의 변수를 사용자에게 입력받아야 하는 경우 다음과 같이 variable을 정의할 수 있다.
variable "image_id" {
type = string
}
local
local 변수는 현재 실행 파일에서 사용되는 지역 변수이다.
주로 특정 값을 연산하여 하나의 변수로 만들어야 할 때 사용된다.
locals {
service_name = "forum"
owner = "Community Team"
}
다음과 같이 로컬 변수와 관련된 세트는 하나의 locals 블록 내에 선언할 수 있다.
locals {
# Ids for multiple sets of EC2 instances, merged together
instance_ids = concat(aws_instance.blue.*.id, aws_instance.green.*.id)
}
locals {
# Common tags to be assigned to all resources
common_tags = {
Service = local.service_name
Owner = local.owner
}
}
local 변수의 표현식은 리터럴 상수에만 제한되지 않는다.
local 변수의 표현식은 변수, 리소스 속성, 또는 다른 local 변수를 포함해 다른 변수를 변형하거나 결합하기 위해 모듈 내의 다른 값을 참조할 수 있다.
locals {
tags = merge(
var.tags1,
var.tags2,
)
instance_ids = concat(aws_instance.blue.*.id, aws_instance.green.*.id)
max_subnet_length = max(
length(var.public_subnets),
length(var.private_subnets)
)
}
다음과 같이 merge, concat, max와 같은 함수를 사용해 변수를 만들 수 있다.
Output
output 변수는 terraform 수행 후 결과를 사용자에게 출력 해주는 변수이다.
output 변수로 정의한 값을 외부로 노출시켜 모듈 간 리소스를 참조할 수 있도록 한다.
output "instance_ip_addr" {
value = aws_instance.server.private_ip
}
모듈 A에서 만든 aws_vpc 정보를 모듈 B에서 사용해야 할 때 모듈 A에 output을 정의하면 해당 output 값이 state 파일에 기록되며 모듈 B에서는 다음과 같이 값을 사용할 수 있다.
module.<MODULE NAME>.<OUTPUT NAME>
Data source
Data source는 이미 생성된 리소스를 가져와서 변수로 저장할 때 사용된다.
예를들어 아래 예시와 같이 원하는 filter 값을 설정해 ami 정보를 가져올 수 있다.
# Find the latest available AMI that is tagged with Component = web
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}
filter {
name = "tag:Component"
values = ["web"]
}
most_recent = true
}
data 사용은 data.<TYPE>.<NAME>.<ATTRIBUTE> 과 같이 사용할 수 있다.
resource "aws_instance" "web" {
ami = data.aws_ami.web.id
instance_type = "t1.micro"
}
local vs variable
local과 variable 모두 변수이고 어떤 상황에서 어떻게 사용해야 할지 궁금했었다.
답이 정해져 있는건 아니지만 보통 variable은 고정된 변수가 필요할 때, local은 variable에 테라폼 함수를 이용해 추가 변형이 필요할 때 사용한다.
참고
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] for_each 구문 (0) | 2022.10.19 |
---|---|
[Terraform] 독립적인 배포 환경 만들기 (0) | 2022.05.03 |
[Terraform] 백엔드 (Backend) (0) | 2022.05.03 |
[Terraform] 데이터 소스 (Data Source) (1) | 2022.04.25 |
[Terraform] Count (0) | 2022.04.25 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!