サイロ化したBigQueryをAnalyticsHubにより統合するアーキテクチャの検討時のメモ

## 概要

Google Cloud 上でサイロ化（乱立）している BigQuery データを統合するためのアーキ
テクチャ案として、Analytics Hub の活用方法を下記の資料にて公開しました。この記事では下記資料を作成する際のメモを共有します。

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/ZL11J9/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/manabian/ZL11J9-2024-09-04-134351">サイロ化したBigQueryをAnalyticsHubにより統合する構成案 by @manabian</a></div>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b76019d4-bfee-88f6-4c8d-4038a4519a09.png)

## Analytics Hub について

### Analytics Hub とは

Analytics Hub とは、 BigQuery のデータセットと Pub/Sub を効率よく安全に共有するサービスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3b7732ec-70ae-6ae7-d67e-2b29215b3834.png)

引用元：[Analytics Hub | データ交換とデータ共有 | Google Cloud](https://cloud.google.com/analytics-hub?hl=ja)

### Analytics Hub の料金

料金については下記のように記載されており、Analytics Hub にはコストがかからないようです。

> データ エクスチェンジやリスティングの管理に追加料金はかかりません。

引用元：[Analytics Hub の概要  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/analytics-hub-introduction?hl=ja#pricing)

BigQuery のコストとしては、パブリッシャーが BigQuery のデータセットのストレージコストを負担し、BigQuery のコンピューティングコストはサブスクライバーが負担することとなるようです。

> BigQuery データセットの場合、Analytics Hub パブリッシャーは、データ ストレージに対して課金されます。

> 一方、サブスクライバーは、オンデマンド料金モデルまたは容量ベースの料金モデルに基づいて、共有データに対して実行されるクエリの料金を負担します。

引用元：[Analytics Hub の概要  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/analytics-hub-introduction?hl=ja#pricing)

### ネットワークについて

Analytics Hub を VPC Service Controls 上で管理できるようです。

> VPC Service Controls の境界が設定されているプロジェクトのデータにパブリッシャーとサブスクライバーがアクセスするために必要な必要な上り（内向き）ルールと下り（外向き）ルールを設定できます。詳細については、Analytics Hub の VPC Service Controls のルールをご覧ください。

引用元：[Analytics Hub の概要  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/analytics-hub-introduction?hl=ja#pricing)

パターン別に設計指針が下記のドキュメントにて紹介されいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/40b59fbf-8433-1a6f-cb02-09c0399a2f61.png)

引用元：[Analytics Hub VPC Service Controls のルール  | BigQuery  | Google Cloud](https://cloud.google.com/bigquery/docs/analytics-hub-vpc-sc-rules?hl=ja)

### ベストプラクティス

[Best Practices for Data Sharing On Analytics Hub | by Thakurswati | Google Cloud - Community | Medium](https://medium.com/google-cloud/best-practices-of-data-sharing-on-analytics-hub-378d42719045) という記事にて下記のベストプラクティスが紹介されていました。

1. 認可されたデータセット内でビューを共有: ビューの基となるデータセットにアクセスできるように、データセットを認可する。
1. BigLakeテーブルとして外部テーブルを共有: 外部ストレージのアクセス権限を別途付与せずに、外部テーブルを共有する。
1. カラムレベルのフィルタリング: ポリシータグを使って、機密カラムの共有を制限する。
1. 行レベルのフィルタリング: 行レベルのアクセスポリシーを適用して、特定のレコードの共有を制限する。

## アーキテクチャの簡易的な実証検証

### 実装するアーキテクチャの全体象

下記のような構成にてAnalytics Hub による Big Query 統合アーキテクチャの実装検証を実施。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6f2d9a1f-6818-c939-9e84-b3ad231bf6ff.png)

### 検証手順とその結果

#### 1. Publisher layer にてデータセットとテーブルを作成

データセットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f095ad4a-473f-31cf-659e-40f8982da275.png)

テーブルを作成しデータを挿入します。

```sql
CREATE TABLE sample_ds_01.sample_01 (
  int_col int,
  string_col STRING,
  date_col date
);

TRUNCATE TABLE sample_ds_01.sample_01;
INSERT INTO sample_ds_01.sample_01
(
  int_col,
  string_col,
  date_col
)
SELECT 1, 'aaa', CAST('2024-01-01' AS date)
UNION ALL
SELECT 2, 'bbb', CAST('2024-02-02' AS date)
UNION ALL
SELECT 3, 'ccc', CAST('2024-03-03' AS date)
;

SELECT * FROM sample_ds_01.sample_01;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/719468e3-93c3-be71-2139-1c5ab74c3a65.png)

#### 2. Hub Layer にて Publsher Layer から共有を受けるエクスチェンジとリストを作成

Analytics Hub にてエクスチェンジを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6662182e-8d28-901c-48ed-6285a2e0de77.png)

Analytics Hub にて作成したエクスチェンジにリストを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6741759d-9567-e4d3-2e80-120353feee24.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/48df9ca0-9b58-263f-78ae-c66e22778fb4.png)

#### 3. Hub Layer にて Publsher Layer から共有されたテーブルを保持するデータセットを作成

Analytics Hub にて作成済みのリストにて`+ SUBSCRIVE`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d893dd2e-90c3-9171-6a74-a829c7dbcf06.png)

リンクデータセットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e79692ec-9dd7-eb11-8d34-096d4b5f189e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dfbe80fa-3831-2b87-5a82-566ae2c0f800.png)

#### 4. Hub Layer にて Subscriber Layer に共有するデータセットを作成

BigQuery にてデータセットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/793ae55c-d326-0270-9315-b20b6d94ad7b.png)

BigQuery にてデータセットを承認済みデータセットとして設定します。リンクデータセット（`.bq_publisher_01_sample_ds_01_in`）に対して、ビューを保持させているデータセット（`bq_publisher_01__conf`）を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/64688876-ae0d-c82a-5eeb-379e40c81085.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dfce6115-3192-4306-249e-dcc04bb56aa5.png)

BigQuery にてリンクデータセットのテーブルを参照したビューを作成します。

```sql
CREATE VIEW bq_publisher_01__conf.sample_01
AS
SELECT
  *
  FROM bq-hub-01.bq_publisher_01_sample_ds_01_in.sample_01
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b2caf926-8eb9-06af-adc0-599419af34d6.png)

#### 5. Hub Layer にて Subscriber Layer に共有するエクスチェンジとリストを作成

Analytics Hub にてエクスチェンジを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4ae35fdb-2190-2310-6c69-67cf30956466.png)

Analytics Hub にて作成したエクスチェンジにリストを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/77480586-13f0-491f-505d-8d6ea67803df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/07e11d75-ee17-2dd0-0376-3763ed23874e.png)


