CREATE POSTGRES INSTANCE

CREATE POSTGRES INSTANCE

새 Snowflake Postgres 인스턴스를 만들거나 기존 인스턴스의 포크(fork)를 만드는 명령이에요. 포킹은 PITR(point-in-time recovery)을 사용해 특정 시점에 인스턴스의 완전하고 독립적인 복사본을 만들어요.

출처: 문서

본문

새 Snowflake Postgres 인스턴스를 만들거나 기존 인스턴스의 포크를 만들어요.

포킹은 PITR(point-in-time recovery)을 사용해 특정 시점에 인스턴스의 완전하고 독립적인 복사본을 만들어요. 이는 복구, 테스트, 또는 프로덕션 데이터에서 개발 환경을 만드는 데 유용해요.

함께 보기: ALTER POSTGRES INSTANCE, DESCRIBE POSTGRES INSTANCE, DROP POSTGRES INSTANCE, SHOW POSTGRES INSTANCES

구문 (Syntax)

CREATE POSTGRES INSTANCE [ IF NOT EXISTS ] <name>
  COMPUTE_FAMILY = '<compute_family>'
  STORAGE_SIZE_GB = <storage_gb>
  AUTHENTICATION_AUTHORITY = { POSTGRES | POSTGRES_OR_SNOWFLAKE }
  [ POSTGRES_VERSION = { 16 | 17 | 18 } ]
  [ NETWORK_POLICY = '<network_policy>' ]
  [ HIGH_AVAILABILITY = { TRUE | FALSE } ]
  [ STORAGE_INTEGRATION = '<storage_integration_name>' ]
  [ POSTGRES_SETTINGS = '<json_string>' ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , ... ] ) ]

다음 구문은 특정 시점에 기존 인스턴스의 포크를 만들어요. FORK 절은 Time Travel과 같은 AT | BEFORE 구문을 사용하는 PITR을 사용하지만, Postgres 인스턴스의 완전한 물리적 복사본을 만들어요.

CREATE POSTGRES INSTANCE [ IF NOT EXISTS ] <name>
  FORK <source_instance>
  [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> } ) ]
  [ COMPUTE_FAMILY = '<compute_family>' ]
  [ STORAGE_SIZE_GB = <storage_gb> ]
  [ HIGH_AVAILABILITY = { TRUE | FALSE } ]
  [ POSTGRES_SETTINGS = '<json_string>' ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , ... ] ) ]

필수 매개변수 (Required parameters)

name Postgres 인스턴스의 식별자(이름)를 지정하며, 계정 안에서 고유해야 해요.

또한 식별자는 반드시 알파벳 문자로 시작해야 하며, 전체 식별자 문자열이 큰따옴표로 묶이지 않는 한 공백이나 특수 문자를 포함할 수 없어요 (예: "My object"). 큰따옴표로 묶인 식별자는 대소문자를 구분해요.

자세한 내용은 식별자 요구 사항(Identifier requirements)을 참고해요.

COMPUTE_FAMILY = 'compute_family' Postgres 인스턴스의 인스턴스 크기를 지정해요.

Snowflake Postgres는 세 가지 티어를 제공해요.

  • Burstable (BURST_S, BURST_M): 개발과 간헐적 워크로드에 비용 효율적이에요. 100GB 스토리지로 제한되며 고가용성(high availability)을 지원하지 않아요.
  • Standard (STANDARD_M ~ STANDARD_24XL): 일반 용도 워크로드를 위한 균형 잡힌 CPU와 메모리예요. 고가용성을 포함한 모든 기능을 지원해요.
  • 메모리 최적화 (HIGHMEM_L ~ HIGHMEM_48XL): 메모리 집약적 쿼리와 큰 인덱스를 위한 높은 메모리-대-CPU 비율이에요. 고가용성을 포함한 모든 기능을 지원해요.

참고: 일부 기능은 특정 컴퓨트 패밀리가 필요해요. 예를 들어 고가용성(HIGH_AVAILABILITY = TRUE)은 STANDARD와 HIGHMEM 인스턴스에서만 사용할 수 있고 BURST 인스턴스에서는 사용할 수 없어요.

