잡 스펙의 `secret` 블록

잡 스펙의 secret 블록

secret 블록은 태스크가 지정된 위치에서 시크릿을 요구한다고 명시할 수 있게 해요. Nomad는 시크릿의 내용을 자동으로 가져오며, 태스크 스펙 안에서 변수로 참조할 수 있어요. group 레벨에서 지정하면 그 시크릿은 그룹 안의 모든 태스크에서 사용할 수 있어요. job 레벨에서 지정하면 잡의 모든 태스크가 시크릿을 가져와 태스크 스펙 안에서 해석할 수 있어요.

출처: 문서

본문

배치 job -> **secret**
job -> group -> **secret**
job -> group -> task -> **secret**
job "docs" {
  group "example" {
    task "server" {
      secret "my_secret" {
        provider = "vault"
        path     = "path/to/secret"
        config {
          engine = "kv_v2"
        }
      }
    }
  }
}

Nomad는 시크릿의 키-값 쌍을 파싱하고 secret.<secret_name>.<secret_key> 형식으로 변수 보간에 사용할 수 있게 해요. 위 태스크 스펙을 예시로 들면, 시크릿 키 "foo"의 값을 ${secret.my_secret.foo}로 참조할 수 있어요.

매개변수 (Parameters)

  • provider (string: "") - Nomad가 특정 시크릿 저장소와 상호작용하기 위해 사용할 기반 구현을 지정.

  • path (string: "") - 주어진 시크릿 저장소 안에서 시크릿의 위치를 지정.

  • config (block: {}) - 내장 provider가 시크릿을 가져오는 데 사용하는 사용자 정의 속성. 내장 vault와 nomad provider에서만 사용 가능해요.

  • env (map[string]string) - 커스텀 플러그인 provider에 전달할 환경 변수. 커스텀 provider에서만 사용 가능해요.

내장 provider (Built-in providers)

  • nomad - Nomad에서 변수를 조회. Nomad는 변수를 가져오기 위해 태스크의 Workload Identity 토큰을 사용하므로, 태스크는 변수를 읽을 수 있는 ACL 접근 권한이 있어야 해요.

Config 매개변수:

- [`namespace`](https://developer.hashicorp.com/nomad/docs/job-specification/secret#namespace) `(string: "default")` - 변수가 위치한 네임스페이스를 지정.
  • vault - Vault에서 시크릿을 조회. template 블록과 유사하게, Vault에 요청을 보내려면 vault 블록을 통해 생성되는 vault 토큰이 필요해요.

Config 매개변수:

- [`engine`](https://developer.hashicorp.com/nomad/docs/job-specification/secret#engine) `(string: "kv")` - 조회할 Vault 스토리지 엔진을 지정. 옵션은 `kv`와 `kv_v2`예요.

커스텀 provider (Custom providers)

Nomad는 커스텀 provider 플러그인을 사용해 provider 목록을 확장해요. 커스텀 provider는 fingerprint와 fetch 기능 모두를 구현해야 해요. 커스텀 provider는 common_plugin_dir/secrets/ 하위 디렉터리에 배치해야 해요. 시작 시 Nomad 클라이언트는 첫 번째 인자를 fingerprint로 하여 실행함으로써 secrets 디렉터리의 실행 파일에 지문을 등록해요. 커스텀 플러그인 "foo"를 사용하는 태스크가 시크릿을 가져올 때, Nomad는 "foo" 실행 파일을 찾아 첫 번째 인자를 "fetch", 두 번째 인자를 시크릿의 path 매개변수로 실행해요. 커스텀 provider 예시는 plugin authoring 가이드를 참고하세요.

커스텀 provider는 fingerprint 응답을 stdout으로 출력해야 해요:

{
  "type": "secrets",
  "version": "0.0.1" (use appropriate version)
}

그리고 유효한 "fetch" 응답은 다음 형태여야 해요:

{
  "result": {
    "key1": "value1",
    "key2": "value2"
  },
  "error": ""
}

더 알아보기 (Learn more)