#### 6. Subscriber Layer にて Hub Layer から共有されたデータセットを追加

Analytics Hub にて作成済みのリストにて`+ SUBSCRIVE`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/600d0290-98d2-29b9-c901-d8989001886f.png)

リンクデータセットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a0b1c0c7-84e2-4e5f-e38e-e1a57532a075.png)

テーブルのデータ参照できることを確認します。

```sql
SELECT
  *
FROM
  `bq-subscriber-01.bq_hub_01_bq_publisher_01_conf.sample_01`
LIMIT
  1000
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1215521e-adfe-70c1-28e5-39958d1077fe.png)

#### 7. データ挿入の動作確認

共有元のテーブルにレコードを挿入します。

```sql
INSERT INTO sample_ds_01.sample_01
(
  int_col,
  string_col,
  date_col
)
SELECT 4, 'ddd', CAST('2024-04-04' AS date)
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ce8d5479-8309-8e8b-a04e-d71d6d137d1b.png)

Subscriber Layer の BigQuery にてint_col`列が`4`のデータが追加されていることを確認します。

```sql
SELECT
  *
FROM
  `bq-subscriber-01.bq_hub_01_bq_publisher_01_conf.sample_01`
LIMIT
  1000
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b5072093-eab8-2794-b88a-500a3d282504.png)

## 構築時に検討すべきこと

- アーキテクチャ設計
    - VPC SC の設計と構築方法
- データ共有のルール
    - データ契約（データコントラクト）
- 権限の付与方法
    - ロールの検討
    - Exhange に設定するか、 Listing にするか
    - 外部テーブルへの権限付与方法
        - ストレージに対する権限付与も検討するか
        - BigLake に変更するか
- 命名規則
    - Exchange
    - Listing
    - 連携後のデータセット
    - 連携後のテーブル
- オブジェクトへの記述内容の方針検討
    - エクスチェンジ
        - 連絡先
        - 説明
    - リスティング
        - 表示名
        - カテゴリー
        - アイコン
        - 説明
        - ドキュメンテーション
        - 主連絡先
        - アクセス要求連絡先
        - プロバイダー名
        - プロバイダー主連絡先
        - パブリッシャー名
        - パブリッシャー主連絡先
- 機密データの特定方法
    - Cloud DLP を利用するか（下記の記事の2. Cloud Data Loss Prevention API によるデータプロファイリングにて機密データの特定記述）
        - [サイロ化されたBigQueryデータセット統合におけるDataplexと関連サービスの活用方法 #GoogleCloud - Qiita](https://qiita.com/manabian/items/085e3ac6ca75832c5741)
    - その他のクラウドサービスで特定するか。
- 監査ログの取得方法と監視方法
- コストの監視方法