DatastoreのエンティティをBigQueryに自動でバックアップする

Datastore --エクスポート--> GCS --インポート--> BigQuery

GCSの変更をフックして呼ばれたCloud FunctionsからBigQueryにインポートするAPIを叩く。

GAEのcron.yamlを使って毎晩Datastoreからエクスポートさせると、自動でバックアップがBigQueryに溜まって、データウェアハウスが出来上がるようなことをしました。

 

全体の流れを1文にすると「GAEからcronでDatastoreのエンティティをpubsub Nortificationsを設定したバケットにエクスポートして、pubsub NortificationsでCloud Functionsをコールしてエクスポート済みのエンティティをBigQueryにインポートする」みたいな感じのことをします。

 

事前にバックアップを保存するようのGCSのバケットを作る

Creating Storage Buckets  |  Cloud Storage Documentation  |  Google Cloud

 

DatastoreをGCSにエクスポート

Exporting and Importing Entities  |  Cloud Datastore Documentation  |  Google Cloud

 

BigQueryにインポート

Loading Data From Cloud Datastore Exports  |  BigQuery  |  Google Cloud

 

オブジェクトの変更をフックしてCloud Functionsを呼ぶ

Registering Object Changes  |  Cloud Storage Documentation  |  Google Cloud

 

GAEのcron.yamlを使って定期実行

cron.yaml Reference  |  App Engine standard environment for Go  |  Google Cloud

 

「エクスポートのスケジューリング」っていうド直球なドキュメントもあった(やってることはGAEでcronを叩いてるだけ)

Scheduling an Export  |  Cloud Datastore Documentation  |  Google Cloud

 

バックアップ先のtableを持つBigQueryのDatasetとエクスポートしたエンティティのあるGCSバケットは同じリージョンか、マルチリージョンである必要がある点に注意します。

 

all_namespaces_all_kindsでエクスポートするとBigQuery側で読めなかったので、kindごとにテーブルを作ることになった(色々頑張ったけど、ドキュメントをよく読んだら無理だよって書いてた)

 

テーブルにtime-based partitioningを設定できて、日付ごとに擬似フィールドを使ってパーティションを貼ってくれる機能があったのでそれを使えばいい。

   

前にAWS使ったときはEC2だけしか使わなかったり、Alexa SkillとしてlamdaとS3を連携させたりぐらいしかしたことなかったけど、こんな感じでパブリッククラウド感満載なことをしてみると、いろんなパーツを組み合わせていく感じでちょっと楽しいね。