2017-12-07 2 views
1

Google Compute VMインスタンス(BitnamiのLAMPスタックがインストールされている)で動作するPHPスクリプトからBigQueryデータセットにアクセスしようとしています。Google Compute VMインスタンスで実行されているPHPスクリプトからGoogle BigQueryデータセットにアクセスする

データセットは他の当事者が所有していますが、当事者は私のメールアドレスを使用してデータセットに完全所有権を与えています。彼らはまた、私の電子メールアドレスを使用して、別のデータセットに私に読まれた役割を与えました。

私のPHPスクリプトは、私が読取り権限を与えられたデータセットテーブルからデータを読んで、そのデータをマッサージし、完全所有権ロールが与えられたデータセットのテーブルに書き込むことを意図しています。

私は前述のように私の電子メールアドレスの下ですべてを実行する正しい認証をセットアップする方法を試してみるのに何時間も費やしましたが、今まで "あなたには許可がありません..."というタイプのエラー1つのデータセットからデータを読み込もうとしたり、別のデータセットに書き込んだりするときに発生します。

BigQueryデータセットは前述のように所有していませんが、プロジェクトIDとデータセットの名前が与えられており、両方の所有者がメールアドレスを使用して上記のアクセス許可を設定しています。

誰にも、上記を達成するための簡単なステップバイステップガイドがあります。データセットの所有者は、既に説明した以上に何かを行う必要がありますか? Googleヘルプの多くのページで非常に混乱していることがわかりました。

答えて

1

サービスアカウントのキーファイルが必要です。これには別のメールアドレスが付いています。サービスアカウントの電子メールには、電子メールではなくアクセス許可を与える必要があります。実際には、どちらもUIで作業するために使用されるため、もう1つは開発するアプリにあります。

完全なPHPの例が含まれています。

サービスアカウントのデフォルト資格情報を設定する必要があります。putenvuseApplicationDefaultCredentials()の行を参照してください。これは私がhttps://github.com/google/google-api-php-client

あなたはコンソールからサービスアカウントキーファイルを取得する必要があり、ライブラリ使用している作業コードです:https://console.cloud.google.com/iam-admin/serviceaccounts/

composer.jsonを

{ 
    "require": { 
     "google/cloud": "^0.13.0", 
     "google/apiclient": "^2.0" 
    } 
} 

PHPファイル

# Imports the Google Cloud client library 
use Google\Cloud\BigQuery\BigQueryClient; 
use Google\Cloud\ServiceBuilder; 

$query="SELECT repository_url, 
     repository_has_downloads 
FROM [publicdata:samples.github_timeline] 
LIMIT 10"; 
$client = new Google_Client(); 
putenv('GOOGLE_APPLICATION_CREDENTIALS='.dirname(__FILE__) . '/.ssh/dummyname-7f0004z148e1.json');//this can be created with other ENV mode server side 
$client->useApplicationDefaultCredentials(); 

$builder = new ServiceBuilder([ 
       'projectId' => 'edited', 
     ]); 

     $bigQuery = $builder->bigQuery(); 

     $job = $bigQuery->runQueryAsJob($query); 
     $info=$job->info(); 
//  print_r($info); 
//  exit; 
     $queryResults = $job->queryResults(); 

     /*$queryResults = $bigQuery->runQuery(
      $query, 
      ['useLegacySql' => true]);*/ 

     if ($queryResults->isComplete()) 
     { 
      $i = 0; 
      $rows = $queryResults->rows(); 

      foreach ($rows as $row) 
      { 
       $i++; 

       $result[$i] = $row; 
      } 
     } 
     else 
     { 
      throw new Exception('The query failed to complete'); 
     } 

     print_r($result); 
+0

ありがとうございました!私はサービスアカウントの電子メールアドレスをデータセットの所有者(彼は私と共有していますが、通常のa/c電子メールではなく普通のものを使用しています)に渡す必要がありますか?私の普通のものよりも? –

+0

あなたは、ポストに含まれているリンクを使用してポータルにサービスアカウントを作成することができます。 – Pentium10

+0

こんにちは、Pentium10 - はい私はこれを行い、あなたの非常に有用な指示に従ってサービスアカウントをセットアップし、キーファイルをダウンロードしました!あなたのコードを使って試してみると、 "致命的なエラー:未知のGoogle \ Cloud \ Core \ Exception \ ServiceException:{"エラー ":{"エラー ":" {"ドメイン": "グローバル"、 " 「理由」:「accessDenied」、「メッセージ」:「アクセスが拒否されました:データセットが編集されました:編集:ユーザー[email protected]に編集されたデータセットのbigquery.tables.create権限がありません。私はまだうんざりしています!! –

関連する問題