BigqueryのAPI連携に伴う権限付与

業務において、外部APIを用いてBigqueryを使用する機会がありました。

その中で、Bigqueryを機能させるためには適切な権限設定が必要になることを知りました。

そのため、今回はBigqueryへ外部からAPI連携する場合に必要となる権限について調べ、まとめました。(2023年5月1日時点)

ただし、あくまで1ツールに対応させた権限付与の例になるため、API連携に伴う権限全般について述べているわけではありません。

1つの事例の説明と捉えて頂くと良いと思います。

それでは、スケジュールクエリを作成するツールでのAPI連携についてまとめていきます。

権限とは

詳細は省いていますが、権限付与に関わるIAMの権限構造は下図のようになっています。

ジョブ実行権限とアクセス権限

上図が示すように、Bigqueryでは、ジョブを実行できる権限と、データにアクセスできる権限に分けられています。

ここで、Bigqueryにおけるジョブとは、データの読み込み、データのエクスポート、データのクエリ、データのコピーなど、BigQuery がユーザーに代わって実行するアクションのことを示しています。

そのため、ジョブ実行権限がなければプロジェクトを動かせず、アクセス権限がなければデータへのアクセスができません。

それぞれの権限の特徴や使い方について調べ、まとめました。

権限の種類

はじめに、今回扱った権限について説明していきます。

権限
・bigquery.datasets.get:データセットに関するメタデータを取得します。
・bigquery.jobs.create:プロジェクト内でジョブ(クエリを含む)を実行します。
・bigquery.tables.create:新しいテーブルを作成します。
・bigquery.tables.get:テーブルのメタデータを取得します。
・bigquery.tables.getData:テーブルのデータを取得します。
・bigquery.tables.list:テーブルとテーブルのメタデータを一覧表示します。
・bigquery.tables.update:テーブルのメタデータを更新します。
・bigquery.tables.updateData:テーブルのデータを更新します。
・bigquery.transfers.get:転送のメタデータを取得します。
・bigquery.transfers.update:転送を作成、更新、削除します。

上記が、今回スケジュールクエリを外部ツールで作成する際に必要になると考えた権限になります。

この権限をそれぞれの種類ごとに説明していきます。

・ジョブ実行権限

ジョブ実行関連の権限として、ここでは「bigquery.jobs.create」を付与しています。

この権限はジョブを実行する側に付与する必要があるため、プロジェクトに付与する必要があります。

・データへのアクセス権限

データへのアクセス権限には、読み取りに用いる権限と書き込みに用いる権限の2種類があります

1,読み取り権限

読み取り権限として、ここでは「bigquery.tables.getData」を付与しています。

読み取り権限を付与することで、テーブル内のデータにアクセスし、読み取ることが可能になります。

アクセス権限はデータセット・テーブル単位で付与することができるため、特定のデータにのみアクセスさせることも可能になります。

2,書き込み権限

書き込み権限として、ここでは「bigquery.tables.updateData」を付与しています。

書き込み権限を付与することで、テーブル内のデータにアクセスし、データを更新することが可能になります。

・メタデータへのアクセス権限

メタデータとは、テーブルのスキーマに当たる、データに付随する属性情報です。

メタデータへのアクセス権限には、データセットへアクセスできる「bigquery.datasets.get」と、テーブルにアクセスできる「bigquery.tables.get」「bigquery.tables.update」などの2種類があります。

これらの権限では、メタデータの閲覧・編集を行えても、データ自体の閲覧や編集を行うことはできません。

・スケジュールクエリ作成に必要な権限

Google Cloud Console または bq コマンドライン ツールを使用してスケジュールクエリを作成する場合、つまり外部ツールとBigqueryをAPI連携する場合に必要な権限があります。

API連携する際、「bigquery.transfers.get」が必要になります。

また、スケジュール設定されたクエリを実行するために必要な権限として、実行に必要な「bigquery.jobs.create」と、抽出先データセットに対する権限として「bigquery.datasets.get」の2つがあります。

そのため、この3つの権限は、API連携し、スケジュールクエリを作成するのに必要な権限となります。

さらに、スケジュールクエリの変更・削除する権限として、「bigquery.transfers.update」を付与しています。

その他の権限

ここでは、上記で説明した権限の他に、テーブル内にクエリを作成するため「bigquery.tables.create」と、外部ツール内でプレビューとして閲覧するため「bigquery.tables.list」の2つを追加で付与しています。

