GAE/GoでDatastoreのExport/Import機能を使って日次バックアップをスケジューリングする

TABI LABOのinottiです。

Cloud DatastoreのフルマネージドExport/Import機能が半年間のベータリリース期間を経て2018年2月に正式リリースとなりました。

従来バックアップに使われていたCloud Datastore Adminバックアップ機能は来年2月で廃止となります。

従来の機能と比較してエクスポート速度が改善されていたり、Datastore Admin APIとしてDatastore APIと同形式のAPIが提供されていたりもするので、これからDatastoreでバックアップをとろうとしているのであれば、こちらのExport/Import機能を利用することになるかと思います。

今回、このExport/Import機能を利用したバックアップ取得のGAE/Goでの実装、cronジョブによるスケジューリング、バックアップされたデータをインポートしてDatastoreをリストアする手順をまとめてみました。

準備

DatastoreからのExport先はCloud Storageになるので、Cloud Storageにバックアップデータを保存するバケットを作成します。ストレージクラスはMulti-RegionalまたはRegionalを指定します。ロケーションはDatastoreのロケーション(プロジェクトのロケーション)に合わせる必要があります。

バケットが作成できましたら、GAEからバケットにデータを転送するために、バケットの権限を編集し、App Engineデフォルトサービスアカウント([プロジェクトID]@appspot.gserviceaccount.com)にストレージのオブジェクト管理者権限を付与します。

次に、GAEからCloud DatastoreのExport/Import機能を利用するために、IAMでApp EngineデフォルトサービスアカウントにCloud Datastoreインポート/エクスポート管理者権限を付与します。

実装

GAE/Goでの実装はこのようになります。

cron.yaml

main.go

アクセストークンの取得の際に、必要なスコープは以下の2つです。

  • https://www.googleapis.com/auth/datastore
  • https://www.googleapis.com/auth/cloud-platform

今回は利用しませんでしたが、Datastore Admin API呼び出し時にentity_filterパラメータでエクスポート対象とするkindやnamespaceを指定することも可能です。

Export

作成したコードとcron.yamlをGAEにデプロイし、App Engineコンソールの[タスクキュー] -> [cronジョブ]から実行してみます。

無事成功しました。今回1GB程度のデータをバックアップしたのですが、タスクの正常終了後、Cloud Storageバケットにデータが配置されるまで5分程度かかりました。

Import

次にバケット上にエクスポートされたデータをDatastoreに手動でインポートしてみます。ちなみにDatastore Admin APIでImportすることも可能です。

まず、データストア管理ツールでDatastore上の全エンティティを削除し空の状態にします。

インポート機能は現時点でus-central1上のCloud Storageバケットでのみ実行可能なため、us-central1に新規バケットを作成し、エクスポートしたデータを転送します。

インポートはgcloudコマンドで実行します。

およそ30分程度で完了しました。Datastoreコンソール上でインポートされたデータも確認できました。

まとめ

以上になります。シンプルなAPIを呼び出すだけなので、権限の設定にさえ注意しておけば、さくっと動かすことができると思います。

Datastoreは標準で冗長性を備えているとはいえ、アプリの誤動作や人為的なオペレーションミスによって重要なデータを喪失してしまう可能性を残しています。ビジネスアプリケーションで利用するのであれば、しっかりバックアップをとって安全性を担保しておきましょう。

参考