Snowflake Openflow Gen 2 で PostgreSQL CDC のセットアップと設定ファイルによる構成変更を試してみた

Snowflake Openflow Gen 2 で PostgreSQL CDC のセットアップと設定ファイルによる構成変更を試してみた

Snowflake Openflow Gen 2 が一般提供となり、Amazon RDS for PostgreSQL との CDC 連携をセットアップウィザードと SQL で構築してみました。設定ファイルの編集による構成変更も試しており、CI/CD パイプラインへの統合の可能性も探ります。
2026.10.17

はじめに

2026年9月のアップデートで Snowflake Openflow の第 2 世代(Gen 2)の Deployment と Runtime が一般提供となりました。
あわせて、コネクタの設定もパブリックプレビューとして、SQL やセットアップウィザードから行えるようになっています。

https://docs.snowflake.com/en/release-notes/2026/other/2026-09-08-openflow-gen2-deployment-runtime-ga

Gen 2 の Snowflake Deployment 上で Amazon RDS for PostgreSQL の CDC コネクタの設定、簡単な構成変更を試してみた内容を記事としました。

Gen 1 と Gen 2 の違い

Gen 1 と Gen 2 比較は以下に記載があります。

https://docs.snowflake.com/en/user-guide/data-integration/openflow/gen2

https://docs.snowflake.com/en/user-guide/data-integration/openflow/gen2/openflow-generations

Gen2 になったことでの主な違いは以下の通りです。コネクタ設定については設定ファイルで管理できるので、コネクタ管理を CI/CD パイプラインに統合できるとされています。

  • Deployment・Runtime の管理
    • SQL で作成・変更できる
    • 上記のため、Snowflake のオブジェクトとして RBAC で管理できる
  • コネクタの設定方法
    • セットアップウィザード、またはステージ上の設定ファイル
      • ※2026年10月時点で、この方法で設定できるコネクタは PostgreSQL と MySQL / MariaDB の 2 つ。いずれも Gen 2 の Runtime が必要
  • 設定の保存先
    • Gen 1:キャンバス上のフロー
    • Gen 2:ステージ上のconfig.json(バージョンとして保存)
  • 設定の変更方法
    • Gen 1:キャンバスで編集
    • Gen 2:liveバージョンを編集し、COMMITで新しいバージョンにする

試してみる

前提条件

以下の環境を使用しています。

  • Snowflake:商用アカウント
    • Edition:Enterprise
    • クラウドサービス:AWS
    • リージョン:東京(AWS_AP_NORTHEAST_1)
    • Deployment の種類:Snowflake Deployment
  • AWS 側
    • Amazon RDS for PostgreSQL(論理レプリケーションを有効化)

構成については、以下の記事の内容を参考にしています。

https://dev.classmethod.jp/articles/tried-running-snowflake-openflow-connector-for-postgresql-on-spcs-and-connected-to-rds/

Snowflake Deployment は、Snowpark Container Services(SPCS)上で動作します。アウトバウンドの PrivateLink にも対応していますが、今回はこちらの記事を参考にインターネット経由で接続します。
具体的には、RDS をプライベートサブネットに作成し、前段にインターネット向けの NLB を置き NLB のセキュリティグループで Snowflake の egress IP だけを許可する構成としています。

事前準備

NLB へのネットワークアクセス制御にために、Snowflake の Egress IP を確認しておきます。範囲ごとに有効期限があるため、本番運用時は期限切れの前に、許可リストを更新する必要があります。

SELECT SYSTEM$GET_SNOWFLAKE_EGRESS_IP_RANGES();

https://docs.snowflake.com/en/sql-reference/functions/system_get_snowflake_egress_ip_ranges

PostgreSQL 側の準備としては、論理レプリケーションの確認、サンプルデータ、レプリケーション用ユーザー、Publication を作成しておきます。
サンプルデータは以下の内容で用意しました。

サンプルデータの作成 SQL
CREATE TABLE public.customers (
  customer_id  integer PRIMARY KEY,
  name         text        NOT NULL,
  email        text        NOT NULL,
  created_at   timestamptz NOT NULL DEFAULT now()
);

CREATE TABLE public.orders (
  order_id     integer PRIMARY KEY,
  customer_id  integer       NOT NULL REFERENCES public.customers (customer_id),
  amount       numeric(10,2) NOT NULL,
  status       text          NOT NULL,
  ordered_at   timestamptz   NOT NULL DEFAULT now()
);