STORAGE_SIZE_GB = storage_gb 스토리지 크기를 GB 단위로 지정해요. 10에서 65,535 사이여야 해요.

스토리지는 할당된 양에 따라 컴퓨트와 별도로 청구돼요. 나중에 ALTER POSTGRES INSTANCE로 스토리지 크기를 늘리거나 줄일 수 있어요. 비용에 대한 자세한 내용은 Snowflake Postgres 비용 평가(Cost Evaluation)를 참고해요.

참고: 스토리지 크기를 줄일 때는 현재 디스크 사용량에 너무 가깝게 설정할 수 없어요. 새 크기는 현재 사용 중인 디스크 공간의 최소 1.4배여야 해요. 그래야 자동 스토리지 증가를 유발하지 않고 데이터를 더 추가할 여지가 있어요.

AUTHENTICATION_AUTHORITY = { POSTGRES | POSTGRES_OR_SNOWFLAKE } 인스턴스의 인증 방법을 지정해요. POSTGRES는 Postgres 사용자 비밀번호만 사용할 수 있음을 나타내요. POSTGRES_OR_SNOWFLAKE는 수명이 짧은 액세스 토큰 비밀번호도 사용할 수 있게 해요. 자세한 내용은 Snowflake Postgres용 Snowflake 토큰 인증(Snowflake Token Authentication for Snowflake Postgres)을 참고해요.

선택 매개변수 (Optional parameters)

IF NOT EXISTS 같은 이름의 인스턴스가 이미 존재하지 않을 때만 Postgres 인스턴스를 만들어요. 같은 이름의 인스턴스가 이미 존재하면 명령은 아무것도 하지 않고 새 인스턴스 없이 성공적으로 완료해요.

이 절을 사용해 명령을 멱등적으로 실행할 수 있어요. 예를 들어 프로비저닝 스크립트나 Terraform 플랜을 다시 실행할 때 유용해요.

POSTGRES_VERSION = { 16 | 17 | 18 } 사용할 Postgres의 메이저 버전을 지정해요.

최신 버전에는 새 기능과 개선 사항이 포함되지만, 애플리케이션 호환성을 위해 또는 기존 인스턴스와 일치시키기 위해 이전 버전을 선택할 수 있어요. 나중에 ALTER POSTGRES INSTANCE로 더 새로운 버전으로 업그레이드할 수 있어요.

  • 기본값: 최신 Postgres 버전

NETWORK_POLICY = 'network_policy' 인스턴스에 사용할 네트워크 정책을 지정해요. 이 매개변수를 지정하려면 네트워크 정책 객체에 대한 USAGE 권한이 부여되어 있어야 해요.

  • 기본값: 네트워크 정책이 적용되지 않음

⚠️ 중요: 네트워크 정책이 없으면 인스턴스가 들어오는(incoming) 연결을 받을 수 없어요. SHOW와 DESCRIBE 명령으로 인스턴스를 볼 수는 있지만, ALTER POSTGRES INSTANCE로 네트워크 정책을 연결하기 전까지는 Postgres 데이터베이스에 연결할 수 없어요.

STORAGE_INTEGRATION = 'storage_integration_name' POSTGRES_EXTERNAL_STORAGE 유형의 스토리지 인티그레이션을 Postgres 인스턴스에 연결해 pg_lake 확장이 외부 객체 스토리지의 데이터에 접근할 수 있게 해요. 전체 설정 절차는 pg_lake를 참고해요.

나중에 ALTER POSTGRES INSTANCE로 스토리지 인티그레이션을 연결하거나 제거할 수도 있어요.

미리보기 기능 — 공개 — 모든 계정에서 사용 가능해요.

  • 기본값: 스토리지 인티그레이션이 연결되지 않음

HIGH_AVAILABILITY = { TRUE | FALSE } 인스턴스에 고가용성을 활성화할지 지정해요.

