BigQuery の IAM 権限のトラブルシューティング

このドキュメントでは、BigQuery の Identity and Access Management(IAM)権限に関する問題のトラブルシューティング方法について説明します。IAM 権限の問題は通常、次のような Access Denied エラーになります。

  • Access Denied: Project PROJECT_ID: User does not have bigquery.jobs.create permission in project PROJECT_ID.
  • Access Denied: Project PROJECT_ID: User does not have bigquery.datasets.get permission on dataset DATASET.
  • User does not have permission to query table PROJECT_ID:DATASET.TABLE.
  • Access Denied: Table PROJECT_ID:DATASET.TABLE: User does not have permission to query table PROJECT_ID:DATASET.TABLE, or perhaps it does not exist.
  • Access Denied: User PRINCIPAL does not have permission to perform bigquery.tables.getData on resource 'projects/PROJECT_ID/datasets/DATASET/tables/TABLE'.

始める前に

  • プリンシパルの BigQuery リソースへのアクセスをトラブルシューティングするには、必要な IAM 権限があることを確認します。

問題に関する情報を収集する

リソース アクセスに関する問題のトラブルシューティングを行う最初のステップは、不足している権限、アクセスが拒否された IAM プリンシパル、プリンシパルがアクセスしようとしていたリソースを特定することです。

エラーまたはジョブ履歴から情報を取得する

プリンシパル、リソース、権限に関する情報を取得するには、bq コマンドライン ツールの出力、API レスポンス、または Google Cloud コンソールの BigQuery を調べます。

たとえば、権限が不十分な状態でクエリを実行しようとすると、 Google Cloud コンソールの [クエリ結果] セクションの [ジョブ情報] タブに次のようなエラーが表示されます。

[クエリ結果] セクションの [ジョブ情報] タブでアクセス拒否エラーが発生する。

エラーを調べて、プリンシパル、リソース、権限を特定します。

場合によっては、エラー メッセージから直接、不足している権限をリクエストできます。詳細については、IAM ドキュメントの権限エラー メッセージのトラブルシューティングをご覧ください。

Cloud Audit Logs から情報を取得する

エラー メッセージが一般的である、情報が不足している、バックグラウンド プロセスでアクションが失敗した場合は、Cloud Audit Logs のログ エクスプローラを使用してエラーに関する情報を取得します。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

    または、ナビゲーション メニューから [モニタリング] > [ログ エクスプローラ] を選択します。

  2. ログ エクスプローラで、ログのスコープとして [プロジェクト ログ] を選択します。

  3. クエリ ウィンドウで、次のクエリを入力して、BigQuery データアクセス ログから権限関連のエラーを取得します。

    resource.type="bigquery_resource" AND
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
    protoPayload.status.message:"Access Denied" OR
    protoPayload.status.message:"Permission denied" OR
    protoPayload.status.code=7

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  4. クエリ結果で、失敗したオペレーションに対応するログエントリを開きます。

  5. [protoPayload] セクションで、authorizationInfo 配列を開き、authorizationInfo 配列の各ノードを開きます。

    authorizationInfo 配列には、API 呼び出し中に実行されたすべての権限チェックが表示されます。

  6. エラーの原因を確認するには、granted: false エントリを探します。granted: false エントリには次の情報が表示されます。

    • permission: チェックされた IAM 権限文字列。例: bigquery.tables.getData
    • resource: プリンシパルがアクセスを試みたリソースの完全修飾名。例: projects/myproject/datasets/mydataset/tables/mytable
    • principalEmail(利用可能な場合): protoPayload.authenticationInfo で参照される、アクションを試みたプリンシパル。

    権限、リソース、principalEmail を示す protoPayload の authorizationInfo セクション。

許可ポリシーに Policy Analyzer を使用する

許可ポリシーの Policy Analyzer を使用すると、IAM 許可ポリシーに基づいて、どの IAM プリンシパルがどの BigQuery リソースに対してどのようなアクセス権を持っているかを調べることができます。