-- 顧客 1 万件(generate_series で連番を作り、1 回の INSERT で投入する)
INSERT INTO public.customers (customer_id, name, email, created_at)
SELECT g,
       'Customer ' || g,
       'user' || g || '@example.com',
       now() - random() * interval '365 days'
FROM generate_series(1, 10000) AS g;

-- 注文 10 万件(顧客 ID は 1〜10000 のいずれか。外部キー制約を満たす)
INSERT INTO public.orders (order_id, customer_id, amount, status, ordered_at)
SELECT g,
       1 + floor(random() * 10000)::int,
       round((random() * 50000)::numeric, 2),
       (ARRAY['paid', 'shipped', 'delivered', 'cancelled'])[1 + floor(random() * 4)::int],
       now() - random() * interval '365 days'
FROM generate_series(1, 100000) AS g;

SELECT COUNT(*) FROM public.customers;  -- 10000
SELECT COUNT(*) FROM public.orders;     -- 100000
SELECT status, COUNT(*) FROM public.orders GROUP BY status ORDER BY status;  -- 4 種類にほぼ均等に分かれる

 count 
-------
 10000
(1 row)

 count  
--------
 100000
(1 row)

Snowflake 側:管理用オブジェクトの作成

以下の手順で Openflow を管理するロールと、データベース・スキーマを作成しました。
ここで作成するデータベースとスキーマは、Runtime とコネクタを格納する領域となります。データの取り込み先は後程作成します。

USE ROLE ACCOUNTADMIN;

CREATE ROLE IF NOT EXISTS yasuhara_openflow_admin;
GRANT ROLE yasuhara_openflow_admin TO ROLE ACCOUNTADMIN;

-- アカウントレベルのデプロイメント作成権限を付与
GRANT CREATE OPENFLOW DEPLOYMENT ON ACCOUNT TO ROLE yasuhara_openflow_admin;
GRANT CREATE DATABASE ON ACCOUNT TO ROLE yasuhara_openflow_admin;
GRANT CREATE INTEGRATION ON ACCOUNT TO ROLE yasuhara_openflow_admin;
GRANT CREATE COMPUTE POOL ON ACCOUNT TO ROLE yasuhara_openflow_admin; 

USE ROLE yasuhara_openflow_admin;

-- Openflow管理用のデータベーススキーマを作成
CREATE DATABASE yasuhara_openflow_db;
CREATE SCHEMA IF NOT EXISTS yasuhara_openflow_db.openflow_schema;

その他のポイントとして、Runtime とコネクタをスキーマ内に作成するには、そのスキーマに対するCREATE OPENFLOW RUNTIMEとCREATE OPENFLOW CONNECTOR権限が必要です。

次に、コネクタが Snowflake にアクセスする際に使用するロールと、外部への接続を許可するネットワークルール・外部アクセス統合を作成します。

USE ROLE ACCOUNTADMIN;

CREATE ROLE IF NOT EXISTS yasuhara_openflow_execute_as_rl;
GRANT ROLE yasuhara_openflow_execute_as_rl TO ROLE yasuhara_openflow_admin;
GRANT USAGE ON DATABASE yasuhara_openflow_db TO ROLE yasuhara_openflow_execute_as_rl;
GRANT USAGE ON SCHEMA yasuhara_openflow_db.openflow_schema TO ROLE yasuhara_openflow_execute_as_rl;

USE DATABASE yasuhara_openflow_db;
USE SCHEMA openflow_schema;

-- 接続先は NLB の DNS 名とポート
CREATE OR REPLACE NETWORK RULE openflow_my_runtime_network_rule
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('<NLB の DNS 名>:5432');

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION yasuhara_openflow_my_runtime_eai
  ALLOWED_NETWORK_RULES = (yasuhara_openflow_db.openflow_schema.openflow_my_runtime_network_rule)
  ENABLED = TRUE;

GRANT USAGE ON INTEGRATION yasuhara_openflow_my_runtime_eai TO ROLE yasuhara_openflow_execute_as_rl;

取り込み先のデータベース、MERGE 用のウェアハウス、PostgreSQL のパスワードを保存するシークレットを作成します。
※取り込み先のスキーマは、コネクタが作成するため、事前には作成しません。