고가용성은 자동 장애 조치(failover)를 위해 별도의 가용 영역에 대기(standby) 인스턴스를 프로비저닝해요. 이는 기본 인스턴스를 사용할 수 없게 될 때 다운타임을 최소화해요. HA가 없으면 복구에 백업 복원이 필요하며, 크거나 활발한 인스턴스는 몇 시간이 걸릴 수 있어요. 나중에 ALTER POSTGRES INSTANCE로 HA를 활성화·비활성화하려면 유지보수 작업이 필요하다는 점에 주의해요.

⚠️ 중요: Burstable 인스턴스 크기(BURST_S, BURST_M)는 고가용성을 지원하지 않아요.

  • 기본값: FALSE

POSTGRES_SETTINGS = 'json_string' 인스턴스의 사용자 지정 Postgres 서버 설정을 JSON 형식으로 지정해요.

'{"component:name" = "value", ...}'

형식은 component:name을 사용하며, 여기서 componentpostgres(PostgreSQL 서버 설정용) 또는 pgbouncer(연결 풀러 설정용)예요. 예를 들어:

'{"postgres:work_mem" = "128MB", "pgbouncer:default_pool_size" = "200"}'

사용 가능한 설정은 Snowflake Postgres 서버 설정(Server Settings)을 참고해요.

  • 기본값: 사용자 지정 Postgres 구성 매개변수가 설정되지 않음

COMMENT = 'string_literal' Postgres 인스턴스에 대한 설명(comment)을 지정해요.

설명은 인스턴스의 목적이나 소유권을 문서화하는 데 유용해요. 예: "청구 서비스용 프로덕션 인스턴스" 또는 "팀 X의 QA 환경". 태그와 달리 설명은 자유 형식 텍스트이며 조직화나 비용 추적에 사용되지 않아요.

  • 기본값: 값 없음

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] ) 태그 이름과 태그 문자열 값을 지정해요.

태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256이에요.

문에서 태그를 지정하는 방법에 대한 정보는 태그 할당량(Tag quotas)을 참고해요.

포크 매개변수 (Fork parameters)

Snowflake Postgres 인스턴스를 포킹하면 모든 스키마 객체와 테이블 데이터가 동일한 동일한 복사본을 만들어요. 특정 시점을 지정해 포크된 인스턴스가 인스턴스의 이전 상태를 반영하게 할 수도 있어요. 이렇게 하면 객체를 실수로 삭제하는 것 같은 데이터 무결성 문제에서 복구할 수 있어요. 또한 동일한 데이터로 다양한 인스턴스 구성을 시도하는 등 개발·테스트 환경에서 시나리오를 탐색할 수 있어요. 자세한 내용은 Snowflake Postgres PITR(point-in-time recovery)을 참고해요.

FORK source_instance 지정된 소스 인스턴스의 포크(복사본)로 새 인스턴스를 만들어요. 주어진 소스 인스턴스의 포크를 만들려면 그 인스턴스에 대한 OWNERSHIP 권한이 부여되어 있어야 해요.

{ AT | BEFORE } ( { TIMESTAMP => timestamp | OFFSET => time_difference } ) 포크할 특정 시점을 지정해요. 10일보다 과거의 시점에서 포크할 수 없어요. 타임스탬프 또는 오프셋은 10일 Postgres 데이터 보존 기간 안에 있어야 해요.

AT | BEFORE 절은 다음 매개변수 중 하나를 받아들여요.

  • TIMESTAMP => timestamp: Time Travel에 사용할 정확한 날짜와 시간을 지정해요. 값은 TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ 또는 TIMESTAMP_TZ 데이터 유형으로 명시적으로 캐스트해야 해요.
  • OFFSET => time_difference: 현재 시간으로부터의 초 차이를 -N 형태로 지정하며, 여기서 N은 정수 또는 산술 표현식일 수 있어요 (예: -120은 120초, -30*60은 30분).
  • 기본값: 현재 시간 사용

포크를 만들 때 다음 매개변수는 선택 사항이며 소스 인스턴스의 값이 기본값이 돼요.

  • COMPUTE_FAMILY
  • STORAGE_SIZE_GB
  • HIGH_AVAILABILITY
  • POSTGRES_SETTINGS

