데이터 소스 참조
데이터 소스 참조 (Data sources reference)
이 주제에서는 HCL Packer 템플릿에서 data 블록을 사용해 데이터 소스를 구성하는 방법을 설명해요. data 블록은 Packer가 data를 가져오거나 계산하도록 지시해서, builders가 Packer 밖에 정의된 정보를 사용할 수 있게 해줘요.
출처: Packer 공식 문서
본문
데이터 소스 사용하기 (Using data sources)
데이터 소스는 data 블록으로 선언하며, 설정은 다음과 같아요.
data "amazon-ami" "example" {
filters = {
virtualization-type = "hvm"
name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
root-device-type = "ebs"
}
owners = ["099720109477"]
most_recent = true
}
data 블록은 Packer가 주어진 데이터 소스("amazon-ami")에서 읽고 결과를 주어진 로컬 이름("example")으로 내보내도록 요청해요. 이 이름은 같은 Packer 설정의 다른 곳에서 이 데이터 소스를 참조하는 데 사용돼요.
data 블록은 주어진 타입(첫 번째 블록 레이블)과 이름(두 번째 블록 레이블)의 데이터 인스턴스를 생성해요. 타입과 이름의 조합은 설정 안에서 고유해야 해요.
블록 안({ })은 데이터 인스턴스의 설정이에요. 이 설정은 데이터 소스 타입에 따라 달라지며, 각 데이터 소스에 대해 문서화되어 있어요. 예를 들어 amazon-ami 데이터 소스의 설정은 plugins/datasources/amazon/ami에서 찾을 수 있어요.
데이터 소스는 하나 이상의 속성을 출력할 수 있으며, 데이터 소스 고유 식별자에 키 이름을 추가해 data.<TYPE>.<NAME>.<ATTRIBUTE>처럼 사용할 수 있어요.
위의 amazon-ami.example의 출력은 다음과 같이 접근할 수 있어요.
출력 데이터:
"data.amazon-ami.example" {
id = "ami12345"
name = "MyAMI"
creation_date = "01/01/2021"
owner = "123456789"
owner_name = "Some Name"
tags = {"tag1": "value"}
}
사용 방법:
// in a local
locals {
source_ami_id = data.amazon-ami.example.id
source_ami_name = data.amazon-ami.example.name
}
// in a source
source "amazon-ebs" "basic-example" {
source_ami = local.source_ami
// ...
}
알려진 제한 (Known limitations)
현재로서는 아래 예시처럼 데이터 소스 안에서 locals를 사용하는 것은 지원되지 않아요.
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
}
locals는 데이터 소스를 참조할 수 있지만, 데이터 소스는 locals를 참조할 수 없어요. 순환 의존성(cyclic dependencies)을 피하기 위해서예요. local이 같은 local이나 다른 locals 변수를 참조하는 데이터 소스를 참조할 수도 있거든요. 현재 데이터 소스 안에서 사용자 입력 데이터를 참조하는 선호 방법은 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
}
관련 자료 (Related)
- 사용 가능한 데이터 소스 목록은 data sources 섹션에서 찾을 수 있어요.
- 커스텀 데이터 소스를 직접 만들어 보세요!