CREATE DATABASE IF NOT EXISTS yasuhara_pg_openflow_dest;
CREATE WAREHOUSE IF NOT EXISTS yasuhara_openflow_wh WAREHOUSE_SIZE = XSMALL AUTO_SUSPEND = 60;

GRANT USAGE ON DATABASE yasuhara_pg_openflow_dest TO ROLE yasuhara_openflow_execute_as_rl;
GRANT CREATE SCHEMA ON DATABASE yasuhara_pg_openflow_dest TO ROLE yasuhara_openflow_execute_as_rl;
GRANT USAGE, OPERATE ON WAREHOUSE yasuhara_openflow_wh TO ROLE yasuhara_openflow_execute_as_rl;

-- シークレットを作成
CREATE OR REPLACE SECRET yasuhara_openflow_db.openflow_schema.pg_password
  TYPE = GENERIC_STRING
  SECRET_STRING = '<openflow_repl のパスワード>';

-- シークレットの読み取り権限を付与
GRANT READ ON SECRET yasuhara_openflow_db.openflow_schema.pg_password TO ROLE yasuhara_openflow_execute_as_rl;

Openflow のコンポーネントを作成

Deployment、Runtime、コネクタを作成します。

はじめに Deployment を SQL で作成します。

USE ROLE yasuhara_openflow_admin;

-- Deploymentを作成
CREATE OPENFLOW DEPLOYMENT yasuhara_snowflake_deployment
  DEPLOYMENT_TYPE = SNOWFLAKE
  DISPLAY_NAME = 'My gen 2 Snowflake Deployment';
+-------------------------------------------------------------------------+                                                                       
| status                                                                  |                                                                       
|-------------------------------------------------------------------------|                                                                       
| Openflow Deployment YASUHARA_SNOWFLAKE_DEPLOYMENT successfully created. |                                                                       
+-------------------------------------------------------------------------+ 

https://docs.snowflake.com/en/sql-reference/sql/create-openflow-deployment

作成後、Openflow UI からも確認できます。

Deployment には、モニタリング用に専用のイベントテーブルを設定しておきます。

CREATE EVENT TABLE IF NOT EXISTS yasuhara_openflow_db.openflow_schema.openflow_events;

ALTER OPENFLOW DEPLOYMENT yasuhara_snowflake_deployment
  SET EVENT_TABLE = 'yasuhara_openflow_db.openflow_schema.openflow_events';

Runtime を作成します。

USE ROLE yasuhara_openflow_admin;
USE DATABASE yasuhara_openflow_db;
USE SCHEMA openflow_schema;

CREATE OPENFLOW RUNTIME my_runtime
  IN DEPLOYMENT yasuhara_snowflake_deployment
  NODE_TYPE = MEDIUM
  NODE_TYPE_TIER = 'M4'
  MIN_NODES = 1
  MAX_NODES = 1
  EXECUTE_AS_ROLE = yasuhara_openflow_execute_as_rl
  EXTERNAL_ACCESS_INTEGRATIONS = (yasuhara_openflow_my_runtime_eai)
  DISPLAY_NAME = 'My gen 2 Runtime';
+---------------------------------------------------+                                                                                             
| status                                            |
|---------------------------------------------------|
| Openflow Runtime MY_RUNTIME successfully created. |
+---------------------------------------------------+  

https://docs.snowflake.com/en/sql-reference/sql/create-openflow-runtime

こちらも作以後に UI で確認できました。

続けてコネクタを作成します。コネクタの初回作成は GUI から行いました。

公式ドキュメントでも、最初のコネクタの設定にはセットアップウィザードを使うよう案内されています。

はじめに「Connector library」からコネクタを Runtime にインストールします。

コネクタをインストールしたら、Openflow の画面の「Installed Connector」にも、作成したコネクタが表示されます。

コネクタのセットアップウィザード

Openflow の画面で、作成したコネクタの編集をクリックします。

セットアップウィザードは下図のようになっていました。はじめに接続情報を入力します。

主な項目と設定は以下の通りです。

  • Source Database Connection URL
    • jdbc:postgresql://<NLB の DNS 名>:5432/sampledb?sslmode=require
  • Source Database Driver
    • PostgreSQL の JDBC ドライバー(postgresql-42.7.14.jar)をアップロード
  • Source Database User
    • openflow_repl
  • Source Database Password
    • シークレットオブジェクトyasuhara_openflow_db.openflow_schema.pg_passwordを選択
  • Source Database Publication Name
    • snowflake_pub
  • Configure Logical Keys
    • Default Primary Key Support(既定のまま)

