コンテンツにスキップ
ホームPT · EN · ES · JA · ZH

仕組み

データレイクにデータが入るには、設定実行 の 2 つが必要です。設定は コンソールで一度だけ行います。実行はスナップショットごとに自動で行われます。

この区別が重要なのは、設定が不完全でもパイプラインは正常終了する からです。 取り込み対象のデータベースが 1 つも選択されていない場合でも、スナップショットは エクスポートされ、Parquet ファイルは S3 に届き、コピージョブはそれらを黙って無視します。 どこにもエラーは出ません。だからこそ、コンソールの概要画面には不足しているものが 一覧表示されます。

1. AWS がスナップショットを取得
自動(バックアップウィンドウ)または手動
2. RDS が Parquet でエクスポート
exported/{cluster}/{export}/pagila/public.payment/1/*.parquet
3. Data Pump が選択されたものを、指定された名前でコピー
catalog/{cluster}/pagila.pagamentos/*.parquet
4. 設定されたテーブルを再パーティション
catalog/{cluster}/pagila.pagamentos/ano=2024/mes=03/*.parquet
5. Glue がカタログ化
SELECT * FROM datalake.pagila_pagamentos WHERE ano = 2024

ステップ 3 と 4 が、お客様の判断が反映される部分です。どのデータベースとテーブルを 対象にするか(取り込みの設定)、どう再パーティションするか (パーティション)です。

スナップショットが完成すると、RDS はイベントを発行します。Lambda 関数がそれを受け取り、 そのクラスターが登録されているかを確認し、登録されていればエクスポートを開始します。 エクスポートが完了すると、同じ経路で処理パイプラインが起動します。

Lambda はどちらの場面でも同じもので、イベントの種類で判別します。関係のないイベント (作成開始、コピー、削除)は記録されたうえで無視されます。

同一イメージから起動する Fargate タスクとして、4 つのジョブが順に実行されます。

  1. 前回のカタログを削除catalog/{cluster}/ は実行ごとに再構築されるため、 常にデータベースの現在の状態を反映します。
  2. ファイルをコピー — 選択されたデータベースのみを対象に、テーブルのフィルターと 別名を適用します。
  3. 再パーティション — 設定済みテーブルごとに 1 タスクを並列実行します。
  4. 生のエクスポートを削除 — 任意です。

最後に Glue のクローラーが結果をカタログ化し、後続処理につなげたい場合のために SNS トピックへ通知が発行されます。

exported/{cluster}/{export}/{データベース}/{スキーマ}.{テーブル}/{パート}/*.parquet
└── RDS が生成するもの: スナップショットに含まれるすべて
catalog/{cluster}/{alias}.{テーブル}/*.parquet
└── Glue がカタログ化するもの: 選択したものだけ
longterm/{cluster}/{alias}/{テーブル}/
└── ソースデータベースでのパージ後も残る履歴

catalog/longterm/ の違いによって、Postgres から古いデータをパージした後でも 履歴を保持 できます。catalog/ は実行ごとに再作成され、 longterm/ は蓄積されます。

Postgres 側ですでにパーティション化されたテーブル

Section titled “Postgres 側ですでにパーティション化されたテーブル”

Postgres でネイティブにパーティション化されたテーブルの場合、RDS は親テーブル 各子パーティションを別々のテーブルとしてエクスポートします。親テーブルにはすでに すべての行が含まれているため、両方をコピーするとデータレイク上で各行が重複します。

Data Pump は名前のパターンではなく、エクスポート自体のメタデータを使って子テーブルを 検出し無視します。データベース側で新しいパーティションが作成されても自動で認識され、 維持すべきリストはありません。