はじめに
SPSS ModelerなどのツールからBigQueryのテーブルを参照する際、特定のテーブルだけがエラーで読み込めないことがあります。特に、BigQuery側で「外部テーブル(GCS上のCSVやTSVを参照しているテーブル)」として定義されている場合にハマりやすいポイントについて、今回の解決事例を共有します。
1. 発生した問題
SPSSからBigQueryコネクタ経由でデータを取り込もうとした際、通常のテーブルは参照できるのに、一部のマスタテーブル(外部テーブル)において以下の状況が発生しました。
- SPSS上でテーブル一覧には表示されるが、プレビューや実行をするとエラーになる
- BigQueryのコンソール上では、自分(ユーザー権限)で問題なくクエリが実行できる
2. 原因の特定
調査の結果、原因は「権限の継承範囲」にありました。
- BigQueryの外部テーブルは、クエリ実行時に「BigQueryがGCSにファイルを読みに行く」という動作をします
- SPSSから接続する場合、実際にクエリを実行する主体はSPSSのサービスアカウントです
状況の比較
- ユーザー自身:BigQuery閲覧権限 + GCS参照権限がある(そのためコンソールからは実行できる)
- SPSSサービスアカウント:BigQuery閲覧権限はあるが、参照先GCSバケットへの権限がない
このため、BigQueryまでは辿り着けても、その先のデータ実体(GCS)を読み込む段階で拒否されていたのがエラーの真相でした。
1. 解決策
GCSの権限付与 解決策はシンプルです。SPSSが使用しているサービスアカウントに対して、対象のGCSバケット(またはオブジェクト)への参照権限を付与します。
設定内容
- 対象:SPSS用サービスアカウント
- ロール:roles/storage.objectViewer(ストレージ オブジェクト閲覧者)
- 範囲:外部テーブルのソースファイルが格納されているGCSバケット
1-1. 具体的な設定手順(例) コンソールでの手順
- Google Cloud コンソール > Cloud Storage > 対象バケット > 権限
- 追加をクリックし、メンバーにSPSSサービスアカウントを入力
- ロールに「ストレージ オブジェクト閲覧者」を選択して保存
- 可能であれば、対象フォルダ配下のみに限定(バケットレベル権限が基本ですが、必要最小限に)
gcloudでの手順(例)
2. 確認ポイント
- SPSSが実際にどのサービスアカウントで接続しているか
- 外部テーブルの定義で参照しているGCS URI(gs://bucket/path/...)がどこか
- Uniform bucket-level access(統一バケットレベルアクセス)が有効かどうか(有効でもroles/storage.objectViewerで問題なく参照可能)
2-1. 検証と恒久対応 検証
- 一時的に当該サービスアカウントに権限を付与し、SPSSから外部テーブルのプレビューや実行を確認
- BigQueryのジョブ詳細で実行主体(サービスアカウント)とエラーの有無を確認
恒久対応
- 新しい外部テーブルを作成する際は、BigQuery側の権限だけでなく「裏側のGCSへのアクセス権」もセットで付与する運用とする
- サービスアカウント別の役割設計を明確にし、最小権限での付与を徹底
- 外部テーブルの定義変更時(バケットやパスの変更)に権限の見直しを行うためのチェックリスト作成
つまずきやすいポイントと補足
- データセットの権限だけでは不十分:
・BigQueryデータセットに対して閲覧・実行権限があっても、外部テーブルはGCSの実体にアクセスできなければ失敗します
- 認証主体の違い:
・人(ユーザー)で成功しても、ツール(サービスアカウント)で失敗するケースは多いです
- エラーの見え方:
・SPSS側では一般的な読み取りエラーに見える一方、BigQueryのジョブ詳細やGCSのアクセスログには明確に権限不足(403)が記録されることがあります
- 必要に応じて付与する追加ロール:
・バケット一覧を参照する必要がある場合:roles/storage.legacyBucketReader または roles/storage.viewer(基本はobjectViewerで十分)
・プライベートKMSで暗号化されている場合:KMSキーの暗号化解除権限(roles/cloudkms.cryptoKeyDecrypter)も検討
- 外部データソースの種別:
・CSV/TSV以外にも、Parquet、Avro、JSONなどの外部テーブルでも同様にGCS権限が必要
まとめ
BigQueryの外部テーブルは非常に便利ですが、「BigQueryの権限」と「ソースデータ(GCS)の権限」の二段構えになっている点に注意が必要です。
SPSSなどの外部ツールから接続して「なぜか特定のテーブルだけ読めない」というときは、そのテーブルが外部テーブルかどうか、そしてサービスアカウントにソースへの権限があるかを真っ先に疑ってください。
最小権限で適切にIAMを設計し、運用フローにGCSパスと権限の確認を組み込むことで、同種のトラブルを未然に防止できます。
Google Cloud、Google Workspace に関するご相談はXIMIXへ!
Google Cloud、Google Workspaceに関する お問い合わせはこちら