APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

GCP DatastoreのKindを一括削除する

はじめに

先進サービス開発事業部の山岡です。

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 で良いでしょう

f:id:ryo-yamaoka:20190117154155p:plain

f:id:ryo-yamaoka:20190117154207p:plain
Dataflow template 設定画面

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 ボタンを押すとジョブが始まります。

f:id:ryo-yamaoka:20190117153524p:plain
Datastore Admin

f:id:ryo-yamaoka:20190117153543p:plain
Datastore Admin Tool

注意点

結果整合

Datastoreは基本的に結果整合性のデータベースなので収束するまでしばらく時間がかかり、削除直後にグローバルクエリーを投げたりすると毎回結果が変わる事象が起きます。公式のアナウンス通り収束にどの程度かかるかはその時々によって変わり確定することはできませんが、特に大量のデータを削除した場合は分単位の時間かかることもありました。

Kind名の指定ミス

存在しないKind名を指定した場合でもエラーにならず削除完了ということで正常終了しますので、消したはずなのに消えていないという場合はKindの指定でタイポしていないかよく確認しましょう。