Fivetran の Hybrid Deployment モデルが利用できるようになりました #Fivetran
はじめに
2024年6月に Fivetran の展開モデルの一つである Hybrid Deployment model のベータ版がリリースされました。
これによりクラウドサービスとしての Fivetran の機能を活用しつつ組織内のネットワークにデータを保持しながらデータ処理を行うことが可能となります。こちらの機能を試してみましたので記事としました。
Hybrid Deployment の概要
Fivetran のアーキテクチャ
前提として Fivetran の主な提供形態は SaaS ですが、展開モデルとして以下をサポートしています。
- SaaS Deployment
- データ処理を Fivetran 管理のクラウド内で実施
- Hybrid Deployment
- 執筆時点でベータ版
- Fivetran とアウトバウンド通信を行う Local Processing Agent を自身が管理するネットワーク内に構築する
- Self-Hosted Deployment
- セルフホスト型のモデル
- Fivetran HVR ソリューションを使用。HVR の構成要素である Hub System をオンプレミスを含む顧客管理のネットワークに構築することで、独自のサーバーで Fivetran が提供する機能を実行するため、データを外部ネットワークに移動せずに済む
- 最もセキュリティ要件が厳しい場合に候補となる
本記事では Hybrid Deployment について扱います。
Hybrid Deployment
Hybrid Deployment の概要は以下に記載があります。
本モデルの特徴は以下です。
- 前提条件
- データ処理のロケーション
- 顧客管理のネットワークに Local Processing Agent をインストールしデータ処理を行うためデータが顧客管理のネットワークに保持される
- Local Processing Agent
- ダッシュボードの利用
- データ処理自体は Local Processing Agent で実施されますが、その設定や同期スケジュールの管理等は SaaS 版と同じダッシュボード上で管理されます
公式ドキュメントからの引用ですが、下図のような構成です。
詳細は上記のドキュメンと以下の FAQ をご覧ください。
サポートするコネクタと Destination
以下に記載があります。すべてのコネクタや Destination で使用できるわけではないためご注意ください。
各コネクタや Destination が Hybrid Deployment モデルをサポートするかは、Hybrid Deployment アイコンの有無で識別できます。
Hybrid Deployment のセットアップ
ハイブリッド展開モデルではコンテナ管理ツールを使用します。ここでは Docker を前提に進めます。
要件
- CPU: x86-64 プロセッサを搭載した最低 4 個の vCPU
- メモリ:最低 10 GB の RAM
- ストレージ
- Dockerストレージ(デフォルト:
/var/lib/docker
)に最低 50 GB のディスク領域- Destination が PostgreSQL の場合:Docker ストレージのサイズは、コネクタあたりのデータ量と同じにすることが推奨されています
- Destination が Snowflake の場合:Docker ストレージのサイズは、コネクタあたりのデータ量の少なくとも30%とすることが推奨されています
- 永続的なローカルストレージ(通常は
$HOME/fivetran/data
)に最低 50 GB のディスク領域- Destination が PostgreSQL の場合:永続的なローカルストレージのサイズは、コネクタあたりのデータ量と同じにすることが推奨されています
- Destination が Snowflake の場合:永続的なローカルストレージのサイズは、コネクタあたりのデータ量の少なくとも30%とすることが推奨されています
- Dockerストレージ(デフォルト:
- OS
- Docker Engine を使用して Docker コンテナを実行できる Linux ディストリビューション
- Ubuntu, CentOS, Rocky Linux, SUSE Linux, Oracle Linux, Red Hat Enterprise Linux など
- Docker Engine を使用して Docker コンテナを実行できる Linux ディストリビューション
- Docker Engine:v20.10.17 以上、最新の使用が推奨されています
- Docker Compose:v2.17.x 以上
Prerequisites | Hybrid Deployment with Docker
検証環境
ここでは以下の環境を使用しました。
- データソース
- Amazon RDS PostgreSQL:16.3-R2
- プライベートサブネットに構築
- Destination:Snowflake
- Local Processing Agent サーバー
- OS:Amazon Linux 2023
- インスタンスタイプ:t2.xlarge(4 vCPU, RAM 16 GB)
- ストレージ
- ルートボリューム:8 GB
- Dockerストレージ:50 GB
- 永続的なローカルストレージ:50 GB
- パブリックサブネットに構築
上述の通り Local Processing Agent サーバーはアウトバウンド通信のみを行うためセキュリティグループは以下の設定としています。
- Local Processing Agent サーバー
ポート範囲 | タイプ | ソース |
---|---|---|
22 | SSH | MYIP |
- Amazon RDS PostgreSQL
ポート範囲 | タイプ | ソース |
---|---|---|
5432 | PostgreSQL | Local Processing Agent サーバーのセキュリティグループ |
Local Processing Agent サーバーでの作業
ユーザー追加
エージェントをホストするマシン(EC2)にログインし、ユーザーグループを追加します。
sudo groupadd fivetran-agent
sudo useradd -g fivetran-agent -m fivetran-user
上記のユーザーで SSH 接続できるようにした後、ここでは sudo 操作を行えるようにしました。
fivetran-user でログイン後、以降の操作を行います。
ディレクトリの作成
エージェントサーバーの構成に必要な以下のディレクトリを作成します。
- Base folder:
$HOME/<base_folder_name>
- Logs folder:
$HOME/<base_folder_name>/logs
- Temporary files folder:
$HOME/<base_folder_name>/data
以下のコマンドを使用しました。
mkdir -p $HOME/fivetran
mkdir -p $HOME/fivetran/logs
mkdir -p $HOME/fivetran/data
追加ボリュームのマウント
エージェント用の Docker ストレージ、永続的なローカルストレージ用に追加のボリュームをマウントします。手順は以下を参照しながら進めました。
ファイルシステムを作成
sudo mkfs -t xfs /dev/xvdb
sudo mkfs -t xfs /dev/xvdc
ボリュームのマウントポイントの作成とマウント
# Dockerストレージ用
sudo mkdir -p /var/lib/docker
sudo mount /dev/xvdb /var/lib/docker
# fivetranデータ用
sudo mount /dev/xvdc $HOME/fivetran/data
再起動後も永続的にボリュームがマウントされるように/etc/fstab
ファイルを編集します。
以下のコマンドで/etc/fstab
に書き込むための UUID を確認します。
$ sudo blkid
/dev/xvdc: UUID="0b982e14-b75e-4e2c-b739-095f685b7d49" BLOCK_SIZE="512" TYPE="xfs"
/dev/xvda128: SEC_TYPE="msdos" UUID="BE57-6C57" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6b694ec3-d67c-4c3b-9664-a83d1eefbd79"
/dev/xvda127: PARTLABEL="BIOS Boot Partition" PARTUUID="9f7b6a52-1021-4b79-a729-a233bf73c6fd"
/dev/xvda1: LABEL="/" UUID="36d29e5b-3776-49ee-a4d6-5868c3a57848" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="Linux" PARTUUID="21e74c4d-5838-4063-9c14-b0a33c40672f"
/dev/xvdb: UUID="76be3145-941d-4ac6-8881-f63694d0bf66" BLOCK_SIZE="512" TYPE="xfs"
/etc/fstab
を開いて追加ボリュームの情報を追記
sudo vi /etc/fstab
以下の内容で追記しました。
UUID=76be3145-941d-4ac6-8881-f63694d0bf66 /var/lib/docker xfs defaults,nofail 0 2
UUID=0b982e14-b75e-4e2c-b739-095f685b7d49 /home/fivetran-user/fivetran/data xfs defaults,nofail 0 2
マウントの確認
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
xvda 202:0 0 8G 0 disk
├─xvda1 202:1 0 8G 0 part /
├─xvda127 259:0 0 1M 0 part
└─xvda128 259:1 0 10M 0 part /boot/efi
xvdb 202:16 0 50G 0 disk /var/lib/docker
xvdc 202:32 0 50G 0 disk /home/fivetran-user/fivetran/data
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs 3.2G 468K 3.2G 1% /run
/dev/xvda1 8.0G 1.6G 6.5G 20% /
tmpfs 7.9G 0 7.9G 0% /tmp
/dev/xvda128 10M 1.3M 8.7M 13% /boot/efi
tmpfs 1.6G 0 1.6G 0% /run/user/1000
/dev/xvdb 50G 389M 50G 1% /var/lib/docker
/dev/xvdc 50G 389M 50G 1% /home/ec2-user/fivetran/data
インスタンスの再起動後も確認し問題なければ以降の手順に進みます。
Docker と Docker Compose のインストール
以下の手順で Docker と Docker Compose をインストールしました。
sudo dnf update
# dockerのインストール
sudo dnf install -y docker
# dockerの開始
sudo systemctl start docker
# システムの起動時に Docker も自動的に起動するように設定
sudo systemctl enable docker
# sudoなしでdockerを実行できるようにする
sudo usermod -aG docker $USER
# dockerのソケットファイルの所有グループをdockerに変更
sudo chgrp docker /var/run/docker.sock
# dockerデーモンを再起動
sudo service docker restart
# docker compose をインストール
sudo curl -L "https://github.com/docker/compose/releases/download/v2.28.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Docker Compose のインストール | Docker docs
バージョン確認
$ docker -v
Docker version 25.0.3, build 4debf41
$ docker-compose -v
Docker Compose version v2.28.1
$ sudo docker info | grep 'Docker Root Dir'
Docker Root Dir: /var/lib/docker
Destination の作成
S3 バケットの用意
Hybrid Deployment で宛先として Snowflake を使用する場合は、S3 等の外部ステージをユーザー側で用意する必要があります。
ここではストレージサービスとして Amazon S3 を使用します。S3 へのアクセスは、現時点では IAM アクセスキーによる方法がサポートされています。そのため以下の IAM ポリシー作成し、専用の IAM ユーザーにポリシーを直接アタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:DeleteObjectTagging",
"s3:ReplicateObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:DeleteObjectVersion",
"s3:ListBucket",
"s3:PutObjectTagging",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::{your-bucket-name}/*",
"arn:aws:s3:::{your-bucket-name}"
]
}
]
}
ユーザーを作成したら、アクセスキーを発行し安全な場所に保管しておきます。
Destination の設定
Destination の設定は Fivetran のダッシュボードから行います。Destination として Snowflake を指定します。
設定項目に以下が追加されているのでトグルをオンにします。
トグルをONにすると下図のようになります。
すでに Local Processing Agent サーバーを構築し登録している場合は、ここから任意の Agent を選択することができます。
ここでは新規のエージェントを登録します。[+ Configure new local processing agent] をクリックすると規約への同意を求められるので、問題なければチェックを入れ [Next] をクリックします。
設定ファイル(config.json
)と yml ファイル(docker-compose.yml
)をダウンロードできるのでダウンロードし次に進みます。
エージェントの名前を入力します。
認証ファイルが生成されるのでダウンロードし、次に進みます。
下図の表示になるのでエージェントサーバーにログインし操作を行います。
ダウンロードした各種ファイルをサーバー側に転送します。専用のユーザー(ここではfivetran-user
)でログインし各ファイルを Base folder($HOME/<base_folder_name>
)に配置します。
config.json のパスを変更
ファイルを配置したらconfig.json
を開きhost_persistent_storage_mount_path
の値を上述の手順で作成した Temporary files folder($HOME/<base_folder_name>/data
)に置き換えます。
{
"host_docker_sock_file_path":"unix:///var/run/docker.sock",
"host_persistent_storage_mount_path":"~/fivetran/data",
"host_selinux_enabled":false
}
auth.json から Controller ID を確認
次にauth.json
を開きcontroller_id
の値を控えておきます。
{
"account_id":"<account_id>",
"controller_id":"<controller id>",
"display_name":"snowflake-test-agent",
"master_token":"",
"client_private_key":"-----BEGIN RSA PRIVATE KEY-----XXXX----END CERTIFICATE-----\n"
}
docker-compose.yml の編集
さいごにdocker-compose.yml
を開きldp_controller_id
の値をcontroller_id
で置き換えます。
services:
controller:
container_name: controller
image: us-docker.pkg.dev/prod-eng-fivetran-ldp/public-docker-us/ldp-agent:production
pull_policy: always
restart: "no"
labels:
fivetran: ldp
ldp_process_id: default-controller-process-id
ldp_controller_id: <controller-id>
エージェントの開始
Docker Compose コマンドを実行します。
docker-compose -f docker-compose.yml up -d
エージェントを開始したら下図にチェックを入れこの設定を完了します。
ストレージの設定
Snowflake を Destination とし Hybrid Deployment オプションを選択するとストレージの設定項目が追加表示されるので、下図の項目を入力し接続テストを行います。
その他の項目は通常の方法と変わりありません。
コネクタの作成
事前準備
ここではデータソースとして Amazon RDS PostgreSQL を使用します。事前に以下のコマンドでサンプルデータと Fivetran で使用する読み取り専用ユーザーを作成しておきます。
--データベースの作成
CREATE DATABASE sampledb;
--テーブル作成
\c sampledb;
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
--レコードの追加
INSERT INTO users (id, name, email) VALUES (1,'John Doe', '[email protected]');
INSERT INTO users (id, name, email) VALUES (2,'Jane Smith', '[email protected]');
INSERT INTO users (id, name, email) VALUES (3,'Mike Brown', '[email protected]');
--Fivetran 用の読み取り専用ユーザーを作成
CREATE USER fivetran_user WITH PASSWORD '<パスワード>';
--権限を付与
GRANT pg_read_all_data TO fivetran_user;
コネクタの設定
コネクタの作成から対象のコネクタを選択します。
注意点として、Hybrid Deployment モデルを使用する Destination を使用する場合、コネクタ側も Hybrid Deployment モデルに対応するコネクタしか使用できません。
※Hybrid Deployment 未対応のコネクタを指定した際の Destination の選択画面
コネクタ側にも Hybrid Deployment に関する設定項目が追加されているので作成済みのエージェントを指定します。
その他の設定は通常と変わりません。
同期されたデータの確認
設定完了後、初期同期を行います。
同期後、Snowflake 側でテーブルの追加を確認できます。
レコードの追加・削除
データソース側でレコード変更し再度同期を行います。
--レコードの追加
INSERT INTO users (id, name, email) VALUES (4, 'Jane Smith', '[email protected]');
--レコードの削除
DELETE FROM users WHERE id IN (2);
同期後 Snowflake 側に変更が反映していることを確認できました。
エージェントの確認
Destinationの設定後「Account Settings > General > Local Processing Agent」より確認可能です。
さいごに
ベータ版となった Fivetran の Hybrid Deploymnet モデルを試してみました。
データを自身の管理するネットワークに保持できる点や Local Processing Agent はアウトバウンド通信のみを行うためデータ処理用に Fivetran SaaS 用に追加のポートを開く必要がない点はセキュリティを重視する組織では嬉しい点かと思います。
こちらの内容が何かの参考になれば幸いです。