何かやってみるブログ

興味をもったこと、趣味のこと、技術について色々書きます。

[雑メモ] AWS RDSのスナップショットから特定のテーブルのレコードをAWS S3にエクスポートしてduckdbでクエリを叩きたい

  • workという名のprofileを使用している、データベースはPostgresSQLを使用していると想定する。

  • 抽出したいスナップショットを特定する。

aws rds describe-db-snapshots --profile work | jq ".DBSnapshots.[].DBSnapshotArn"
  • S3にエクスポート

コマンドやオプションについてはヘルプをみるなりリファレンスをみればよい。--export-onlyオプションで特定のテーブルに絞っているのがポイント。

docs.aws.amazon.com

aws rds start-export-task \
    --export-task-identifier my-snapshot-export \
    --source-arn arn:aws:rds:AWS_Region:123456789012:snapshot:snapshot-name \
    --s3-bucket-name amzn-s3-demo-bucket \
    --iam-role-arn iam-role \
    --kms-key-id my-key \
    --export-only '["データベース名.スキーマ.テーブル名"]' --profile work
  • duckdbでS3の対象のファイルに対してクエリを投げる。

profileの設定周りについて詳しくはリファレンスをみる。

duckdb.org

FROMにS3URIを指定してクエリがたたける。

AWS_PROFILE=work duckdb
v1.2.1 8e52ec4395
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D CREATE OR REPLACE SECRET secret (
      TYPE s3,
      PROVIDER credential_chain
  );
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true    │
└─────────┘
D SELECT COUNT(*) FROM 'S3URI/1/*.parquet';
100% ▕████████████████████████████████████████████████████████████▏
┌─────────────────┐
│  count_star()   │
│      int64      │
├─────────────────┤
│    41275365     │
│ (41.28 million) │
└─────────────────┘
D