커스텀 데이터 소스

커스텀 데이터 소스 (Custom Data Sources)

Packer 데이터 소스는 Packer가 설정 안에서 사용할 데이터를 가져오게 해줘요. Packer 밖에 정의된 정보도 포함하죠. 예를 들어 amazon-ami 데이터 소스는 Amazon AMI의 데이터를 출력해요.

데이터 소스 플러그인은 packersdk.Datasource 인터페이스를 구현하고, 스크립트 내에서 set.RegisterDatasource(...) 함수로 등록되며 set.Run()으로 제공돼요.

경고: 이 주제는 Packer와 Packer 플러그인에 대한 강한 지식이 필요한 고급 주제예요.

출처: Packer 공식 문서

본문

시작하기 전에 (Before You Begin)

개발을 시작하기 전에 다음 자료를 검토하는 것을 권장해요.

  • Developing Plugins - Overview
  • Go 언어. 커스텀 플러그인은 Go로 작성해야 하므로, 이 가이드는 Go 언어에 익숙하다고 가정해요.

인터페이스 (The Interface)

데이터 소스에 구현해야 하는 인터페이스는 packersdk.Datasource 인터페이스예요. 참고를 위해 아래에 재현했어요. 소스 코드의 실제 인터페이스에는 각 메서드가 무엇을 해야 하는지 설명하는 기본 문서도 들어 있어요.

type Datasource interface {
ConfigSpec() hcldec.ObjectSpec
OutputSpec() hcldec.ObjectSpec
Configure(...interface{}) error
Execute() (cty.Value, error)
}

"ConfigSpec" 메서드

이 메서드는 hcldec.ObjectSpec을 반환해요. Packer와 HCL2 템플릿을 사용하기 위해 필요한 spec이에요. 이 함수의 사용법과 구현 방법은 object spec 문서를 확인하세요.

"OutputSpec" 메서드

이 메서드는 데이터 소스 출력의 hcldec.ObjectSpec을 반환해요. ConfigSpec 메서드의 설정 spec과 마찬가지로 packer-sdc mapstructure-to-hcl2 명령으로 object spec을 생성할 수 있어요.

이 메서드는 packer validate 명령에서 사용돼요. Packer는 이 spec을 사용해 데이터 소스를 실행해 실제 값을 가져오는 대신, 데이터 소스에 미지의 값(unknown values)을 할당해요.

"Configure" 메서드

Configure 메서드는 템플릿에 주어진 설정과 함께 어떤 실행보다 먼저 호출돼요. 이 값은 interface{} 타입 배열로 전달되지만, 보통 map[string]interface{}예요. Configure 메서드는 이 설정을 내부 구조로 변환하고 검증하며, 오류가 있으면 반환하는 역할을 해요.

여러 파라미터가 있다면 최종 설정으로 병합해야 하며, 나중 파라미터가 이전 설정을 덮어써요. 병합의 정확한 의미는 빌더 작성자가 정해요.

interface{}를 의미 있는 구조로 디코딩하려면 mapstructure 라이브러리를 권장해요. Mapstructure는 interface{}를 받아 임의로 복잡한 struct로 디코딩해줘요. 오류가 있으면 매우 사람 친화적인 오류를 생성해 Configure 메서드에서 직접 반환할 수 있죠.

강제로 시행되지는 않지만, Configure 메서드 실행에서 부작용(side effects)이 없어야 해요. 특히 파일을 만들거나 가상 머신을 실행하는 등의 작업은 하면 안 돼요. Configure의 목적은 오로지 데이터 소스를 설정하고 설정을 검증하는 것이에요.

Configure 메서드는 빌드 과정에서 매우 초반에 호출돼서, 실제로 어떤 일이 일어나기 전에 오류를 사용자에게 보여줄 수 있어요.

"Execute" 메서드

이 메서드는 HCL cty.Value와 오류를 반환해요. Packer는 packer build 명령에서 Execute 메서드를 실행해서, build와 locals 블록을 평가하기 전에 데이터 소스 출력을 사용할 수 있게 해요. Execute 명령은 데이터를 가져와 cty.Value로 반환할 것으로 기대돼요.

출력 설정에서 동등한 cty.Value를 얻으려면 packer-plugin-sdk의 hcl2helper 함수를 사용하는 것을 권장해요.

스캐폴딩 템플릿 (Scaffolding template)

새 데이터 소스 플러그인을 개발할 때 경험을 편하게 하기 위해, 플러그인 저장소의 템플릿으로 사용할 Packer plugin scaffolding을 제공해요. 이 템플릿은 기본적인 것들로 구성되어 있고, 직접 플러그인을 만들기 시작하는 데 필요한 설정을 담고 있어요.