注意点として JDBC ドライバーは、PostgreSQL の公式サイトからダウンロードしたものを、ウィザードからアップロードします

入力後「Verify Configuration」を実行し、問題なければ次に進みます。

Replication table schema

レプリケーションするスキーマとテーブルを選びます。

対象は以下の2つから選択できます。

  • Manual selection
    • 選んだオブジェクトだけを対象にする。ソースに追加されたテーブルは対象にならない
  • RegEx
    • 正規表現で対象を決める。ソースに追加されたテーブルにも、ルールが適用される

今回は、Manual selection でサンプルデータとして作成したpublic.customersとpublic.ordersを選択しました。

Replication columns

レプリケーションする列を決めます。既定では、選んだテーブルの全列が対象です。今回は、全列を取り込むため、何も設定せずに進みました。

Destination details

取り込み先の設定です。

こちらは以下の通り設定しました。

項目 内容 今回の設定
Snowflake Destination Database 書き込み先の DB yasuhara_pg_openflow_dest
Snowflake Warehouse 宛先テーブルへの MERGE を実行するウェアハウス yasuhara_openflow_wh
Destination Schema Strategy 宛先のスキーマ名の付け方 {database}_{schema}
Object Identifier Resolution 名前の大文字・小文字の扱い Case-insensitive(すべて大文字で保存)
Legacy Format Support 旧コネクタの列名・型に合わせるか Standard
Oversized Value Strategy 大きすぎる値の扱い Set Null(既定)
Error Handling Strategy 受け付けられない行の扱い Log Errors and Continue(既定)
Table Storage Format 宛先テーブルの形式 Standard
  • Destination Schema Strategy、Object Identifier Resolution、Table Storage Format は初期設定後は変更できません。変更時はコネクタを再作成します
  • 宛先スキーマは{database}_{schema}を選んだため、SAMPLEDB_PUBLICになります

Tuning

CDC の変更を宛先に反映するタイミングを設定します。

こちらは以下の通りとしました。

  • Merge Task Schedule CRON
    • ジャーナルテーブルの変更を、宛先テーブルへ MERGE するタイミング
    • MERGE のときにウェアハウスが動くため、ウェアハウスのコストはここで発生する
    • 今回の設定:0 * * * * ?(1 分ごと)
  • Concurrent Snapshot Queries
    • 初回スナップショットで、並列にスナップショットするテーブルの最大数
    • 今回の設定:2(既定)

Migration

初回スナップショットの扱いと、CDC に使うレプリケーションスロットを決めます。

  • Ingestion Type
    • full:全量のスナップショットのあと、CDC に切り替える
    • incremental:スナップショットを飛ばして、増分だけ取り込む
    • 今回の設定:full(既定)
  • Replication Slot Name
    • CDC に使うレプリケーションスロット名
    • 空欄ならコネクタが新規に作成
    • 今回の設定:空欄(既定)

最後にサマリを確認して、「Apply」をクリックします。

実行

Apply 後に下図の「Start」でコネクタを起動します。

しばらくすると、データが取り込まれます。宛先のテーブルの件数を確認します。

USE ROLE yasuhara_openflow_admin;
USE WAREHOUSE yasuhara_openflow_wh;

SELECT 'customers' AS table_name, COUNT(*) AS cnt FROM yasuhara_pg_openflow_dest.sampledb_public.customers
UNION ALL
SELECT 'orders', COUNT(*) FROM yasuhara_pg_openflow_dest.sampledb_public.orders;
+------------+--------+                                                         
| TABLE_NAME |    CNT |
|------------+--------|
| customers  |  10000 |
| orders     | 100000 |
+------------+--------+

ソースの PostgreSQL 側と件数が一致しました。

変更が反映されることを確認

PostgreSQL 側で、INSERT・UPDATE・DELETE を実行して、Snowflake に反映されるか確認します。

-- INSERT
INSERT INTO public.customers (customer_id, name, email)
VALUES (10001, 'Customer 10001', 'user10001@example.com'),
       (10002, 'Customer 10002', 'user10002@example.com');
