시크릿 매니저
시크릿 매니저
**시크릿 매니저(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를 지원해요: CONFIG와 credential_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문서를 참고해 주세요.