로컬 변수
로컬 변수 (Local variables)
이 문서는 Packer 템플릿에서 사용할 수 있는 로컬 변수를 정의하는 local 및 locals 블록에 대한 참조 정보를 제공해요. 입력 변수(input variables)에 대해 알아보려면 입력 변수를 참고하세요.
출처: Packer 공식 문서
본문
Introduction (소개)
로컬 변수는 표현식에 이름을 붙여주고, 폴더 안에서 여러 번 사용할 수 있어요. 표현식은 런타임에 평가되며, 입력 변수, 다른 로컬 변수, 데이터 소스, HCL 함수를 참조할 수 있어요. 로컬 변수는 덮어쓸 수 없어요.
Packer의 변수에 대한 추가 정보는 Input Variables 및 local variables 을 참고하세요.
Examples (예시)
로컬 변수는 local 또는 locals 블록에서 정의돼요.
# Using the local block allows you to mark locals as sensitive, which will
# filter their values from logs.
local "mylocal" {
expression = "${var.secret_api_key}"
sensitive = true
}
# Using the locals block is more compact and efficient for declaring many locals
# Ids for multiple sets of EC2 instances, merged together
locals {
instance_ids = "${concat(aws_instance.blue.*.id, aws_instance.green.*.id)}"
}
# A computed default name prefix
locals {
default_name_prefix = "${var.project_name}-web"
name_prefix = "${var.name_prefix != "" ? var.name_prefix : local.default_name_prefix}"
}
# Local variables can be referenced using the "local." prefix.
source "virtualbox-iso" "example" {
output = "${local.name_prefix}-files"
# ...
}
이름이 붙은 로컬 맵은 다른 로컬 맵과 병합해서 공통 또는 기본값을 구현할 수 있어요.
# Define the common tags for all resources
locals {
common_tags = {
Component = "awesome-app"
Environment = "production"
}
}
# Create a resource that blends the common tags with instance-specific tags.
source "amazon-ebs" "server" {
source_ami = "ami-123456"
instance_type = "t2.micro"
tags = "${merge(
local.common_tags,
{
"Name" = "awesome-app-server",
"Role" = "server"
}
)}"
# ...
}
Single local block (단일 local 블록)
local 블록은 폴더 안에서 정확히 하나의 로컬 변수를 정의해요. 블록 라벨은 로컬의 이름이고, "expression"은 로컬을 만들기 위해 평가해야 하는 표현식이에요. 이 블록을 사용하면 선택적으로 "sensitive" 불리언을 제공해서 변수를 민감한 것으로 표시하고 로그에서 걸러낼 수 있어요.
local "mylocal" {
expression = "${var.secret_api_key}"
sensitive = true
}
이 블록은 복잡한 로컬을 정의할 때도 매우 유용해요. Packer는 다른 로컬에 의존하는 복잡한 표현식이 있는 locals 를 확장하고 평가하는 데 시간이 걸릴 수 있어요. locals 블록은 맵으로 읽혀요. 맵은 정렬되지 않으므로 평가 시간이 결정적이지 않아요.
이를 피하려면 단수 local 블록을 대신 사용해야 해요. 이 블록들은 정의된 순서대로 평가되고, 평가 순서와 시간은 항상 동일해요.
locals block (locals 블록)
locals 블록은 폴더 안에서 하나 이상의 로컬 변수를 정의해요.
locals 블록에 주어진 항목 이름은 폴더 전체에서 고유해야 해요. 주어진 값은 현재 폴더 내에서 유효한 어떤 표현식이든 될 수 있어요.
로컬 값의 표현식은 다른 로컬을 참조할 수 있지만, 참조 순환(reference cycles)은 허용되지 않아요. 즉 로컬은 자기 자신을 참조하거나, 직접 또는 간접적으로 자신을 다시 참조하는 변수를 참조할 수 없어요.
특히 서로 의존하는 경우 논리적으로 관련된 로컬 변수들을 하나의 블록으로 묶는 걸 권장해요. 그래야 독자가 변수들 사이의 관계를 이해하기 쉬워져요. 반대로, 관련 없는 로컬 변수는 별도의 블록으로 정의하고, 각 블록에 포함된 로컬에 공통인 맥락을 설명하는 주석을 다는 것이 좋아요.
Known limitations (알려진 제한사항)
현재 시점에서 아래 예시처럼 데이터 소스 안에서 로컬을 사용하는 것은 지원되지 않아요.
locals {
cloud_owners = ["happycloud"]
cloud_base_filter_name = "cloud-hvm-2.0.*-x86_64-gp2"
}
data "happycloud" "happycloud-linux2-east" {
filters = {
name = local.cloud_base_filter_name
}
most_recent = true
owners = local.cloud_owners
}
로컬은 데이터 소스를 참조할 수 있지만, 데이터 소스는 순환 의존성을 피하기 위해 로컬을 참조할 수 없어요. 로컬이 데이터 소스를 참조하고, 그 데이터 소스가 같은 로컬이나 다른 로컬 변수를 다시 참조할 수 있기 때문이에요. 현재 시점에서 데이터 소스 안에 사용자 입력 데이터를 참조하는 권장 방법은 variable 블록을 사용하는 거예요.
variable "cloud_base_filter_name" {
type = string
default = "cloud-hvm-2.0.*-x86_64-gp2"
}
variable "cloud_owners" {
type = string
default = "happycloud"
}
data "happycloud" "happycloud-linux2-east" {
filters = {
name = var.cloud_base_filter_name
}
most_recent = true
owners = var.cloud_owners
}
더 알아보기 (Learn more)
- 이 페이지는 Packer 공식 문서에서 가져왔어요.