시크릿 매니저

시크릿 매니저

**시크릿 매니저(Secrets manager)**는 시크릿을 사용하는 모든 백엔드에 걸쳐 통일된 사용자 인터페이스를 제공해요. 시크릿에 범위(scope)를 부여하면 서로 다른 스토리지 프리픽스가 서로 다른 시크릿을 가질 수 있어, 단일 쿼리에서 조직 간 데이터를 조인할 수도 있답니다. 시크릿을 영속화하면 DuckDB를 실행할 때마다 지정할 필요도 없어져요.

출처: 문서

본문

경고 — 영속 시크릿은 디스크에 암호화되지 않은 바이너리 형식으로 저장돼요.

시크릿 타입

시크릿에는 타입이 있으며, 그 타입이 어떤 서비스를 위한 것인지 식별해 줍니다. 대부분의 시크릿은 DuckDB에 기본 포함되지 않고, 확장에 의해 등록돼요. 현재 사용 가능한 시크릿 타입은 다음과 같아요.

시크릿 타입 서비스/프로토콜 확장
azure Azure Blob Storage azure
ducklake DuckLake ducklake
gcs Google Cloud Storage httpfs
http HTTP 및 HTTPS httpfs
huggingface Hugging Face httpfs
iceberg Iceberg REST Catalog httpfs, iceberg
mysql MySQL mysql
postgres PostgreSQL postgres
quack Quack quack
r2 Cloudflare R2 httpfs
s3 AWS S3 httpfs
aws AWS aws

각 타입마다 시크릿이 어떻게 생성되는지 지정하는 하나 이상의 "시크릿 제공자(secret provider)"가 있어요. 시크릿에는 선택적 범위(scope)가 있을 수 있는데, 이는 시크릿이 적용되는 파일 경로 프리픽스예요. 어떤 경로에 대해 시크릿을 가져올 때 시크릿 범위를 경로와 비교해 일치하는 시크릿을 반환합니다. 여러 시크릿이 일치하는 경우 가장 긴 프리픽스가 선택돼요.

시크릿 생성

시크릿은 CREATE SECRET SQL 문으로 만들 수 있어요. 시크릿은 임시(temporary) 또는 **영속(persistent)**일 수 있습니다. 기본으로 사용되는 것은 임시 시크릿이며, DuckDB 인스턴스의 수명 동안 메모리에 저장돼요 (이전에 설정이 동작했던 것과 비슷하게요). 영속 시크릿은 ~/.duckdb/stored_secrets 디렉토리에 암호화되지 않은 바이너리 형식으로 저장됩니다. DuckDB 시작 시 이 디렉토리에서 영속 시크릿을 읽어 자동으로 로드해요.

시크릿 제공자

시크릿을 만들려면 **Secret Provider(시크릿 제공자)**를 사용해야 해요. Secret Provider는 시크릿이 생성되는 메커니즘이에요. 예를 들어 S3, GCS, R2, AZURE 시크릿 타입의 경우 DuckDB는 현재 두 가지 provider를 지원해요: CONFIGcredential_chain. CONFIG provider는 사용자가 모든 구성 정보를 CREATE SECRET에 전달해야 하는 반면, credential_chain provider는 자격 증명을 자동으로 가져오려고 시도해요. Secret Provider를 지정하지 않으면 CONFIG provider가 사용됩니다. 다른 provider로 시크릿을 만드는 방법은 httpfs와 azure의 각 페이지를 참고해 주세요.

임시 시크릿

S3에 접근하기 위한 임시·unscoped 시크릿을 만들려면 이렇게 하면 돼요.

CREATE SECRET my_secret (
    TYPE s3,
    KEY_ID 'my_secret_key',
    SECRET 'my_secret_value',
    REGION 'my_region'
);

여기서 기본 CONFIG 시크릿 provider를 암묵적으로 사용한다는 점을 주목하세요.

영속 시크릿

DuckDB 데이터베이스 인스턴스 사이에서 시크릿을 영속화하려면 CREATE PERSISTENT SECRET 명령어를 쓸 수 있어요.

CREATE PERSISTENT SECRET my_persistent_secret (
    TYPE s3,
    KEY_ID 'my_secret_key',
    SECRET 'my_secret_value'
);

기본적으로 이 명령은 시크릿을 (암호화 없이) ~/.duckdb/stored_secrets 디렉토리에 기록해요. 시크릿 디렉토리를 바꾸려면 다음 명령을 실행하세요.

SET secret_directory = 'path/to/my_secrets_dir';

secret_directory 설정은 현재 DuckDB 인스턴스에 적용되며 DuckDB 인스턴스 간에 영속되지 않아요. 사용자 지정 시크릿 디렉토리를 쓴다면, 새 DuckDB 인스턴스를 시작할 때 그 디렉토리의 영속 시크릿을 만들거나 사용하기 전에 secret_directory를 다시 설정하세요.

home_directory 구성 옵션의 값을 설정해도 시크릿의 위치에는 영향을 주지 않아요.

시크릿 삭제

시크릿은 DROP SECRET 문으로 삭제할 수 있어요.

DROP PERSISTENT SECRET my_persistent_secret;

같은 서비스 타입에 대해 여러 시크릿 만들기

서비스 타입에 대해 두 개의 시크릿이 존재하면, 범위를 사용해 어느 것을 쓸지 결정할 수 있어요. 예를 들어 볼게요.

CREATE SECRET secret1 (
    TYPE s3,
    KEY_ID 'my_secret_key1',
    SECRET 'my_secret_value1',
    SCOPE 's3://⟨my-bucket⟩'
);
CREATE SECRET secret2 (
    TYPE s3,
    KEY_ID 'my_secret_key2',
    SECRET 'my_secret_value2',
    SCOPE 's3://⟨my-other-bucket⟩'
);

이제 사용자가 s3://⟨my-other-bucket⟩/something에서 무언가를 쿼리하면, 그 요청에 대해 secret2가 자동으로 선택돼요. 어느 시크릿이 사용되는지 보려면 which_secret 스칼라 함수를 쓸 수 있는데, 경로와 시크릿 타입을 파라미터로 받아요.

FROM which_secret('s3://⟨my-other-bucket⟩/file.parquet', 's3');

시크릿 나열

시크릿은 내장 테이블 생성 함수로 나열할 수 있어요. 예를 들어 duckdb_secrets() 테이블 함수를 사용하면 되죠.

FROM duckdb_secrets();

민감 정보는 가려질 거예요.

더 알아보기 (Learn more)

  • CREATE SECRET · DROP SECRET 문법은 sql/statements/create_secret 문서를 참고해 주세요.