출력 (Output)

새 인스턴스를 만들면 명령이 다음 컬럼과 함께 행 하나를 반환해요.

컬럼 (Column) 설명 (Description)
status 생성 작업의 상태
host 인스턴스에 연결하기 위한 호스트 이름
access_roles snowflake_adminapplication 역할의 사용자 이름과 비밀번호
default_database 인스턴스의 기본 데이터베이스

⚠️ 중요: access_roles 컬럼에는 나중에 검색할 수 없는 자격 증명이 포함돼요. 이 정보를 안전한 위치에 저장해요.

포크를 만들면 명령이 statushost 컬럼만 있는 행 하나를 반환해요. 포크는 포크가 대응하는 시점에 소스 인스턴스가 가졌던 것과 같은 자격 증명을 사용해요.

접근 제어 요구 사항 (Access control requirements)

이 작업을 실행하는 데 사용하는 역할(role)은 최소한 다음 권한을 가져야 해요.

권한 (Privilege) 객체 (Object) 비고
CREATE POSTGRES INSTANCE Account 기본적으로 ACCOUNTADMIN 역할만 이 권한을 가져요.
OWNERSHIP Postgres instances 기존 인스턴스에 필요. 그것의 포크를 만들려면
USAGE Network policy NETWORK_POLICY를 지정하는 경우에만 필요
USAGE Storage integration STORAGE_INTEGRATION을 지정하는 경우에만 필요

지정된 권한 집합으로 사용자 지정 역할을 만드는 방법은 사용자 지정 역할 만들기(Creating custom roles)를 참고해요. 보호 가능한 객체에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여의 일반적인 내용은 접근 제어 개요(Overview of Access Control)를 참고해요.

사용 메모 (Usage notes)

IF NOT EXISTS를 지정하고 같은 이름의 인스턴스가 이미 존재하면, 명령은 출력 컬럼 없이 성공 메시지를 반환해요. 기존 인스턴스가 지정한 것과 같은 매개변수를 가졌는지는 확인하지 않아요.

새 인스턴스 생성은 완료하는 데 시간이 걸려요. 인스턴스는 구축되는 동안 현재 상태를 표시해요. 인스턴스 설정 중 상태를 추적하려면 DESC POSTGRES INSTANCE 명령을 사용할 수 있어요.

포크를 만들 때 자격 증명을 지정하거나 보지 않아요. 포크는 포크가 대응하는 시점에 소스 인스턴스가 가졌던 것과 같은 자격 증명을 사용하기 때문이에요. 나중에 원래 인스턴스와 다른 사용자 집합에 접근을 제공해야 한다면 포크된 인스턴스의 자격 증명을 다시 생성할 수 있어요.

포크를 만드는 데 필요한 시간은 소스 인스턴스의 데이터 양에 따라 달라져요. 데이터가 많은 더 큰 데이터베이스는 포킹에 더 오래 걸려요. 소스의 컴퓨트 패밀리(인스턴스 크기)는 포크 기간에 크게 영향을 미치지 않아요.

포킹은 백업과 WAL(write-ahead log) 재생을 사용해 완전한 데이터 복사를 수행하므로, 포크된 인스턴스는 완전히 별개예요. 소스 인스턴스를 삭제해도 그로부터 만든 포크에는 영향을 미치지 않아요.

참고: Postgres 포킹은 테이블에 제로 카피(zero-copy) 기술을 사용하는 Snowflake Time Travel 기능의 일부가 아니에요. 다만 포킹은 특정 시점을 지정하기 위해 같은 AT | BEFORE 구문을 사용해요.

메타데이터에 관해서는 다음 사항에 주의해요.

⚠️ 주의: 고객은 Snowflake 서비스를 사용할 때 (User 객체를 제외하고) 개인 데이터·민감 데이터·수출 통제 데이터·기타 규제 데이터를 메타데이터로 입력하지 않도록 해야 해요. 자세한 내용은 Snowflake의 메타데이터 필드를 참고해요.

예시 (Examples)

