web-dev-qa-db-ja.com

BigQueryのGOOGLE_APPLICATION_CREDENTIALSの設定Python CLI

Pythonを使用して、BigQuery APIを介してGoogle BigQueryに接続しようとしています。

ここでこのページをフォローしています: https://cloud.google.com/bigquery/bigquery-api-quickstart

私のコードは次のとおりです。

import os
import argparse

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.client import GoogleCredentials

GOOGLE_APPLICATION_CREDENTIALS = './Peepl-cb1dac99bdc0.json'

def main(project_id):
    # Grab the application's default credentials from the environment.
    credentials = GoogleCredentials.get_application_default()
    print(credentials)
    # Construct the service object for interacting with the BigQuery API.
    bigquery_service = build('bigquery', 'v2', credentials=credentials)

    try:
        query_request = bigquery_service.jobs()
        query_data = {
            'query': (
                'SELECT TOP(corpus, 10) as title, '
                'COUNT(*) as unique_words '
                'FROM [publicdata:samples.shakespeare];')
        }

        query_response = query_request.query(
            projectId=project_id,
            body=query_data).execute()

        print('Query Results:')
        for row in query_response['rows']:
            print('\t'.join(field['v'] for field in row['f']))

    except HttpError as err:
        print('Error: {}'.format(err.content))
        raise err


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('project_id', help='Your Google Cloud Project ID.')

    args = parser.parse_args()

    main(args.project_id)

ただし、このコードを端末から実行すると、次のエラーが表示されます。

oauth2client.client.ApplicationDefaultCredentialsError: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.

コードを見るとわかるように、エラーのリンクに従ってGOOGLE_APPLICATION_CREDENTIALSを設定しようとしました。ただし、エラーは引き続き発生します。誰が問題が何であるか知っていますか?

前もって感謝します。

22
Colin Ricardo

最初に-コードをありがとう-これは非常に有用であることが提供されました。また、作業中のすべての環境に設定しないように、環境変数の設定をコードに直接追加することをお勧めします。次のコードを使用できます。

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "path_to_your_.json_credential_file"

これは、異なる資格情報を必要とする異なるプロジェクト間で切り替えるときに役立ちます。

39
Roee Anuar

pythonスクリプト内の変数ではなく、ローカルUNIX(または他の)環境内の環境変数を探しています。

端末またはcygwinを開き、次のいずれかを実行して設定します。

export GOOGLE_APPLICATION_CREDENTIALS='/path/to/your/client_secret.json'

これを端末に入力して、このセッションだけの変数を設定します

UNIXでnano〜/ .bashrcと入力して.bashrcファイルを開き、そのヘッダーが表示されたら、ユーザー固有のエイリアスの下に次の行を追加します。

GOOGLE_APPLICATION_CREDENTIALS="/full/path/to/your/client_secret.json"

次に、source〜/ .bashrcと入力してリロードし、echo $GOOGLE_APPLICATION_CREDENTIALSを試して設定されていることを確認します。それがパスを返す場合、あなたは大丈夫です。

23
Wolf Rendall

BigQueryについてはわかりませんが、保存にGoogle Data Storeを使用しています。 Macにgcloud sdkをインストールした場合、このコマンドを実行してみてください。

gcloud auth application-default login
18
arthankamal

注: oauth2clientは非推奨GoogleCredentials.get_application_default()の代わりに google.auth.default() を使用できます。最初にパッケージをインストールします:

pip install google-auth

あなたの特定の例では、JSONファイルがコードからどこにあるか知っています。 (環境変数からの)デフォルトの資格情報の代わりに、- google.oauth2.service_account モジュールで サービスアカウントを直接使用 にできます。

credentials = google.oauth2.service_account.from_service_account_file(
    './Peepl-cb1dac99bdc0.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform'])

googleapiclient.discovery.build に渡すか、または google-cloud-bigquery library 、資格情報を google.cloud.bigquery.Client コンストラクターに渡します。

6
Tim Swast

エラーメッセージで提供されているリンク https://developers.google.com/identity/protocols/application-default-credentials は、環境変数を設定するよう指示していますJSONサービス資格情報を含む失敗を指すようにします。 Python変数を設定しているようです。正しいファイルを指すように端末の環境変数を設定してみてください。

別の方法として、GCEコンテナで実行していないときに、oauth2client.client.SignedJwtAssertionCredentialsとクライアントシークレットを直接ポイントするので、環境変数を介して間接的に行う必要はありません。

2
Michael Sheldon

環境変数を設定せずに異なる資格情報ファイルを使用する場合は、次のコードを使用できます。

from oauth2client import service_account
from apiclient.discovery import build
import json

client_credentials = json.load(open("<path to .json credentials>"))

credentials_token = service_account._JWTAccessCredentials.from_json_keyfile_dict(client_credentials)

bigquery_service = build('bigquery', 'v2', credentials=credentials_token)
query_request = bigquery_service.jobs()
query_data = {
    'query': (
            'SELECT TOP(corpus, 10) as title, '
            'COUNT(*) as unique_words '
            'FROM [publicdata:samples.shakespeare];')
    }

query_response = query_request.query(
           projectId=project_id,
           body=query_data).execute()

print('Query Results:')
for row in query_response['rows']:
    print('\t'.join(field['v'] for field in row['f']))
1
Roee Anuar

環境変数を探しています。しかし、Windowsプラットフォームでは、アプリケーションの既定の資格情報を使用してこの問題を解決できました。

私が従った手順:

  • Google SDKをインストールしました
  • 次に、gcloud initステップを実行して、必要に応じて変更できるデフォルトの資格情報とデフォルトのプロジェクトを指定します。 gcloud実行可能ファイルは、Google SDKのインストールを選択したbinディレクトリに配置できます。
  • 資格情報を正常に提供した後、場所C:\Users\"yourusername"\AppData\Roaming\gcloud\legacy_credentials\"youremail"でチェックインできます。そこにJSON形式で保存された資格情報があります。

エラーの解決に役立ちました。

1

GOOGLE_APPLICATION_CREDENTIALSが見つかりませんC#のエラーソリューション

System.Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS",@"C:\apikey.json");
string Pathsave = System.Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS");
1
Hakkı Eser