Serverless FrameworkでGCS->Cloud Functions->BigQueryの処理を書いてみる

タイトルにもある以下のような処理を簡易的にServerless Frameworkにて実装してみました。

bq load などのコマンドでも実装できそうな内容なのですが、Serverless FrameworkとGoogle Cloudの周りを調べたついでに作ってみました。

前提準備

Serverless Framework準備

Serverless FrameworkのVersion3で作成しています。入っていない場合はインストールしてください。

npm install -g serverless

Credentialの取得

サービスアカウントの鍵情報を保存しておくか、または既に権限があれば以下のコマンドでも取得可能です。

gcloud auth application-default login

上記のコマンドを使った場合は、Credentialは ~/.config/gcloud/application_default_credentials.json のファイルとして保存されます。

ソースコード取得

以下に公開しているので、cloneして使います。

github.com

git clone https://github.com/yomon8/google-serverless-framework-sample.git

デプロイ

Configファイルを修正

サンプル用のコンフィグファイル (./config.sample.yml )が準備してあります。

---
location: asia-northeast1
project: your-project-name
credentialFilePath: ~/.config/gcloud/application_default_credentials.json
gcs:
  bucketName: your-bucket-name
  objectCharset: utf8
  fieldDelimiter: ___
bigquery:
  dataset: yourdataset
  table: sls_sample_table

./config.yml にコピーして修正します。最低限以下の3つを自身の環境向けに修正すれば動くと思います。

  • project
  • gcs.bucketName
  • bigquery.dataset
cp ./config.sample.yml config.yml

デフォルトでは、指定したGCSバケットと、BigQueryデータセットが新規作成されます。もし既存のGCSバケットとBigQueryデータセットを利用したい場合は、 serverless.ymlresources セクションを削除、またはコメントアウトしてください。

resources:
  resources:
    - type: storage.v1.bucket
      name: ${self:custom.config.gcs.bucketName}
# 省略

この手順では以下のように config.yml を設定してみます。

※ 他のリソースは削除しますが、projectだけは公開できないので自身のもに読み替えてください

---
location: asia-northeast1
project: your-project-id #自身のプロジェクトIDを指定してください
credentialFilePath: ~/.config/gcloud/application_default_credentials.json
gcs:
  bucketName: otomo-bucket
  objectCharset: utf8
  fieldDelimiter: ___
bigquery:
  dataset: otomo_ds
  table: sls_sample_table

Serverless Frameworkのプラグインをインストール

Serverless FrameworkのCloud Functions用のプラグインをインストールします。

serverless plugin install -n serverless-google-cloudfunctions

Serverless Frameworkにてデプロイ

デプロイ自体は以下のコマンドを実行するのみです。5分くらいかかる場合があります。

sls deploy

動かしてみる

GCSてファイルをコピー

以下のような ___ を区切り文字とした ./test_data.txt が準備してあります。

foo___1___2021-01-02
bar___2___2021-01-07
baz___2___2022-12-02

これをバケットにコピーしてみます。

gsutil cp ./test_data.txt gs://otomo-bucket/

GCSにファイルが置かれるとイベントが発行され、Cloud Functionsが動きます。以下のコマンドでCloud Functionsのログを確認できます。

sls logs --function loadToBq --tail    

BigQuery側を確認

BigQueryに先程の ___ 区切りのファイルの内容がロードされているはずなので、クエリを投げてみると、データがロードされているのが確認できます。

$ bq query "select * from otomo_ds.sls_sample_table"                                                                                                                                                                                                            
  
+------+----+------------+
| name | no |    date    |
+------+----+------------+
| foo  |  1 | 2021-01-02 |
| bar  |  2 | 2021-01-07 |
| baz  |  2 | 2022-12-02 |
+------+----+------------+

掃除

BigQueryやGCSはデータが入っていると Dpeloyment Managerから削除失敗するので、最初に空にしてから Sererless Frameworkから削除します。

# GCSとBQを空にする
bq rm otomo_ds.sls_sample_table
gsutil rm gs://otomo-bucket/**

# Serverless Frameworkで削除
sls remove

参考情報

github.com