権限エラーに関する情報を収集したら、Policy Analyzer を使用して、プリンシパルに必要なアクセス権がない理由を把握できます。このツールは、関連するすべてのポリシー、Google グループのメンバーシップ、プロジェクト、フォルダ、組織などの親リソースからの継承を分析します。

許可ポリシーに Policy Analyzer を使用するには、分析クエリを作成し、分析のスコープを指定して、クエリを実行します。

  1. Google Cloud コンソールで、[Policy Analyzer] ページに移動します。

    Policy Analyzer に移動

    または、ナビゲーション メニューから [IAM と管理> ポリシー アナライザー] を選択します。

  2. [カスタムクエリを作成] をクリックします。

  3. [クエリを構成] ページで、事前に収集した情報を入力します。

    1. [スコープを選択] セクションの [クエリスコープを選択] フィールドで、現在のプロジェクトが表示されていることを確認するか、[参照] をクリックして別のリソースを選択します。

    2. [クエリ パラメータを設定する] セクションで、[パラメータ 1] に [プリンシパル] を選択し、[プリンシパル] フィールドにユーザー、グループ、サービス アカウントのメールアドレスを入力します。

    3. [パラメータを追加] をクリックします。

    4. [パラメータ 2] で [権限] を選択し、[権限] フィールドで [選択] をクリックして BigQuery 権限を選択し、[追加] をクリックします。たとえば、bigquery.tables.getData を選択します。

    5. [パラメータを追加] をクリックします。

    6. [パラメータ 3] で [リソース] を選択し、[リソース] フィールドに完全修飾リソース名を入力します。リソース名には、次の例のようにサービス接頭辞を含める必要があります。

      • BigQuery プロジェクト: //cloudresourcemanager.googleapis.com/projects/PROJECT_ID
      • BigQuery データセット: //bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET
      • BigQuery テーブル: //bigquery.googleapis.com/projects/PROJECT/datasets/DATASET/tables/TABLE
  4. [カスタムクエリ] ペインで、[分析] > [クエリを実行] をクリックします。

  5. クエリ結果を確認します。結果は次のいずれかになります。

    • 空のリスト。結果がない場合は、プリンシパルに必要な権限がないことを確認します。適切な権限を提供するロールをプリンシパルに付与する必要があります。
    • 1 つ以上の結果。アナライザーが許可ポリシーを見つけた場合、何らかの形式のアクセス権が存在します。各結果の [バインディングを表示] をクリックして、プリンシパルがメンバーであるリソースへのアクセス権を付与するロールを表示します。ポリシー バインディングは、グループ メンバーシップまたは継承によってアクセス権が付与されているかどうか、または IAM 条件または IAM 拒否ポリシーによってアクセスが拒否されているかどうかを示します。

必要な権限を付与する適切な IAM ロールを見つける

プリンシパルに十分なアクセス権がないことを確認したら、必要な権限を付与する適切な事前定義またはカスタム IAM ロールを見つけます。選択するロールは、最小権限の原則に準拠している必要があります。

組織でカスタムロールを使用している場合は、プロジェクトまたは組織で作成されたすべてのカスタムロールを一覧表示して、適切なロールを見つけることができます。たとえば、 Google Cloud コンソールの [ロール] ページで、[タイプ:カスタム] でリストをフィルタすると、カスタムロールのみを表示できます。

適切な事前定義 IAM ロールを見つけるには、次の操作を行います。

  1. BigQuery IAM のロールと権限ページの BigQuery の権限セクションを開きます。

  2. [権限を入力] 検索バーに、エラー メッセージ、ジョブ履歴、監査ログから取得した権限を入力します。例: bigquery.tables.getData

    検索結果には、権限を付与するすべての事前定義 BigQuery ロールが表示されます。

  3. 最小権限の原則を適用します。ロールのリストで、必要な権限を付与する最も制限の厳しいロールを選択します。たとえば、テーブルデータのクエリを実行する権限を付与するために bigquery.tables.getData を検索した場合、その権限を付与する権限が最も少ないロールは BigQuery データ閲覧者です。

  4. プリンシパルに適切なロールを付与します。BigQuery リソースに IAM ロールを付与する方法については、IAM を使用してリソースへのアクセスを制御するをご覧ください。

次のステップ