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を連携させたりぐらいしかしたことなかったけど、こんな感じでパブリッククラウド感満載なことをしてみると、いろんなパーツを組み合わせていく感じでちょっと楽しいね。