`store` 블록 참조

store 블록 참조 (store block reference)

store 블록을 사용해 배포 구성에서 HCP Terraform 변수 집합의 값에 접근하고 그 시크릿을 배포에 사용해요. 이 페이지에서는 store 블록의 구성 모델, varset 스토어 타입, 그리고 예시를 다룰게요.

출처: 문서

본문

store 블록을 사용해 배포 구성에서 HCP Terraform 변수 집합의 값에 접근하고 그 시크릿을 배포에 사용해요.

배경 (Background)

HCP Terraform에서 변수 집합은 여러 워크스페이스나 Stack에 할당할 수 있는 재사용 가능한 변수의 모음이에요. 변수 집합은 API 키나 데이터베이스 비밀번호 같은 공통 구성 값을 서로 다른 환경에 걸쳐 관리하는 데 도움이 돼요.

store 블록을 사용하면 배포 구성에서 변수 집합에 접근할 수 있어요. store 블록을 정의할 때 접근하려는 변수 집합과 검색하려는 변수의 타입을 지정해요. 같은 변수 집합에서 Terraform 변수와 환경 변수 모두에 접근하려면 두 개의 별도 store 블록을 정의해야 해요.

기본적으로 변수 집합 값은 Stack 배포에서 일시적(ephemeral)이에요. Terraform은 현재 작업 동안 변수 집합 값을 사용하지만 배포의 상태에는 저장하지 않아요. 이 동작을 피하려면 stable 키워드를 사용할 수 있어요. 더 알아보려면 배포를 위한 스토어 값 유지를 참고해요.

Stack은 대상 변수 집합에 접근할 수 있어야 합니다. 즉 변수 집합이 전역적으로 사용 가능하거나 Stack을 포함하는 프로젝트 또는 Stack 자체에 할당되어야 해요.

구성 모델 (Configuration model)

store 블록은 스토어 타입에 기반해 다음 인자를 지원해요:

  • store "<TYPE>" "<LABEL>" 블록
    • id 문자열 | name과 상호 배타적
    • name 문자열 | id와 상호 배타적
    • category 문자열

완전한 구성 (Complete configuration)

사용 가능한 모든 인자는 다음 store 블록에 정의돼 있어요:

store "<TYPE>" "<LABEL>" {
  id       = "<ID>" # mutually exclusive with name
  name     = "<NAME>" # mutually exclusive with id
  category = "<CATEGORY>"
}

store 블록에 id 또는 name 중 하나를 정의해야 하지만 둘 다는 아니에요. store 블록을 정의한 후 store.<TYPE>.<LABEL>.<VARIABLE> 구문을 사용해 연결된 변수 집합 안의 특정 변수를 참조할 수 있어요.

사양 (Specification)

store 블록은 다음 구성을 지원해요.

store "<TYPE>" "<LABEL>"

store 블록은 두 개의 레이블을 요구해요: 스토어 타입과 배포 구성 안의 스토어에 대한 고유 이름이에요. varset 스토어 타입이 유일하게 사용 가능한 스토어 타입이에요.

스토어 레이블은 유효한 식별자라면 무엇이든 될 수 있으며 같은 배포 구성 파일의 모든 스토어 사이에서 고유해야 해요.

varset 스토어 타입 (varset store type)

varset 스토어 타입을 사용해 Stack이 HCP Terraform의 변수 집합에 접근할 수 있게 해요. Stack은 대상 변수 집합에 접근할 수 있어야 합니다. 즉 변수 집합이 전역적으로 사용 가능하거나 Stack을 포함하는 프로젝트에 할당되거나 Stack 자체에 할당되어야 해요.

변수 집합의 값을 참조하면 HCP Terraform은 그 값을 버리고 배포 상태에 저장하지 않아요. 배포 상태에 변수 집합 값을 유지하려면 stable 키워드를 명시적으로 사용해야 해요. 더 알아보려면 배포를 위한 스토어 값 유지를 참고해요.

인자 (Arguments)

varset 스토어 타입에 대해 다음 인자가 지원돼요:

인자 설명 타입 필수?
id 접근하려는 변수 집합의 외부 ID예요. name과 상호 배타적이에요. 문자열 name이 지정되지 않으면 필수
name 접근하려는 변수 집합의 이름이에요. id와 상호 배타적이에요. 문자열 id가 지정되지 않으면 필수
category 변수 집합에서 Terraform 또는 환경 변수를 사용할지 지정해요. 문자열 필수

id

id 인자는 접근하려는 변수 집합의 외부 ID를 지정해요. 이 ID는 HCP Terraform UI에서 또는 HCP Terraform API를 사용해 찾을 수 있어요.

store "varset" "<LABEL>" {
  id       = "<ID>"
  category = "<CATEGORY>"
}

요약 (Summary)

  • 데이터 타입: 문자열
  • 기본값: 없음
  • 필수: name이 지정되지 않으면 예

name

name 인자는 접근하려는 변수 집합의 이름을 지정해요. 변수 집합 이름은 HCP Terraform UI에서 또는 HCP Terraform API를 사용해 찾을 수 있어요.

store "varset" "<LABEL>" {
  name     = "<NAME>"
  category = "<CATEGORY>"
}

