Powered by Fivetran を使用して認証情報を共有することなくデータソースに接続する #Fivetran

2024.06.06

はじめに

Fivetran では顧客のデータを集約する際に、エンドユーザー側で認証情報を独自で設定可能な Powered by Fivetran という機能を提供しています。こちらの機能を試してみましたので記事としました。

Powered by Fivetran の概要

Fivetran は ELT ベースのデータパイプラインツールとして、データソースに接続する際に、データソースごとの認証情報の入力・保持が必要です。
この際、Enterprise 以上のプランであれば自社以外の顧客などの外部組織が管理するデータソースを自社が管理する DWH に連携することも可能です。
FIVETRAN PRICING

しかし、データソースへの認証が必要なのでユーザー名やパスワードの受け渡しが必要になる場合があります。自社内のデータソースであっても、Fivetran の管理者に各データソースの認証情報を直接渡すことはセキュリティ上のリスクになり得ます。

こういった場合に、Powered by Fivetran(PBF) としてデータソースの管理者が独自で認証を可能な機能が提供されています。これにより自社の運営するプラットフォーム上で、Fivetran の機能を使用するデータ パイプラインを構築できるようになります。

この機能は、Fivetran Connect Cards を使用するかどうかで、さらに以下にわかれます。

ここでは、Connect Cards を使用する PBF Embedded によるデータソースへの認証を行います。
公式ドキュメントからの引用ですが、下図のようなイメージです。

事前準備

API キーの取得

はじめに、以下に記載の手順で API キーを取得し、利用できるようにしておきます。

Destination

Destination には Snowflake を使用します。設定手順は以下をご参照ください。

データソース

データソースには RDS for SQL Server を使用しました。
以下に記載の手順でサンプルデータと Fivetran からのアクセスに使用する読み取り専用ユーザーを作成済みとしています。

手順

以下に記載があるので、こちらに沿って進めます。

グループIDを取得

はじめに Destination のグループIDを取得します。こちらは GUI と API それぞれから取得可能です。

  • GUI

Destination の一覧から確認したい Destination を選択し [Overview] タブから確認可能です。

  • API

以下のコマンドで確認可能です。

curl -X GET https://api.fivetran.com/v1/groups \
-H "Content-Type: application/json" \
-H "Authorization: Basic $AUTH_HEADER" | jq

レスポンスの一部

{
  "code": "Success",
  "data": {
    "items": [
      {
        "id": "thicket_confronted",
        "name": "Snowflake_yasuhara_test",
        "created_at": "2023-10-06T07:06:59.289141Z"
      },
      {
        "id": "XXXX",
        "name": "XXXX",
        "created_at": "XXXX"
      }
    ]
  }
}

コネクタと CONNECTED CARD を作成

Powered by Fivetran を使用する場合、API を使用してコネクタを作成する必要があります。
コネクタの作成には以下のエンドポイントを使用します。
Connector Management with Fivetran REST API

また、データソースごとにconfigフィールドの設定内容が異なるため、コネクタごとの設定手順を参照します。SQLServer については、以下に記載があります。
Connector Management API - Config Details

ドキュメントを参考に、ここでは以下のコマンドを使用しました。

curl -X POST https://api.fivetran.com/v1/connectors \
-H "Content-Type: application/json" \
-H "Authorization: Basic $AUTH_HEADER" \
-d '{
    "service": "sql_server_rds",
    "group_id": "thicket_confronted",
    "trust_certificates": true,
    "trust_fingerprints": "true",
    "run_setup_tests": false,
    "paused": true,
    "networking_method": "Directly",
    "config": {
        "schema_prefix": "test_sql",
        "host": "XXXXX.rds.amazonaws.com",
        "port": 1433,
        "database": "testdb",
        "update_method": "TELEPORT"
    },
    "connect_card_config": {
      "redirect_uri": "https://www.fivetran.com"
    }
}' | jq

ポイントとしてconnect_card_config セクションを使用することで、レスポンスから connect_card.uri を取得できます。ここで指定するredirect_uri は後述する手順で、ユーザーが認証情報を入力後に自動的にリダイレクトされる URL です。
また、この時点では認証情報を使用せずコネクタが作成されるためrun_setup_tests は false に設定することが推奨されています。(デフォルトは true)

レスポンス

{
  "code": "Success",
  "message": "Connector has been created",
  "data": {
    "id": "lasso_museum",
    "group_id": "thicket_confronted",
    "service": "sql_server_rds",
    "service_version": 2,
    "schema": "test_sql",
    "connected_by": "known_rheumatic",
    "created_at": "2024-06-06T07:04:44.130324Z",
    "succeeded_at": null,
    "failed_at": null,
    "paused": true,
    "pause_after_trial": false,
    "sync_frequency": 360,
    "data_delay_threshold": 0,
    "data_delay_sensitivity": "NORMAL",
    "private_link_id": null,
    "networking_method": "Directly",
    "proxy_agent_id": null,
    "schedule_type": "auto",
    "status": {
      "setup_state": "incomplete",
      "sync_state": "paused",
      "update_state": "on_schedule",
      "is_historical_sync": true,
      "tasks": [],
      "warnings": []
    },
    "config": {
      "public_key": "ssh-rsa XXXXX",
      "database": "test",
      "connection_type": "Directly",
      "port": 1433,
      "update_method": "TELEPORT",
      "host": "XXXXX.rds.amazonaws.com",
      "always_encrypted": true
    },
    "connect_card": {
      "token": "XXXXX",
      "uri": "https://fivetran.com/connect-card/setup?redirect_uri=https://www.fivetran.com&auth=XXXXXXXX"
    },
    "connect_card_config": {
      "redirect_uri": "https://www.fivetran.com"
    }
  }
}

この時点で、ダッシュボードを確認すると下図のようにコネクタが作成されています。

設定内容を確認すると認証情報を設定していないので、パスワードなどが空欄となっています。

エンドユーザーを Connect Card URI にリダイレクト

上記のレスポンスから得られた URI を認証情報を保持するエンドユーザーに渡します。

  "connect_card": {
      "token": "XXXXX",
      "uri": "https://fivetran.com/connect-card/setup?redirect_uri=https://www.fivetran.com&auth=XXXXXXX"
    },

エンドユーザーが自身のブラウザから URL にアクセスすると下図のような表示となります。

[Continue] をクリックすると下図の表示になるので、エンドユーザー側で自身が持つ認証情報を入力するなど、一般的にコネクタセットアップ時に実行する手順を実施します。

ここでは、Fivetran で使用する指定のテーブルに対する読み取り権限を持つユーザーのユーザー名・パスワードを入力し画面下の [Save & Test] をクリックします。
すると接続テストが行われるので、エラーが出れば対応します。問題なければ下図の表示となります。

テスト完了後、しばらくすると自動的にリダイレクト先に遷移します。

ダッシュボードで確認

エンドユーザー側の作業後、Fivetran の管理者側で Fivetran ダッシュボードを確認すると認証情報が更新されています。実際にこちらからパスワードを確認することはできません。

スキーマタブでは、指定のユーザーでアクセス可能なテーブルが表示されます。

同期も開始できる段階になっています。

同期後、Destination にテーブルが追加されます。

さいごに

Powered by Fivetran によるデータ連携を試してみました。
これにより、データ連携部分は Fivetran の機能を使用しつつ、顧客データを集約・分析可能とするプラットフォームをセキュアに構築できます。
社内であっても、規模が大きく認証情報管理の要件が厳しい場合に直接認証情報を共有せずに利用できるオプションなので、必要に応じて使用していただければと思います。
こちらの内容が何かの参考になれば幸いです。