pg 백엔드

pg 백엔드

PostgreSQL 데이터베이스에 Terraform state를 저장하는 pg 백엔드를 설명해 드릴게요. PostgreSQL의 advisory lock을 활용해 state 잠금을 지원해요.

출처: 문서

본문

pg 백엔드는 Postgres 데이터베이스(버전 10 이상)에 state를 저장해요. 이 백엔드는 state 잠금을 지원해요.

예시 구성 (Example Configuration)

terraform {
  backend "pg" {
    conn_str = "postgres://user:***@db.example.com/terraform_backend"
  }
}

terraform init으로 백엔드를 초기화하기 전에 데이터베이스가 이미 존재해야 해요:

createdb terraform_backend

createdb 명령은 데이터베이스 서버와 함께 설치되는 Postgres 클라이언트 애플리케이션에 있어요.

환경 변수 사용 (Using environment variables)

민감한 자격 증명이 디스크에 기록되고 소스 제어에 커밋되지 않도록 pg 백엔드 구성에는 환경 변수를 사용하는 것을 권장해요. pg 백엔드는 표준 libpq 환경 변수를 지원해요.

전체 구성을 환경 변수로 제공하거나:

terraform {
  backend "pg" {}
}
$ export PG_CONN_STR=postgres://user:***@db.example.com/terraform_backend
$ terraform init

민감한 파라미터만 환경 변수로 제공할 수도 있어요:

terraform {
  backend "pg" {
    conn_str = "postgres://db.example.com/terraform_backend"
  }
}
$ export PGUSER=user
$ read -s PGPASSWORD
$ export PGPASSWORD
$ terraform init

데이터 소스 구성 (Data Source Configuration)

다른 구성에서 pg 원격 state를 사용하려면 terraform_remote_state 데이터 소스를 사용해요.

data "terraform_remote_state" "network" {
  backend = "pg"
  config = {
    conn_str = "postgres://localhost/terraform_backend"
  }
}

구성 변수 (Configuration Variables)

경고: 자격 증명과 기타 민감 데이터를 제공할 때는 환경 변수를 사용하는 것을 권장해요. -backend-config를 사용하거나 이런 값을 구성에 직접 하드코딩하면 Terraform이 .terraform 하위 디렉터리와 plan 파일 양쪽에 이 값을 포함해요.

지원하는 구성 옵션 / 환경 변수:

  • conn_str - Postgres 연결 문자열; postgres:// URL. PG_CONN_STR 및 표준 libpq 환경 변수로도 PostgreSQL 데이터베이스 연결 방법을 나타낼 수 있어요.
  • schema_name - 자동 관리되는 Postgres 스키마의 이름. 기본값은 terraform_remote_state. PG_SCHEMA_NAME 환경 변수로도 설정할 수 있어요.
  • skip_schema_creation - true로 설정하면 Postgres 스키마가 이미 존재해야 해요. PG_SKIP_SCHEMA_CREATION 환경 변수로도 설정할 수 있어요. 데이터베이스 관리자가 이미 만들었을 때 유용해요.
  • skip_table_creation - true로 설정하면 Postgres 테이블이 이미 존재해야 해요. PG_SKIP_TABLE_CREATION 환경 변수로도 설정할 수 있어요.
  • skip_index_creation - true로 설정하면 Postgres 인덱스가 이미 존재해야 해요. PG_SKIP_INDEX_CREATION 환경 변수로도 설정할 수 있어요.

기술 설계 (Technical Design)

이 백엔드는 schema_name 변수로 구성된 자동 관리 Postgres 스키마에 하나의 테이블 states를 만들어요. 테이블은 워크스페이스 이름으로 키 지정되며, 워크스페이스를 사용하지 않으면 default라는 이름을 사용해요.

잠금은 Postgres advisory locks로 지원돼요. force-unlock은 지원되지 않는데, 이 데이터베이스 네이티브 잠금은 세션이 중단되거나 연결이 실패하면 자동으로 해제되기 때문이에요. Postgres 서버에서 미해결 잠금을 보려면 pg_locks 시스템 뷰를 사용해요.

states 테이블은 다음을 포함해요:

  • advisory lock의 키로 사용되는 시리얼 정수 id
  • 고유 인덱스가 있는 텍스트로 된 워크스페이스 name
  • 텍스트로 된 Terraform state data

더 알아보기 (Learn more)