思ってることってこんなもんだよ
異なるプロジェクト間でのDatastoreエンティティのコピーの方法

Google Cloud Platform(GCP)の代表的なデータベースの一つであるCloud Datastore。GCPの使い方として、例えばStaging環境とProduction環境を別々のGCPプロジェクトとして作っている場合には、時としてそれらプロジェクト間を跨いでCloud Datastoreの中に入っているエンティティ群を移行(エクスポート&インポート)したいときもあるかと思います。

ここでは、異なるプロジェクト間でのDatastore内のエンティティをコピーするための手順を紹介したいと思います。

コピー先のプロジェクトのサービスアカウントをメモする

まず、コピー先のプロジェクトにあるサービスアカウントのメールアドレスを確認します。基本的には、プロジェクト作成時に自動的に作られているサービスアカウントを使うと良いかと思います。

Google Cloud Platform Consoleの「IAMと管理」->「サービスアカウント」にいくと、おそらく <Project ID>@appspot.gserviceaccount.com という感じのサービスアカウントがあると思います。このアドレスをどこかにメモしておきます。

コピー元のCloud Datastoreをエクスポートする

次に、Google Cloud Platform Consoleでコピー元のプロジェクトを選択して、そのCloud Datastoreのページに移動します。その画面の上に「エクスポート」ボタンがあるので、それを押してエクスポート画面を出します。

エクスポートしたい名前空間と種類を選択します。そして、エクスポート先はCloud Storageになるので、どこか選択します。もしなければ、エクスポート専用のバケットを作って、そこを指定してください。

エクスポートしたい種類が全部の場合は、「すべての種類」を選べば良いです。そうではなく特定の種類をエクスポートしたい場合は、エクスポートしたい種類ごとに一回一回エクスポートを行ってください。僕が試した際には、カンマ区切りで複数の種類を同時に指定しても、うまく行きませんでした。エクスポート先は同じで大丈夫です。自動的に日時のフォルダが作られて重複が避けられるようになってます。

コピー元のCloud Storageにコピー先の権限を追加する

コピー元のプロジェクトのCloud Storageにあるエクスポートファイル群を、コピー先のプロジェクトから見えるようにします。そのために、コピー先のプロジェクトにあるサービスアカウントを、コピー元のプロジェクトのCloud Storageに追加します。

  1. Google Cloud Platform Consoleにて、コピー元のプロジェクトのCloud Storageの画面に移動して、エクスポートした際に選択したバケットを選びます。
  2. 「権限」というタブがあるので、それをクリックします。
  3. 「メンバーを追加」ボタンを押します。
  4. 先ほどメモしたサービスアカウントのメールアドレスを入力します。そして、以下の役割を追加します。
    • ストレージのレガシーバケット読み取り
    • ストレージオブジェクト閲覧者
  5. 「保存」ボタンを押します。

コピー元のエクスポートされたファイルのURIをメモする

コピー元のエクスポートされたファイルのURIをメモしておきます。メモしておくURIは、 *.overall_export_metadata という形式のファイルです。具体的には、URIの形式は gs://<Bucket Name>/<DateTime>/<DateTime>.overall_export_metadata となるかと思います。

複数の種類をエクスポートした場合は、種類ごとにURIをメモしておきます。

コピー先のCloud Datastoreにインポートする

Google Cloud Platform Consoleにてコピー先のプロジェクトのCloud Datastoreの画面に移動して、上にある「インポート」をクリックします。そして、種類ごとにインポートを行います。その際に、以下の入力を行います。

  1. ソースは、上記でコピーしたURIから gs:// を取り除いた文字列を指定します。具体的には、 <Bucket Name>/<DateTime>/<DateTime>.overall_export_metadata となります。
  2. 名前空間と種類は、どちらも「すべての〜」を選択します。

この手順を種類ごとに繰り返せば、コピーは完了です。

不要な権限を削除する

コピーが終わってしまえば、追加したメンバーと役割は不要になるので、コピー元のプロジェクトのCloud Storageの権限タブから、対象のメンバーを削除します。

まとめ

異なるプロジェクト間のDatastoreエンティティのコピーは、ズバリの機能がないので最初「あれ?」と思いましたが、ようは権限さえあれば大丈夫、という感じになってます。わかってしまえばシンプルですので、参考になさってください。