[memo] BigQueryのScheduleとCloud FunctionsでGCSにテーブル情報を送信


TODO

BigQueryにて設定したスケジュールが実行完了後にGCSにテーブル情報をCSVに変換してファイルを送信するようにする

  • Pub/SubをトリガーにしたCloud Functionsの送信処理の実装
  • BigQueryでスケジュールの設定

Pub/SubをトリガーにしたCloud Functionsの送信処理の実装

Pub/Subの設定

  1. Cloud FunctionsのトリガーとなるTopic IDを入力

例: 「example-1」を設定

Cloud Functionsの設定

トリガーが発火した際に
GCSにBQのテーブルを参照して
CSVを送信するようにするスクリプトを配置

  1. トリガーは「Cloud Pub/Sub」で設定する 上記で、「example-1」を選択
  2. 言語は好みで、今回はPythonでインラインの実装

REQUIREMENTS.TXT では必要なモジュールなどを記載
MAIN.PY で実際に動作するものを記載

実装内容は「BQ上で昨日のテーブルの情報をGCSに送るようにする」といった内容

  • REQUIREMENTS.TXT
# pip でインストールされるもの
google-cloud-bigquery
  • MAIN.PY
from google.cloud import bigquery
from datetime import date, timedelta
def export_table(event, context):
    client = bigquery.Client()
    yesterday = date.today() - timedelta(days=1)
    project = "project_name"
    dataset_id = "data_set_name"
    table_id = "table_name_yyyymmdd_" + yesterday.strftime('%Y%m%d')
    destination_uri = "gs://{}/{}".format("dir_name", yesterday.strftime('%Y%m%d')+".csv")
    dataset_ref = client.dataset(dataset_id, project=project)
    table_ref = dataset_ref.table(table_id)
    extract_job = client.extract_table(
    table_ref,
    destination_uri,
    location="US",
    )
    extract_job.result()

最後に「export_table」を実行関数として入力

BigQueryでスケジュールの設定

BigQueryの機能の一つとして提供されている「スケジュール」があるので、利用する

有効なクエリを記載し、そのスケジュールの新規作成から入る

下の方にあるPub/Subの入力で「example-1」を設定することによって、
テーブルが生成されたタイミングでトリガーが発火するようになる。

以上で、BigQueryにて設定したスケジュールが実行完了後にGCSにテーブル情報をCSVに変換してファイルを送信するようになる

あとがき

Rundeckのオンプレのサーバをクラウドに移行した際に
サービスアカウントが切り替わっており、GSの実行権限が付与されてなかった。
内容自体は「BQ内で完結するテーブル生成」と「GCSにそのテーブルデータを送信」といった
結構小規模な機能の利用だったので、GCPで完結するようにした。

大した内容では無いので、ココで実装したメモを残します。