기본 Postgres 인스턴스를 만들어요.

CREATE POSTGRES INSTANCE my_postgres
  COMPUTE_FAMILY = 'STANDARD_S'
  STORAGE_SIZE_GB = 50
  AUTHENTICATION_AUTHORITY = POSTGRES;

이미 존재하지 않을 때만 Postgres 인스턴스를 만들어요.

CREATE POSTGRES INSTANCE IF NOT EXISTS my_postgres
  COMPUTE_FAMILY = 'STANDARD_S'
  STORAGE_SIZE_GB = 50
  AUTHENTICATION_AUTHORITY = POSTGRES;

고가용성과 네트워크 정책이 있는 Postgres 인스턴스를 만들어요.

CREATE POSTGRES INSTANCE prod_postgres
  COMPUTE_FAMILY = 'STANDARD_M'
  STORAGE_SIZE_GB = 500
  AUTHENTICATION_AUTHORITY = POSTGRES
  POSTGRES_VERSION = 17
  HIGH_AVAILABILITY = TRUE
  NETWORK_POLICY = 'my_network_policy'
  COMMENT = 'Production Postgres instance';

인스턴스를 만들고 나중에 네트워크 정책을 구성해요.

-- Step 1: Create instance without network policy
CREATE POSTGRES INSTANCE my_postgres
  COMPUTE_FAMILY = 'STANDARD_S'
  STORAGE_SIZE_GB = 50
  AUTHENTICATION_AUTHORITY = POSTGRES;

-- Step 2: Monitor instance creation
DESCRIBE POSTGRES INSTANCE my_postgres
  ->> SELECT "property", "value"
      FROM $1
      WHERE "property" IN ('name', 'state', 'host');

-- Step 3: Once READY, attach network policy to enable connections
ALTER POSTGRES INSTANCE my_postgres
  SET NETWORK_POLICY = 'my_network_policy';

-- Step 4: Now you can connect to the Postgres database using the host and credentials
-- from the CREATE output

기존 인스턴스의 포크를 만들어요.

CREATE POSTGRES INSTANCE my_fork
  FORK my_source_instance;

특정 시점에 포크를 만들어요.

CREATE POSTGRES INSTANCE my_fork
  FORK my_source_instance
  AT (TIMESTAMP => '2025-01-15 12:00:00'::TIMESTAMP_NTZ);

2시간 전에 다른 인스턴스 크기로 포크를 만들어요.

CREATE POSTGRES INSTANCE my_fork
  FORK my_source_instance
  AT (OFFSET => -7200)
  COMPUTE_FAMILY = 'STANDARD_L';

더 큰 인스턴스 크기와 다른 스토리지로 보고용 포크를 만들어요.

-- Fork production instance for reporting workload
CREATE POSTGRES INSTANCE reporting_instance
  FORK prod_instance
  COMPUTE_FAMILY = 'HIGHMEM_XL'
  STORAGE_SIZE_GB = 500
  COMMENT = 'Dedicated reporting instance to offload analytics queries';

일일 테스트를 위해 UTC 자정에 포크를 만들어요.

-- Fork at start of day (midnight UTC)
CREATE POSTGRES INSTANCE daily_test_instance
  FORK prod_instance
  AT (TIMESTAMP => '2026-02-05 00:00:00'::TIMESTAMP_NTZ);

비용을 줄이기 위해 HA를 비활성화한 개발 포크를 만들어요.

CREATE POSTGRES INSTANCE dev_instance
  FORK prod_instance
  COMPUTE_FAMILY = 'STANDARD_S'
  STORAGE_SIZE_GB = 100
  HIGH_AVAILABILITY = FALSE
  COMMENT = 'Development environment from prod data';

사고 이전 시점의 포크를 사용해 우발적 데이터 삭제에서 복구해요.

-- Recover by forking from 30 minutes ago
CREATE POSTGRES INSTANCE recovered_instance
  FORK damaged_instance
  AT (OFFSET => -1800)
  COMMENT = 'Recovery fork from before data deletion';

더 알아보기 (Learn more)