この2つの権限は、今回扱ったツールの機能に関わると考え、追加した権限になります。

BigqueryのAPI連携に必要な権限ではないため、Google Cloudからそれぞれの権限の特徴を捉えて、用途に合わせて取り入れることが重要になると思います。

権限付与の方法

ここまで、外部ツールとBigqueryのAPI連携に伴って必要となる権限についてまとめてきました。

権限付与の方法として、権限はロールという1つにまとめて付与することができます。

ここでは、どのように権限を付与することで外部ツールを機能させることができたのか説明していきます。

1,権限付与の構造

権限付与の構造は、Googleアカウントやサービスアカウント全体を指す「プリンシパル」に、権限をまとめた「ロール」を付与することになっています。

このように、権限を「ロール」として1つにまとめて付与することが可能です。

権限付与の構造

上記の図に示したように、今回はBigquery側とデータセット側の2種類のロールを付与することになります。

それぞれのロールについて説明していきます。

2,(1)ロールA:プロジェクト

プロジェクト側のロールには、外部ツールからBigqueryを使うために、ジョブ実行権限を付与する必要があります。

また、今回の外部ツールはスケジュールクエリの作成を目的としているので、スケジュールクエリの作成に必要な権限を付与しなければなりません。

権限;ロールA
・bigquery.jobs.create:プロジェクト内でジョブ(クエリを含む)を実行します。
・bigquery.transfers.get:転送のメタデータを取得します。

そのため、ジョブ実行権限である「bigquery.jobs.create」とAPI連携に必要となる「bigquery.transfers.get」の2つの権限を付与します。

2,(2)ロールB:データセット

データセット側のロールには、アクセス権限と外部ツールでのスケジュールクエリ作成に必要な権限を付与しなければなりません。

権限;ロールB
・bigquery.datasets.get:データセットに関するメタデータを取得します。
・bigquery.tables.create:新しいテーブルを作成します。
・bigquery.tables.get:テーブルのメタデータを取得します。
・bigquery.tables.getData:テーブルのデータを取得します。
・bigquery.tables.list:テーブルとテーブルのメタデータを一覧表示します。
・bigquery.tables.update:テーブルのメタデータを更新します。
・bigquery.tables.updateData:テーブルのデータを更新します。
・bigquery.transfers.update:転送を作成、更新、削除します。

3,権限付与の仕方

今回付与する権限をまとめたロールについて説明してきました。

最後に、具体的なロールの作成と、ロールをプリンシパルに結合する方法について紹介します。

3,(1)ロールの作成方法

まず、ロールをどのように作るのかについて説明します。

ロールの作成方法

GoogleCloudから上記のロール管理画面を表示させます。

上部の「ロールを作成」を選択し、任意の権限を追加することで、ロールを作成することができます。

ここで、プロジェクトとデータセットそれぞれのロールを作成しておきます。

3,(2)データセットにロールを付与する

次に、データセットにロールを付与していきます。

GoogleCloudからBigqueryを開き、SQLワークスペースのエクスプローラの画面にします。

データセットへロール付与

上図の画面から、データセットを開き、「共有」から「権限」を選択します。

権限から、Bigqueryへアクセスするアカウント(サービスアカウント)を選択し、プリンシパルの編集を開きます。

編集画面で、作成したデータセット用のロールを割り当てることで、データセットへのロール付与は完了します。

3,(3)プロジェクトにロールを付与する

最後に、プロジェクトにロールを付与していきます。

GoogleCloudから、IAMを開いていきます。

プロジェクトへロール付与

上図の画面から、Bigqueryへアクセスするアカウント(サービスアカウント)を選択し、右端にあるプリンシパルの編集を開きます。

編集画面で作成したプロジェクト用のロールを付与することで、プロジェクトへのロール付与は完了です。

まとめ

プリンシパル、いわゆるアカウントにロールを付与することで、データセットへのアクセスやBigquery上での機能を制限することができます。

今回は、Bigqueryへ外部からAPI連携する場合の権限付与について取り上げましたが、あくまで1つの事例に過ぎません。

権限の種類は膨大にあるので、権限の組み合わせや付与の方法は多様にあると思います。

今回の事例を参考にしてもらい、利用用途に合わせて権限構造を考えてもらえると良いと思います。

コメントを残す