質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2992閲覧

stackdriverにログがはきだされない

sequelanonymous

総合スコア123

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/04/23 08:55

pythonコードをローカルから実行し、ログをstackdriverni吐き出そうとしているのですが、上手く行かず。
権限周りに問題があると思い、一番強い権限を付与してみてやってみても変わらず、プロジェクトを違うのにしても上手くいきませんでした。
何か、お気づきの点ありましたら、ご教示いただけると助かります。

エラー

six.raise_from(exceptions.from_grpc_error(exc), exc) File "<string>", line 3, in raise_from google.api_core.exceptions.PermissionDenied: 403 The caller does not have permission

試したコードその一

python

1import logging 2import google.cloud.logging 3 4client = google.cloud.logging.Client('project_name') 5client.setup_logging() 6logger = logging.getLogger(__name__) 7logging.info('This is an error')

試したコードその二

python

1import logging 2import google.cloud.logging 3from google.cloud.logging.handlers import CloudLoggingHandler 4 5client = google.cloud.logging.Client('project_name') 6handler = CloudLoggingHandler(client) 7client.setup_logging() 8logger = logging.getLogger(__name__) 9logger.addHandler(handler) 10logging.info('This is an error')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

google.api_core.exceptions.PermissionDeniedというエラーなので、Stackdriver Logging APIを無効にしている可能性が考えられます。

コンソールの「APIとサービス」で一度確認してみるといいと思います。

GCP 側の設定は、「サービスアカウント」に役割が付与されているかとAPIが有効になっているかだけだと思います。

別の回答で発言しているようにkeyファイルの指定誤りが想定されるのであれば、以下のコードを追加して、環境変数GOOGLE_APPLICATION_CREDENTIALSが正しい値になっているか確認してみてください。

import os print(os.environ['GOOGLE_APPLICATION_CREDENTIALS'])

それでもだめであれば、環境変数GOOGLE_APPLICATION_CREDENTIALSのexportをすべて削除して、以下のようにすると

import logging import google.cloud.logging client = google.cloud.logging.Client() client.setup_logging() logger = logging.getLogger(__name__) logging.info('This is an error')

エラーメッセージは、以下のように変わります。

google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application.

そこで、from_service_account_jsonを使ってkeyファイルを指定します。

import logging import google.cloud.logging client = google.cloud.logging.Client.from_service_account_json('keyファイルへのpath') client.setup_logging() logger = logging.getLogger(__name__) logging.info('This is an error')

そこで表示されるエラーメッセージによって対応するといいです。なお、keyファイルへのpathは始めはフルパスで入力した方がいいです。

投稿2019/04/23 11:33

編集2019/04/24 03:55
YasuhiroNiji

総合スコア584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2019/04/23 13:07

コメントありがとうございます。APIは有効になってました。
sequelanonymous

2019/04/24 06:51

ありがとうございます。やってみましたが、エラー文言に変化はありませんでした。
YasuhiroNiji

2019/04/24 10:12

環境変数 'GOOGLE_APPLICATION_CREDENTIALS' の設定をせずに、project_name の指定もしなかったら、permission よりも前に logging のクライアントがどのprojectに接続にいっていいかわからないじゃないですか。だからエラー文言は変わります。 エラー文言が変わらないというのは、環境変数 'GOOGLE_APPLICATION_CREDENTIALS' を別の場所で設定していてそれを忘れているのではないですか。
YasuhiroNiji

2019/04/24 14:54

GOOGLE_APPLICATION_CREDENTIALSのexportをすべて削除して、エラーメッセージが変化するかどうかは重要なところです。そう変更したとしても、エラーメッセージが変わらないというのであれば、上記以外に、使用している google.cloud.logging のパッケージが古いという可能性があります。
sequelanonymous

2019/04/25 07:39

ありがとうございます。解決しました。 GOOGLE_APPLICATION_CREDENTIALSに設定しているkeyを作成したサービスアカウントの権限がことなっていました。
guest

0

403 The caller does not have permission

「呼び出し元に権限がありません」とあります。

通常何かのAPIを呼び出すときには認証や認可の仕組みがあります。(何もなかったらプロジェクト名だけ指定すれば誰でもログを書き込めたりしてしまいますよね。)
StackDriver Logging を呼び出すときに認証などをしていると思うのですが、認証されたサービスアカウントにログを書き込む権限がないのだと思います。
IAMの権限を再確認してください。

投稿2019/04/23 10:21

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2019/04/23 13:08

コメントありがとうございます。それが権限は一番強いオーナー権限です。key のjsonファイルのパスを指定する必要があってやり方が間違っているのかなだと思ったりはしています。一度試してみましたが。
mather

2019/04/23 15:45

それはあなたがコンソールログインしたときの権限の話でしょうか? 通常は「サービスアカウント」を作成し権限を絞った状態でクライアントからアクセスすることが多いと思うのですが、そうなっていないのでしょうか。 ちなみに「プロジェクトが違う」というオチもないですよね?
sequelanonymous

2019/04/24 00:53

> 通常は「サービスアカウント」を作成し権限を絞った状態でクライアントからアクセスすることが多いと思うのですが、そうなっていないのでしょうか 最初は、それでやっていてできなかったので権限をなんでもできるものに変えて試しています。 現状、一つだけしかプロジェクトがないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問