INSERT INTO public.orders (order_id, customer_id, amount, status)
VALUES (100001, 10001, 1234.50, 'pending'),
       (100002, 10002, 99.99,   'pending');

-- UPDATE
UPDATE public.orders    SET status = 'refunded' WHERE order_id = 102;
UPDATE public.orders    SET amount = 9999.00    WHERE order_id = 103;
UPDATE public.customers SET email = 'updated1@example.com' WHERE customer_id = 1;

-- DELETE
DELETE FROM public.orders WHERE order_id = 104;

1分ごとの同期設定としたので、すぐ Snowflake 側で確認すると INSERT と UPDATE はそのまま反映されました。

-- INSERT の反映確認
SELECT 'customers' AS table_name, COUNT(*) AS cnt FROM yasuhara_pg_openflow_dest.sampledb_public.customers
UNION ALL
SELECT 'orders', COUNT(*) FROM yasuhara_pg_openflow_dest.sampledb_public.orders;
+------------+--------+                                                                                                                                                                                 
| TABLE_NAME |    CNT |                                                                                                                                                                                 
|------------+--------|                                                                                                                                                                                 
| customers  |  10002 |                                                                                                                                                                                 
| orders     | 100002 |
+------------+--------+

-- UPDATE の反映確認
SELECT order_id, status, amount FROM yasuhara_pg_openflow_dest.sampledb_public.orders
WHERE order_id IN (102, 103, 104, 100001, 100002) ORDER BY order_id;
+----------+-----------+----------+                                                                                                                                                                     
| ORDER_ID | STATUS    |   AMOUNT |                                                                                                                                                                     
|----------+-----------+----------|                                                                                                                                                                     
|      102 | refunded  | 14713.44 |                                                                                                                                                                     
|      103 | delivered |  9999.00 |                                                                                                                                                                     
|      104 | paid      | 10516.81 |
|   100001 | pending   |  1234.50 |
|   100002 | pending   |    99.99 |
+----------+-----------+----------+

SELECT customer_id, email FROM yasuhara_pg_openflow_dest.sampledb_public.customers
WHERE customer_id IN (1, 10001, 10002) ORDER BY customer_id;
+-------------+-----------------------+                                                                                                                                                                 
| CUSTOMER_ID | EMAIL                 |                                                                                                                                                                 
|-------------+-----------------------|                                                                                                                                                                 
|           1 | updated1@example.com  |                                                                                                                                                                 
|       10001 | user10001@example.com |                                                                                                                                                                 
|       10002 | user10002@example.com |
+-------------+-----------------------+

ソース側の DELETE は、行が物理的に消えず、_SNOWFLAKE_DELETED列がTRUEになる論理削除として反映されます。

SELECT order_id, status, amount, _snowflake_deleted, _snowflake_updated_at
FROM yasuhara_pg_openflow_dest.sampledb_public.orders
WHERE order_id = 104;
+----------+--------+----------+--------------------+-------------------------+                                                                                                                         
| ORDER_ID | STATUS |   AMOUNT | _SNOWFLAKE_DELETED | _SNOWFLAKE_UPDATED_AT   |                                                                                                                         
|----------+--------+----------+--------------------+-------------------------|                                                                                                                         
|      104 | paid   | 10516.81 | True               | 2026-10-11 02:01:00.368 |                                                                                                                         
+----------+--------+----------+--------------------+-------------------------+

構成をファイルでコネクタ設定を変更してみる

初期設定はセットアップウィザードで行いました。この設定内容(config.json)を編集して変更してみます。
例として、MERGE の実行間隔(Merge Task Schedule CRON)を、1 分ごとから 5 分ごとに変更します。

