GCPのCloudFunctionsでBigQueryを持ちいたジョブを作成する際に、悩んでしまったのでやり方を整理。またProject間をまたいで(他所のリソース)を参照する方法を整理
前提条件
- 権限編集の可能なサービスアカウントでの実行
- Cloud Functionsでの実行
bigframesを用いた実行
おそらくこれが一番楽だと思います。bigframesはgoogleが提供しているPythonライブラリでbigframes.pandasを用いるとDataFrame形式で操作することが可能です。
参考: https://cloud.google.com/bigquery/docs/bigquery-dataframes?hl=ja
使い方:インストール
##※cloud functionsで実行する場合はrequirements.txtに記載する
pip install bigframes
使い方:実際のコード例
import bigframes.pandas as bpd
##BigQueryのプロジェクトを指定します。
bpd.options.bigquery.project = "参照したいプロジェクト"
##クエリを文字列で入力します。
query ="""
SELECT 'hello world'
"""
##クエリを実行します。
bpd_df = bpd.read_gbq(query)
ここで生成されるbpd_dfはDataFrameライクなオブジェクトであり、PandasのDataFrameとは異なります。基本的にな機能はほぼ変わらないですが、bpd_dfの場合BigQueryのリソースを用いて実行されます。
もし、BigQueryのリソースを利用したくない場合は以下で通常のDataFrameへ変換が可能であり、通常のDataFrameである場合、実行マシン上のリソースが使われます。
pd_df = bpd_df.to_pandas()
権限周り
Cloud Functionsで実行する際、以下の権限が必要です。
①BigQueryのジョブユーザ権限
BigQueryのリソースを参照する際に必要な権限です。参照したいProjectに紐づく権限が必要なので、参照するProjectが異なる場合はProjectの管理者に権限付与を行う必要があります。
②Cloud Run 起動元
Cloud Functionsを単体で起動する際は不要なケースがありますが、httpsトリガーや、Workflowsといいった別のPFを経由する場合、実行に必要な権限です。
まとめ
Cloud FunctionsでBigQueryを操作するさいは、bigframesを利用する。
その際に権限周りの追加も必要。
コメント