BigQuery StudioでGitHubリポジトリ連携を設定する手順

## 概要
先日（25-03-21）に、BigQuery のリポジトリ連携機能が発表された。これは BigQuery内の資産を Gitリポジトリベースで連携する機能。

https://cloud.google.com/blog/products/data-analytics/bigquery-repositories-integrates-with-git?hl=en

## 何が可能になるのか
BigQueryには従来から Queryを共有する機能が付いていた。下図の様なメニューから個人で保存したクエリやチームで共有しているクエリにアクセスできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/7ddd6e59-50b6-414c-92a1-dfd72c81361e.png)

しかし、これらは単なる共有クエリであり、使用感的にはクラウドストレージ上にある共有ファイルと近い。しかしこれに Git管理を追加することで、バージョンを管理したり、PullRequest ベースでの共有物のレビュー&受け入れが可能になる。

また、共有ファイルは GitHub等の Gitリポジトリ上に配置されるため、各種ツールでクエリの効率性を検証したりといった運用も可能になりそうだ。

その可能性を見せてくれるのが、今回新たに用意された以下のメニューだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/fa07a425-8a7e-46bb-8701-4bc0130e925b.png)

これをゴニョゴニョして接続を確立させると、左メニュー下部に個人のワークスペースが表示され、クエリ等が git管理出来るようになる。ここでクエリを選択すると、従来通り右側のペインにはクエリエディタが表示され、その場で実行、結果の確認までが可能だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/3bd0c0ca-fb1d-4908-a371-9a8976d76688.png)


## 連携の概要
実際に連携を行ったので、細かい連携法を纏めておく。基本的には、以下のステップでシークレットを参照可能にすることで連携を実現できる。

1. [発行] GitHub上でPersonal Access Token（HTTPS）または秘密鍵（SSH）を発行
1. [保管] 発行したシークレットを Secret Managerに登録
1. [参照] BigQueryに許可を与え SecretManager上の Secretを参照させる
1. [確認] 接続確立を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/3289e0b1-d867-46b1-8a2b-ddd68bb7200a.png)

図にするとこんな感じ。分かってしまえば単純である。尚、Gitプロバイダとしては GitHubの他にも以下のようなものが存在する。

- Azure DevOps Service（SSH）
- Bitbucket（SSH）
- GitHub（SSH・HTTPS）
- GitLab（SSH・HTTPS）

続いて具体的な手順について説明する。


## 連携の手順

### 事前準備

#### Gitプロバイダ

Gitプロバイダ側で必要な事前準備は、**リポジトリの準備** と **シークレットの発行** である。シークレットとは HTTPS接続で用いる Personal Access Tokenや SSH接続で用いる秘密鍵を指す。ここでは GitHub上での Personal Acecss Tokenを用いた例を示す。

- リポジトリは新規に作成する
- Personal Access Tokenは Fine-grainedを選択肢、新規作成したリポジトリを対象に、以下の2権限を付与する
    -  Read: `access to metadata`
    -  Read and Write: `access to code and pull requests`

> Personal Access Token のメニューは以下から遷移可能
> - GitHub ページ右上の自身のアイコンをクリックし、`setting` を選択
> - 左メニュー最下部の `<> Developer settings` を選択
> - 左メニュー最下部の `Personal access tokens` 配下の `Fine-grained tokens` を選択
> - `Generate new token` ボタンで新規トークンを作成する

#### SecretManager

SecretManagerには 先に発行した **Personal Access Token** を登録する。BigQueryは連携時にこれを利用する。なおこの工程は BQ側の repository構成時に併せて実施可能なので、今回はスキップする。

#### IAM

GCPプロジェクトの IAM側にも設定が必要だ。これは BigQueryから接続を依頼された DataFormのサービスアカウントが SecretManagerにアクセスする際の許可を与えるものだ。具体的には以下の手順を行う。

- GCPのWebコンソールからIAMを開く
- 規定の「**Dataform Service Account** 」（□ Google提供のロール付与を含めるにチェックで表示）アカウントを探す（または適切なサービスアカウントを別途割り当てて管理する）
- 「SecretManager のシークレット アクセサー」ロールを付与する

## リポジトリの作成

左ナビゲーションより `${PROJECT}` -> `リポジトリ` を選択し、`+ リポジトリの追加` を押下

- GCP管理上の **リポジトリID** , **リージョン** を聞かれるので、任意の値で作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/80b105b2-7fd0-471e-ba8a-34578ead2da2.png)

### 設定：ワークスペース

- 一覧に追加された リポジトリ を選択し、`ワークスペース` タブを選択
- リンク先で `+ ワークスペースを追加` を押下
  - **ワークスペースID** を聞かれるので、任意のIDを設定

### 設定：構成

- 一覧に追加された リポジトリ を選択し、`構成` タブを選択。`Gitと接続` メニューがあるので、以下の項目を設定する

| 項目名 | 設定値 |
|:-:|:-:|
|  **プロトコル**  | HTTPS / SSH を選択。今回は HTTPSを指定 |
| **リモートの Gitリポジトリの URL**  | GitHub上に作成したリポジトリのURLを設定 |
| **デフォルトのブランチ名** | `main` でOK |
| **シークレット** | (下記参照) |


  - `新しいシークレットを作成` からシークレットを設定し `シークレットの作成` を押下する
    - **名前**：任意の名前
    - **ファイルをアップロード**: (無視)
    - **シークレットの値** 作成した **Personal Access Token** の値
    - **レプリケーションポリシー**: そのまま
    - **有効期限**: 任意で設定

### 構成の確認

以上を適切に設定すると、リポジトリ一覧上に追加されたリポジトリの **認証ステータス** 欄が「有効」となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/2a48f144-80c7-4ca2-a608-4d99565a74e6.png)

## 利用方法

BigQueryエクスプローラ最下部に アコーディオン形式で自身のワークスペースが存在するので展開する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/155cc558-43bb-4bdc-a5ad-d1841e33d33f.png)

`+` ボタン等からコンテンツを追加し、GUI上から gitを操作する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/ddbe0e5c-251d-4cfc-9978-95c5b71343b5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/ff789399-d8f6-4995-ba71-0a73fdb2e3dd.png)

新規に作成した変更を `commit {n} change` で確定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/1434a8e2-16da-473d-afef-8d57dce241d6.png)

その後、`リモートに push`, `Create pull request` とボタンメニューが変化するので、それに従って PRを作成すると、 GitHubリポジトリ側に PRが作成されているイメージ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375665/37f11fa9-0d5b-4d9e-aabb-1841de0e0c09.png)


## まとめ

今回は、以下の内容を説明した。

- BigQuery上の SQLクエリをはじめとする資産は、Gitリポジトリと統合させて管理することが可能
- 統合には Personal Access Tokenの準備と、Secretの登録、そしてIAM権限の付与が必要
- BigQuery上の Git操作は、新規に作成した個人のワークスペースをから、GUIベースで操作する
- その後のフローは通常の Gitのフローと同等

BigQuery上の資産を Git連携させることができれば、共有資源を色々と弄って破壊したとしても罪は軽いので、メンテナンスの心理的ハードルを下げることができる。

また、PRレビューも入るので、その過程でより効率的なクエリの提案や議論を行うこともできる。最終的にはクエリの品質向上にも期待できるだろう。

現時点で良いことづくめにも見えるが、もう少し使い倒してから改めて感想を述べたい。。