【GCP+python3】ユーザーアカウント認証でGCPリソースにアクセスする話
お前、他の記事で「配列 値 あるか」「今日 取得」とか言ってるのに、唐突にやたら難儀なこと始めるなって思ってるでしょ。私もそう思う。
結論
# BigQueryに接続する例
from google_auth_oauthlib import flow
from google.cloud import bigquery
launch_browser = True
appflow = flow.InstalledAppFlow.from_client_secrets_file(
'クライアントID情報のJSONファイルのフルパス',
scopes = ['https://www.googleapis.com/auth/bigquery']
# スコープを指定する
)
if launch_browser:
appflow.run_local_server()
else:
appflow.run_console()
credentials = appflow.credentials
project = 'プロジェクトID'
client = bigquery.Client(project=project, credentials=credentials)
やりたいこと
ローカルマシンで動かしているバッチから、GCP上のデータベースとかPub/Subとかにアクセスしたいんだけど、セキュリティの都合で、公式ドキュメントで推奨されている「サービスアカウントキー」による認証が使えないので、他の方法でやりたい。
まあやってみたらこの方法によるユーザーアカウント認証だと、毎回手動ログインが必要だからバッチには向かなかったんですけどね!すっげぇ頑張って認証通したので、一応足跡は残しておこうと記事にしました。
(でも正直、「エンドユーザーによる認証が必要になるような複雑なプログラム」を作れる人は公式ドキュメントで理解できるような気も、する。)
準備
・プロジェクトの課金設定とか、接続したいのAPIをオンにするとかはもう済んでるものとする。
・IAMにユーザーアカウントを登録して、必要な権限を設定しておく
・「認証情報」ページの上部「認証情報を作成」>「OAuthクライアントID」からクライアントIDを作成。IDの一覧が表示されたら、ダウンロードボタンを押してJSONをダウンロード→プログラムのファイルと一緒に保存しておく。
・使いたいリソースに対応するクライアントライブラリをインストールしておく。してあるだろうけど。例えばBigQueryなら pip install --upgrade google-cloud-bigquery で。
・認証用のライブラリをインストールする
pip install --upgrade google-auth-oauthlib
認証部分を作る
from google_auth_oauthlib import flow
launch_browser = True
appflow = flow.InstalledAppFlow.from_client_secrets_file('クライアントID情報のJSONファイルのフルパス',scopes = ['https://www.googleapis.com/auth/bigquery']) # スコープを指定する
if launch_browser:
appflow.run_local_server()
else:
appflow.run_console()
credentials = appflow.dredentials
launch_browserはTrueが推奨。ローカルサーバーが起動しない環境で実行する場合False。でもなんかブラウザでログインする代わりに認証コード求められるので、その辺詳しく調べてない。
絶対ブラウザログインさせるならlaunch_browser周りの記述省いて、いきなりappflow.run_loval_server()していいかも。
スコープの指定
ここで、どのリソースに対する権限を要求するかを指定する。上のサンプルはBigQueryに対する権限を要求している。
スコープのURLは、「接続したいリソース+APIに対する認証」で調べれば出てくる。複数の権限を並べる事も可能。ここ探すの(というか探し方にたどり着くの)が結構大変だった。
リソースへの接続
from google.cloud import bigquery
project = 'プロジェクトID'
client = bigquery.Client(project=project, credentials=credentials)
# 普通にクライアントライブラリ使う時はbigquery.Client()でいい
# 今回はプロジェクト名とクレデンシャルズを指定する。
# ここのcredentialsは、認証部分作ったときに取得したcredentialsを渡す
これで、あとは通常どおりクライアントライブラリが使える。
わかちゃえば簡単なんだけどねぇ。
参考
この記事が気に入ったらサポートをしてみませんか?