はじめに
先進サービス開発事業部の山岡です。
GCP DatastoreはSQLコマンドを直接叩いてデータを操作する、というようなことができません。一応GUIから内容を確認して削除したりすることはできますが、簡易的なものであり特に大量のデータに対しては全くの無力です。
わざわざアプリケーション側で削除処理を実装せずとも、公式から削除する方法が提供されていますのでこれについて紹介したいと思います。
Dataflowを使った方法(GUI)
GCPのマネージド分散処理基盤であるDataflowを使った削除方法です(公式資料)。
CREATE JOB FROM TEMPLATE
を押し出てきた設定画面に下記の設定を入力、最後に Run job
ボタンを押すと削除ジョブが動き出します。データが大量にある場合は自動的にスケールアウトされ可能な限り早く処理が終わるように調整してくれているようです。
ちなみにDataflowそのものには課金されませんが、裏で動いているGCEの稼働時間とDatastoreのアクセスは通常通り課金されます。
設定内容:
- Job name
- 単なる表示名なので好きなものでOK(重複可)
- Cloud Dataflow template
Bulk Delete Entities in Cloud Datastore
を選択
- Regional endpoint
- Dataflowのデプロイ先リージョン
- 特段理由がなければDatastoreと同じリージョンが良いでしょう
- GQL Query
- 削除対象となるデータをGQLで指定
- Kind全てを削除する場合は
SELECT * FROM <kindname>
でOK
- Read data from Datastore Project Id of
- 削除対象のDatastoreがあるプロジェクトIDを指定
- Delete all matching entities from the GQL Query present in this Datastore Project Id of
- 削除対象のDatastoreがあるプロジェクトIDを指定
- Temporary Location
- 削除処理中に使うGCSを指定
- 特段こだわりがなければデフォルトバケットの適当なディレクトリ
gs://<project-id>.appspot.com/tmp
で良いでしょう
Dataflowを使った方法(CLI)
下記のようにgcloudコマンドでJobが起動します。Dataflow用のパラメーターは --parameters
配下につなげて指定しますが書き方がやや特殊なので入力ミスにご注意下さい。
$ gcloud dataflow jobs run test-delete \ --gcs-location gs://dataflow-templates/latest/Datastore_to_Datastore_Delete \ --region us-east1 \ --project example-project \ --parameters=datastoreReadGqlQuery="SELECT * FROM kindname",datastoreReadProjectId=example-project,datastoreDeleteProjectId=example-project createTime: '2019-01-17T02:33:10.945987Z' currentStateTime: '1970-01-01T00:00:00Z' id: 2019-01-16_18_33_10-14477596058768437793 location: us-east1 name: test-delete projectId: example-project startTime: '2019-01-17T02:33:10.945987Z' type: JOB_TYPE_BATCH
開始されたJobの進捗を確認したい場合は gcloud dataflow jobs list
で履歴のサマリーが、 gcloud dataflow jobs describe <JOB_ID>
で各ジョブの詳細を確認できます。
$ gcloud dataflow jobs list JOB_ID NAME TYPE CREATION_TIME STATE REGION 2019-01-16_21_51_19-14477596058768437793 test-delete Batch 2019-01-17 05:51:20 Done us-east1 $ $ $ gcloud dataflow jobs describe 2019-01-16_21_51_19-14477596058768437793 createTime: '2019-01-17T05:51:20.093637Z' currentState: JOB_STATE_DONE currentStateTime: '2019-01-17T05:54:03.723475Z' environment: (中略) startTime: '2019-01-17T05:51:20.093637Z' type: JOB_TYPE_BATCH
旧Datastore Adminツールを使った方法
このツールは既にDeprecatedとなっており2019年2月に廃止予定なので今から使うのは止めた方が良いと思いますが、一応紹介します。
下の画像のようにGCPのメニューからDatastore Adminツールを開き、削除したいKind全てにチェックをつけて Delete Entities ボタンを押すとジョブが始まります。
注意点
結果整合
Datastoreは基本的に結果整合性のデータベースなので収束するまでしばらく時間がかかり、削除直後にグローバルクエリーを投げたりすると毎回結果が変わる事象が起きます。公式のアナウンス通り収束にどの程度かかるかはその時々によって変わり確定することはできませんが、特に大量のデータを削除した場合は分単位の時間かかることもありました。
Kind名の指定ミス
存在しないKind名を指定した場合でもエラーにならず削除完了ということで正常終了しますので、消したはずなのに消えていないという場合はKindの指定でタイポしていないかよく確認しましょう。