タイトルにもある以下のような処理を簡易的に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して使います。
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.yml
の resources
セクションを削除、またはコメントアウトしてください。
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