この記事の目的
DuckDB にて S3 上の parquet file へのアクセス方法を何度も忘れてしまうので、記録のために残す。なお v1.4.2 の挙動であることに注意されたい。(過去のversionでは違う挙動だった記憶があるため)
Disclamer
この記事の内容は、私個人の意見や見解であり、私が所属する組織の公式な立場、方針、意見を反映するものではありません。この記事の内容について、組織はいかなる責任も負いません。
実行環境
$ aws --version
aws-cli/2.32.2 Python/3.13.9 Darwin/24.6.0 source/arm64
$ duckdb --version
v1.4.2 (Andium) 68d7555f68
前準備: SSOでのログイン
my-profile-name を自分のプロファイル名として指定して AWS へ SSOログインをする。
aws sso login --profile my-profile-name
DuckDBでの方法
以下の2つの方法で実行できる
- 方法1: 起動時に変数を渡して実行
AWS_PROFILE=... duckdb ... - 方法2: duckdbを起動して
CREATE SECRETで明示的に指定
個人的結論として方法1を使う。
方法1
以下のようにシェル変数を渡してDuckDBを起動する。
AWS_PROFILE=my-profile-name duckdb
または環境変数として指定して起動する。
export AWS_PROFILE=my-profile-name
duckdb
最初にextensionのインストール
INSTALL aws; LOAD aws;
次に CREATE SECRET を実行する。
AWS_RESIONの環境変数を設定していない場合、 CREATE SECRET文で明示的に指定する必要がある。
(入力は ); まで)
初回の実行は数秒かかる。
CREATE OR REPLACE SECRET secret (
TYPE s3,
PROVIDER credential_chain,
REGION 'ap-northeast-1'
);
100% ▕██████████████████████████████████████▏ (00:00:05.93 elapsed)
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true │
└─────────┘
クエリを実行できるようになる。
D select count(*) from read_parquet('s3://your-bucket/path-to/data.parquet');
┌────────────────┐
│ count_star() │
│ int64 │
├────────────────┤
│ 1234567 │
│ (1.23 million) │
└────────────────┘
方法2
DuckDBの起動
duckdb
方法1と同様、extensionのインストール(初回時のみ)
INSTALL aws; LOAD aws;
CHAIN sso と PROFILE 'my-profile-name' を明示的に指定する
CREATE OR REPLACE SECRET secret (
TYPE s3,
PROVIDER credential_chain,
CHAIN sso,
PROFILE 'my-profile-name',
REGION 'ap-northeast-1'
);
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true │
└─────────┘
クエれる。
D select count(*) from read_parquet('s3://your-bucket/path-to/data.parquet');
┌────────────────┐
│ count_star() │
│ int64 │
├────────────────┤
│ 1234567 │
│ (1.23 million) │
└────────────────┘
なお、以下のような指定をした過去の記事が存在するが、v1.4.2の私の環境ではエラーとなる。(確かv1.3.0ぐらいまでは動いていた記憶がある)
D CREATE SECRET secret_s3 (
TYPE S3,
PROVIDER CREDENTIAL_CHAIN,
CHAIN 'sso'
);
Invalid Configuration Error:
Secret Validation Failure: during `generate` using the following:
Credential Chain: 'sso'
参考
その他
duckdb_secrets() で現在の credential 情報を確認できる。
D SELECT * FROM duckdb_secrets();
┌─────────┬─────────┬──────────────────┬────────────┬─────────┬──────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ type │ provider │ persistent │ storage │ scope │ secret_string │
│ varchar │ varchar │ varchar │ boolean │ varchar │ varchar[] │ varchar │
├─────────┼─────────┼──────────────────┼────────────┼─────────┼──────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────┤
│ secret │ s3 │ credential_chain │ false │ memory │ ['s3://', 's3n://'… │ name=secret;type=s3;provider=credential_chain;serializable=true;scope=s3://,s3n://,s3… │
└─────────┴─────────┴──────────────────┴────────────┴─────────┴──────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────┘
D
pythonから import duckdb しての実行についても方法1,方法2と同様の対応で問題ない。
以上