요약 (Summary)

  • 데이터 타입: 문자열
  • 기본값: 없음
  • 필수: id가 지정되지 않으면 예

category

category 인자는 변수 집합에서 Terraform 변수 또는 환경 변수를 사용할지 지정해요. 접근하려는 변수의 타입에 따라 "terraform" 또는 "env"를 지정해요.

store "varset" "<LABEL>" {
  id       = "<ID>"
  category = "<CATEGORY>"
}

store 블록은 한 가지 범주의 변수에만 접근할 수 있어요. 같은 변수 집합에서 Terraform과 환경 변수 모두에 접근해야 한다면 두 개의 별도 store 블록을 정의해요.

요약 (Summary)

  • 데이터 타입: 문자열
  • 기본값: 없음
  • 필수: 예

예시 (Examples)

다음 예시는 store 블록의 일반적인 사용 사례를 보여줘요.

스토어 정의 및 변수 접근 (Define a store and access variables)

다음 예시는 api_keys_default_project라는 변수 집합에 접근하는 api_keys라는 varset 스토어를 정의해요:

store "varset" "api_keys" {
  name       = "api_keys_default_project"
  category = "terraform"
}

deployment "production" {
  inputs = {
    database_password = store.varset.api_keys.db_password
    api_key           = store.varset.api_keys.external_api_key
  }
}

production 배포는 api_keys 스토어의 db_passwordexternal_api_key 변수에 접근해 그 배포의 프로바이더를 인증해요. 스토어를 정의한 후 store.<TYPE>.<LABEL>.<VARIABLE> 구문을 사용해 특정 변수를 참조해요.

배포를 위한 스토어 값 유지 (Persist store values for deployments)

기본적으로 Stacks 배포는 변수 집합의 값을 상태에 저장하지 않아요. 이는 변수 집합 값이 일반적으로 비밀번호나 API 키 같은 민감한 데이터를 포함하기 때문이에요. 라이선스 키처럼 배포 상태에 유지해야 하는 변수의 경우 stable 키워드를 사용할 수 있어요.

배포의 상태에 변수 집합 값을 저장하려면 store에서 그 변수를 참조할 때 .stable을 추가해요:

store.varset.<LABEL>.stable.<VARIABLE>

stable 키워드는 Terraform에 그 변수 값을 배포의 상태에 저장하라고 지시해, 배포가 나중에 그 값을 참조할 수 있게 해요.

다음 예시에서 licenses 스토어는 CONSUL_LICENSES라는 변수 집합에 접근해 Consul 라이선스 키를 검색해요:

store "varset" "licenses" {
  name     = "CONSUL_LICENSES"
  category = "terraform"
}

store "varset" "credentials" {
  name     = "GCP_CREDS"
  category = "terraform"
}

deployment "production" {
  inputs = {
    gcp_credentials = store.varset.credentials.gcp_service_account_key
    consul_license  = store.varset.licenses.stable.consul_license_key
  }
}

HCP Terraform은 consul_license_key의 값을 production 배포의 상태에 저장하지만, gcp_service_account_keystable로 표시되지 않았으므로 그 값을 저장하지 않아요. consul_license_keystable로 표시된 후에는 값을 변경할 수 없습니다.

stable 키워드를 사용해 변수 집합의 값을 참조한 후에는 배포 deployment 구성에서 stable 없이 같은 값을 다시 참조할 수 없어요. 예를 들어 다음 구성은 consul_license_key를 두 번 참조하므로 유효하지 않아요:

deployment "production" {
  inputs = {
    consul_license_non_ephemeral = store.varset.licenses.stable.consul_license_key
    consul_license_ephemeral = store.varset.licenses.consul_license_key
  }
}

이름을 사용한 변수 집합 접근 (Variable set access using name)

다음 예시에서 api_config 스토어는 HCP Terraform에서 API_CONFIGURATION이라는 이름으로 변수 집합에 접근해요:

store "varset" "api_config" {
  name     = "API_CONFIGURATION"
  category = "terraform"
}

deployment "production" {
  inputs = {
    api_endpoint = store.varset.api_config.endpoint_url
    api_timeout  = store.varset.api_config.timeout_seconds
  }
}

Terraform 및 환경 변수 분리 (Separate Terraform and environment variables)

다음 예시에서 두 store 블록은 같은 변수 집합에 접근하지만, 하나는 Terraform 변수를 검색하고 다른 하나는 환경 변수를 검색해요:

store "varset" "terraform_vars" {
  id       = "varset-abc123def456"
  category = "terraform"
}

store "varset" "env_vars" {
  id       = "varset-abc123def456"
  category = "env"
}

deployment "production" {
  inputs = {
    # From Terraform variables
    instance_count    = store.varset.terraform_vars.instance_count
    database_password = store.varset.terraform_vars.db_password

    # From environment variables
    log_level         = store.varset.env_vars.LOG_LEVEL
    debug_mode        = store.varset.env_vars.DEBUG_ENABLED
  }
}

store 블록을 정의할 때 접근하려는 변수 집합과 검색하려는 변수의 타입을 지정해요. 같은 변수 집합에서 Terraform과 환경 변수 모두에 접근하려면 두 개의 별도 store 블록을 정의해야 해요.

더 알아보기 (Learn more)