まず、構成ファイル(config.json)の保存場所と書き方を確認します。

  • 保存場所
    • コネクタに紐づくステージの、バージョンごとのディレクトリ(snow://openflow_connector/<DB>.<スキーマ>.<コネクタ>/versions/<バージョン>/config.json)
    • ウィザードで Apply すると、設定がコミット済みのバージョン(version$1)として保存され、編集用のliveバージョンは空になる
    • version$1には、config.jsonと、ウィザードでアップロードした JDBC ドライバー(postgresql-42.7.14.jar)が入っている
  • 書き方
    • configurationの配列に、ウィザードの画面に対応した区分(name。Source、Tuning など)ごとに、propertiesが入っている
    • 値の書き方は、valueTypeで決まる
      • STRING_LITERAL:"value": "文字列"
      • SECRET_REFERENCE:"fullyQualifiedSecretName": "DB.スキーマ.シークレット名"
      • ASSET_REFERENCE:"assetIds": ["postgresql-42.7.14.jar"](アップロードした jar のファイル名)
    • パスワードの値は、config.json に含まれない。シークレットの名前だけが入っている
    • ウィザードの項目名と、config.jsonのキーは、一致しない場合がある(例:ウィザードで選んだ {database}_{schema} は、Destination Schema Strategy の値 DATABASE_AND_SOURCE_SCHEMAとして入っている)
  • 取得と更新
    • 取得はGET、更新はPUTで行える

Sourceの区分は、以下のようになっていました。

{
  "name": "Source",
  "properties": {
    "Source Database Connection URL": { "valueType": "STRING_LITERAL", "value": "jdbc:postgresql://<NLB の DNS 名>:5432/sampledb?sslmode=require" },
    "Source Database Driver": { "valueType": "ASSET_REFERENCE", "assetIds": ["postgresql-42.7.14.jar"] },
    "Source Database User": { "valueType": "STRING_LITERAL", "value": "openflow_repl" },
    "Source Database Password": { "valueType": "SECRET_REFERENCE", "fullyQualifiedSecretName": "YASUHARA_OPENFLOW_DB.OPENFLOW_SCHEMA.PG_PASSWORD" },
    "Source Database Publication Name": { "valueType": "STRING_LITERAL", "value": "snowflake_pub" }
  }
}

公式ドキュメントでは設定変更は以下の流れとされているので、こちらに沿って進めてみます。

  1. default のバージョンから、編集用のliveバージョンを作成
  2. liveのconfig.jsonを取得して編集
  3. 編集したファイルをliveに戻す
  4. COMMITして新しい default のバージョンにする

https://docs.snowflake.com/en/user-guide/data-integration/openflow/gen2/connector-versioning

コネクタを停止

ここでは、コネクタを停止してから作業を行いました。Gen2 ではコネクタの管理も SQL から可能です。

-- コネクタを停止する
ALTER OPENFLOW CONNECTOR yasuhara_openflow_db.openflow_schema.my_postgres_connector STOP;
-- 確認
SELECT SYSTEM$WAIT_FOR_STABLE_OPENFLOW_CONNECTORS(600, 'yasuhara_openflow_db.openflow_schema.my_postgres_connector');
+---------------------------------------------------------------------------------------------------------------+                                                                                            
| SYSTEM$WAIT_FOR_STABLE_OPENFLOW_CONNECTORS(600, 'YASUHARA_OPENFLOW_DB.OPENFLOW_SCHEMA.MY_POSTGRES_CONNECTOR') |                                                                                            
|---------------------------------------------------------------------------------------------------------------|                                                                                            
| OK                                                                                                            |                                                                                            
+---------------------------------------------------------------------------------------------------------------+ 

Gen 2 のSTOPやCOMMIT、STARTは非同期で実行されます。SYSTEM$WAIT_FOR_STABLE_OPENFLOW_CONNECTORS関数は、状態が落ち着くまで待ち、成功すればOKを返します。タイムアウトや失敗ではエラーになります。

今回は試していませんが、CI/CD などの自動化時にも利用できます。

live バージョンの作成と取得

コミット済みのバージョン(version$1など)は、あとから書き換えられず、設定を変更するには現在の default をコピーして編集用のliveバージョンを作成します。

ALTER OPENFLOW CONNECTOR yasuhara_openflow_db.openflow_schema.my_postgres_connector ADD LIVE VERSION FROM LAST;
+------------------------------------+                                                                                                                                                                           
| status                             |                                                                                                                                                                           
|------------------------------------|                                                                                                                                                                           
| Live version successfully created. |                                                                                                                                                                           
+------------------------------------+ 

作成したliveバージョンのconfig.jsonを、ローカルに取得して編集します。

snow sql -c <接続名> -q "GET 'snow://openflow_connector/yasuhara_openflow_db.openflow_schema.my_postgres_connector/versions/live/config.json' 'file://<ローカルのディレクトリ>/';"

config.json の編集

現在のロード頻度はTuningのMerge Task Schedule CRONでした。

変更前の config.json の一部
{
  "name": "Tuning",
  "properties": {
    "Concurrent Snapshot Queries": { "valueType": "STRING_LITERAL", "value": "2" },
    "Enable Advanced Configuration": { "valueType": "STRING_LITERAL", "value": "false" },
    "Merge Task Schedule CRON": { "valueType": "STRING_LITERAL", "value": "0 * * * * ?" }
  }
}

この値を以下の通り0 0/5 * * * ?(毎時 0 分から 5 分おき)に書き換えます。

{
  "name": "Tuning",
  "properties": {
    "Concurrent Snapshot Queries": { "valueType": "STRING_LITERAL", "value": "2" },
    "Enable Advanced Configuration": { "valueType": "STRING_LITERAL", "value": "false" },
    "Merge Task Schedule CRON": { "valueType": "STRING_LITERAL", "value": "0 0/5 * * * ?" }
  }
}

live への戻しと COMMIT

編集したファイルを、liveに PUT します。

snow sql -c <接続名> -q "PUT 'file://<ローカルのディレクトリ>/config.json' 'snow://openflow_connector/yasuhara_openflow_db.openflow_schema.my_postgres_connector/versions/live/' AUTO_COMPRESS = FALSE OVERWRITE = TRUE;"

PUT 後はCOMMITでliveを新しい default のバージョンにします。COMMITすると、liveが新しい default になり、liveは削除されます。

ALTER OPENFLOW CONNECTOR yasuhara_openflow_db.openflow_schema.my_postgres_connector COMMIT;
+--------------------------------------+                                                                                                                                                                     
| status                               |                                                                                                                                                                     
|--------------------------------------|                                                                                                                                                                     
| Live version successfully committed. |                                                                                                                                                                     
+--------------------------------------+  

SELECT SYSTEM$WAIT_FOR_STABLE_OPENFLOW_CONNECTORS(600, 'yasuhara_openflow_db.openflow_schema.my_postgres_connector');
+---------------------------------------------------------------------------------------------------------------+                                                                                            
| SYSTEM$WAIT_FOR_STABLE_OPENFLOW_CONNECTORS(600, 'YASUHARA_OPENFLOW_DB.OPENFLOW_SCHEMA.MY_POSTGRES_CONNECTOR') 
|                                                                                            
|---------------------------------------------------------------------------------------------------------------|                                                                                            
| OK                                                                                                            |                                                                                            
+---------------------------------------------------------------------------------------------------------------+ 

COMMIT後は新しいバージョンとして VERSION$2 が追加され、default(is_default が true)になっていました。

-- default が version$2 になり、live が消えている
SHOW VERSIONS IN OPENFLOW CONNECTOR yasuhara_openflow_db.openflow_schema.my_postgres_connector;
+-------------------------------+-----------+-------+----------------------------------------------------------------------------------------------------------+------------+---------+----------+---------+---------+---------------------+-----------------+                                                                                                                                                            
| created_on                    | name      | alias | location_uri                                                                                             | is_default | is_live | is_first | is_last | comment | source_location_uri | git_commit_hash |                                                                                                                                                            
|-------------------------------+-----------+-------+----------------------------------------------------------------------------------------------------------+------------+---------+----------+---------+---------+---------------------+-----------------|                                                                                                                                                            
| 2026-10-16 11:29:23.558 +0900 | VERSION$2 | NULL  | snow://openflow_connector/YASUHARA_OPENFLOW_DB.OPENFLOW_SCHEMA.MY_POSTGRES_CONNECTOR/versions/version$2/ | true       | false   | false    | true    | NULL    | NULL                | NULL            |
| 2026-10-11 10:25:12.999 +0900 | VERSION$1 | NULL  | snow://openflow_connector/YASUHARA_OPENFLOW_DB.OPENFLOW_SCHEMA.MY_POSTGRES_CONNECTOR/versions/version$1/ | false      | false   | true     | false   | NULL    | NULL                | NULL            |
+-------------------------------+-----------+-------+----------------------------------------------------------------------------------------------------------+------------+---------+----------+---------+---------+---------------------+-----------------+

確認ができたので、コネクタを起動します。

ALTER OPENFLOW CONNECTOR yasuhara_openflow_db.openflow_schema.my_postgres_connector START;
SELECT SYSTEM$WAIT_FOR_STABLE_OPENFLOW_CONNECTORS(600, 'yasuhara_openflow_db.openflow_schema.my_postgres_connector');

反映の確認

PostgreSQL で、注文 102 の金額を、1 分ごとに更新し続けます。

UPDATE public.orders SET amount = amount + 1 WHERE order_id = 102;
\watch 60

しばらくした後、ウェアハウス側の MERGE 履歴を確認すると、5 分ごとに実行されていました。

-- 宛先テーブル:_SNOWFLAKE_UPDATED_AT も、MERGE の開始時刻と同じ時刻
>SELECT order_id, amount, _SNOWFLAKE_UPDATED_AT                                                                                                          
FROM YASUHARA_PG_OPENFLOW_DEST.SAMPLEDB_PUBLIC.ORDERS                                                                                                   
WHERE order_id = 102;                                                                                                                                                                                                                                                                                                                                                
+----------+----------+-------------------------+                                                                                                                                                            
| ORDER_ID |   AMOUNT | _SNOWFLAKE_UPDATED_AT   |                                                                                                                                                            
|----------+----------+-------------------------|                                                                                                                                                            
|      102 | 14717.44 | 2026-10-16 05:10:01.389 |                                                                                                                                                            
+----------+----------+-------------------------+

>SELECT order_id, amount, _SNOWFLAKE_UPDATED_AT                                                                                                          
FROM YASUHARA_PG_OPENFLOW_DEST.SAMPLEDB_PUBLIC.ORDERS                                                                                                   
WHERE order_id = 102;                                                                                                                                   

+----------+----------+-------------------------+                                                                                                                                                            
| ORDER_ID |   AMOUNT | _SNOWFLAKE_UPDATED_AT   |                                                                                                                                                            
|----------+----------+-------------------------|                                                                                                                                                            
|      102 | 14722.44 | 2026-10-16 05:15:01.055 |                                                                                                                                                            
+----------+----------+-------------------------+

>SELECT order_id, amount, _SNOWFLAKE_UPDATED_AT                                                                                                          
FROM YASUHARA_PG_OPENFLOW_DEST.SAMPLEDB_PUBLIC.ORDERS                                                                                                   
WHERE order_id = 102;                                                                                                                                   

+----------+----------+-------------------------+                                                                                                                                                            
| ORDER_ID |   AMOUNT | _SNOWFLAKE_UPDATED_AT   |                                                                                                                                                            
|----------+----------+-------------------------|                                                                                                                                                            
|      102 | 14727.44 | 2026-10-16 05:20:00.341 |                                                                                                                                                            
+----------+----------+-------------------------+

-- マージの実行履歴
> SELECT START_TIME, EXECUTION_STATUS, TOTAL_ELAPSED_TIME                                                                                                
FROM TABLE(snowflake.information_schema.query_history_by_warehouse(                                                                                   
  WAREHOUSE_NAME=>'YASUHARA_OPENFLOW_WH',                                                                                                             
  END_TIME_RANGE_START=>DATEADD(minute,-30,CURRENT_TIMESTAMP()), RESULT_LIMIT=>500))                                                                  
WHERE QUERY_TYPE='MERGE' ORDER BY START_TIME;                                                                                                         
+-------------------------------+------------------+--------------------+                                                                                                                                    
| START_TIME                    | EXECUTION_STATUS | TOTAL_ELAPSED_TIME |                                                                                                                                    
|-------------------------------+------------------+--------------------|                                                                                                                                    
| 2026-10-16 14:10:01.389 +0900 | SUCCESS          |               2927 |
| 2026-10-16 14:15:01.055 +0900 | SUCCESS          |               3655 |
| 2026-10-16 14:20:00.341 +0900 | SUCCESS          |               3217 |
+-------------------------------+------------------+--------------------+

さいごに

Gen 2 の Snowflake Deployment 上で PostgreSQL の CDC を SQL とセットアップウィザードで構築しconfig.jsonを編集して設定を変更するところまで試しました。Git 連携も試せればと思いました。
こちらの内容が何かの参考になれば幸いです。


Snowflakeの導入支援はクラスメソッドに!

クラスメソッドでは Snowflake の導入を支援しております。
製品の詳細や支援の内容についてお気軽にお問い合わせください。

Snowflakeの詳細を見る

この記事をシェアする

関連記事