HCP Packer로 메타데이터 전송하기
HCP Packer로 메타데이터 전송하기
이 주제는 Packer로 아티팩트를 빌드할 때 HCP Packer로 메타데이터를 전송하는 방법을 설명해요. HCP Packer의 메타데이터 저장에 대한 정보는 메타데이터 저장 개요를 참고해 주세요. Packer 템플릿에 대한 정보는 Packer 문서의 Packer 템플릿을 참고해 주세요.
출처: 문서
본문
개요
packer build 명령을 실행할 때 Packer가 아티팩트 메타데이터를 HCP Packer로 전송하도록 활성화하는 방법은 두 가지가 있어요. 로컬 머신에서 환경 변수를 설정하거나, Packer 템플릿 구성에서 push 동작을 정의할 수 있어요.
환경 변수
JSON 및 HCL2 템플릿 모두에서 환경 변수를 사용할 수 있어요. 이 방법은 Packer 템플릿을 변경하지 않고도 아티팩트 메타데이터를 HCP Packer 레지스트리로 전송할 수 있게 해 줘요. JSON 템플릿에서 HCP Packer 레지스트리로 메타데이터를 전송하는 유일한 방법이에요. 자세한 내용은 환경 변수 방법을 참고해 주세요.
JSON 및 HCL2 템플릿에 대한 추가 정보는 JSON 및 HCL2 기능 비교를 참고해 주세요.
Packer 템플릿 구성
환경 변수 대신 Packer 템플릿 구성에 hcp_packer_registry 블록을 구성할 것을 권장해요. hcp_packer_registry 블록을 사용하면 아티팩트 메타데이터를 사용자 정의하고 아티팩트에 대한 중요한 세부 정보를 전달하는 라벨을 추가할 수 있어요. 자세한 내용은 Packer 템플릿 구성 방법을 참고해 주세요.
버전 핑거프린트
아티팩트를 빌드할 때 Packer는 *버전 핑거프린트(version fingerprint)*를 자동으로 생성해 아티팩트와 연결해요. 버전 핑거프린트는 레지스트리에서 템플릿 빌드의 메타데이터가 완전한지 판단하는 고유 식별자예요. 핑거프린트가 기존의 완전한 버전과 일치하면 빌드는 실패해요. 자세한 내용은 버전 핑거프린팅을 참고해 주세요.
요구사항
로컬 머신에 Packer v1.7.6 이상을 설치해야 해요.
플러그인
Packer는 많은 작업을 수행하기 위해 플러그인에 의존해요. Packer 통합을 참고해 주세요.
HCP 인증
Packer는 환경 변수를 사용해 HCP Packer 레지스트리로 인증하고 특정 조직과 프로젝트에 아티팩트 메타데이터를 전송해요. 다음 환경 변수를 서비스 주체 키로 설정해 주세요:
자세한 내용은 서비스 주체를 참고해 주세요.
환경 변수 방법
- Packer 템플릿을 수정하지 않고 Packer가 HCP Packer 레지스트리로 메타데이터를 전송할 수 있도록 로컬 머신에서 다음 환경 변수를 설정해요:
HCP_PACKER_BUCKET_NAME환경 변수를 이 Packer 빌드의 메타데이터를 레지스트리가 저장할 버킷 이름으로 설정해요.- Packer v1.7.6 ~ v1.8.3을 사용한다면
HCP_PACKER_REGISTRY도ON으로 설정해야 해요. - HCP Packer는 버킷이 이미 존재하지 않으면 버킷을 만들어요. 그렇지 않으면 HCP Packer는 버킷 안에 새 버전을 만들어요.
packer build명령을 실행해 아티팩트를 빌드하고 메타데이터를 레지스트리로 전송해요.
환경 변수 예시
다음 환경 변수는 Packer가 HCP Packer 레지스트리의 example-amazon-ebs 버킷에 아티팩트 메타데이터를 전송하도록 지정해요:
packer {
required_plugins {
amazon = {
version = ">= 1.0.1"
source = "github.com/hashicorp/amazon"
}
}
}
source "amazon-ebs" "basic-example-east" {
region = "us-east-2"
source_ami_filter {
filters = {
virtualization-type = "hvm"
name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
root-device-type = "ebs"
}
owners = ["099720109477"]
most_recent = true
}
instance_type = "t2.small"
ssh_username = "ubuntu"
ssh_agent_auth = false
ami_name = "packer_AWS_{{timestamp}}"
}
build {
name = "example-amazon-ebs"
sources = [ "source.amazon-ebs.basic-example-east"]
}
{
"builders": [
{
"type": "amazon-ebs",
"name": "basic-example-east",
"ami_name": "packer_AWS_{{timestamp}}",
"region": "us-east-2",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*",
"root-device-type": "ebs"
},
"owners": [
"099720109477"
],
"most_recent": true
},
"instance_type": "t2.small",
"ssh_username": "ubuntu",
"ssh_agent_auth": false
}]
}
$ export HCP_PACKER_BUCKET_NAME=example-amazon-ebs
Packer가 다음 예시 템플릿을 빌드하면 단일 Amazon EBS 아티팩트를 생성하고 build.name 필드에 지정된 대로 example-amazon-ebs라는 레지스트리에 메타데이터를 전송해요.
HCP Packer는 완료된 아티팩트 빌드의 첫 번째 버전임을 나타내기 위해 example-amazon-ebs 버킷에 v1이라는 새 버전을 만들어요. v1 버전에는 UI와 HCP Packer 데이터 소스에서 아티팩트 버전을 식별하는 데 사용할 수 있는 고유 버전 핑거프린트가 포함돼요.
Packer 템플릿 구성 방법
Packer 템플릿에 hcp_packer_registry 블록을 추가하고, 아티팩트를 빌드할 때 Packer가 레지스트리로 전송할 사용자 정의 메타데이터를 구성해요. hcp_packer_registry 블록은 HCL2 Packer 템플릿에서만 구성할 수 있어요. 블록 구성에 대한 자세한 내용은 Packer 문서의 hcp_packer_registry 구성 참조를 참고해 주세요.
hcp_packer_registry 블록의 값은 Packer가 build 블록에서 파생하는 기본값을 재정의해요. 예를 들어 hcp_packer_registry.bucket_name에 지정된 값은 build.name 값을 재정의해요.
또한 아티팩트에 대한 중요한 세부 정보를 전달하기 위해 description과 다음 유형의 사용자 정의 라벨을 추가할 수 있어요:
- bucket_labels: 문자열의 키-값 쌍으로 된 임의의 맵을 지정해요. bucket label을 사용해 어떤 팀이 Packer 템플릿을 유지 관리하는지, 연결된 아티팩트가 어떤 운영 체제를 사용하는지 등 아티팩트 집합에 공통인 특징을 식별하는 데 도움을 줄 수 있어요. HCP Packer는 사용자 정의 bucket label을 전체 버킷에 적용해요.
- build_labels: 문자열의 키-값 쌍으로 된 임의의 맵을 지정해요. build label을 사용해 특정 버전 내의 아티팩트 특징에 대한 세부 정보를 제공할 수 있어요. 예를 들어 build label은 빌드의 정확한 시간이나 빌드에 포함된 도구의 버전을 식별하여, 향후 소비자를 위해 이러한 세부 정보의 불변 레코드를 제공할 수 있어요. HCP Packer는 사용자 정의 build label을 버전 내 모든 완료된 빌드에 적용해요.
템플릿 구성 예시
다음 예시 Packer 템플릿 구성은 빌드의 목적을 설명하는 메타데이터를 포함해요. 또한 소비자가 버킷을 담당하는 팀, 모든 빌드와 연결된 운영 체제, 관련 소프트웨어 버전, 빌드 타임스탬프를 알 수 있도록 bucket 및 build 라벨도 포함해요.
build {
name = "amazon-golden"
sources = [ "source.amazon-ebs.basic-example-east"]
hcp_packer_registry {
bucket_name = "example-amazon-ebs-custom"
description = "Golden image for Amazon-backed applications"
bucket_labels = {
"team" = "amazon-development",
"os" = "Ubuntu"
}
build_labels = {
"python-version" = "3.9",
"ubuntu-version" = "Xenial 16.04"
"build-time" = timestamp()
}
}
}
누군가 아티팩트를 빌드할 때 HCP Packer는 템플릿에 지정된 모든 메타데이터를 포함하는 example-amazon-ebs-custom 버킷에 새 버전을 만들어요.