今回はGoogleCloudPlatformのDatastoreの自動バックアップの取り方を紹介します
#前提
- Datastoreにエンティティが存在する
#手順
##1,Storageでバックアップするためのバケットを作ります
GoogleCloudPlatformStorageへアクセスし、プロジェクトを選択します
- バケットに名前を入れる
- 英数小文字で名前を入れましょう(今回はbackup_qiitaでやります)
- データの保存場所の選択
- Region:特定の地理的な場所
- Multi-region:米国などの2つ以上の地理的な場所を含む広い地理的な場所
- Dual-region:フィンランドやオランダなどペアを示すの特定の地理的な場所
[詳しくはこちら](https://cloud.google.com/storage/docs/locations?_ga=2.5981299.-176719181.1568084299)
- データのデフォルトのストレージ クラスを選択する - Standard:短期間のストレージや頻繁にアクセスされるデータに最適 - Nearline:アクセス頻度が月1回以下のデータやバックアップに最適 - Coldline:アクセス頻度が年1回以下のデータやバックアップに最適 - オブジェクトへのアクセスを制御する方法を選択する - きめ細かい管理 - 均一 - 詳細設定(省略可)設定ができたら[作成]を押します
こんな感じでバックアップを入れるバケットができました。
では次にバケットにバックアップを入れるための設定を行います
##2,Datastoreのエンティティを受け取り、バックアップを取るソースコードを作成する
ここではhttps://cloud.google.com/datastore/docs/schedule-export?hl=jaを
参考にしながらYaml、Pythonで追加していきます。
まずはYamlで**[app.yaml]**を作成します。(既にある場合はフォルダを作成しその中に作成しましょう)
←こんな感じに私はbackupフォルダで置いてます
ここのapp.yamlはPythonの設定をするために用意します。
runtime: python27
api_version: 1
threadsafe: true
service: cloud-datastore-admin
libraries:
- name: webapp2
version: "latest"
handlers:
- url: /cloud-datastore-export
script: cloud_datastore_admin.app
login: admin
では次にPythonで**[cloud_datastore_admin.py]**も用意しましょう
import datetime
import httplib
import json
import logging
import webapp2
from google.appengine.api import app_identity
from google.appengine.api import urlfetch
class Export(webapp2.RequestHandler):
def get(self):
access_token, _ = app_identity.get_access_token(
'https://www.googleapis.com/auth/datastore')
app_id = app_identity.get_application_id()
timestamp = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
output_url_prefix = self.request.get('output_url_prefix')
assert output_url_prefix and output_url_prefix.startswith('gs://')
if '/' not in output_url_prefix[5:]:
# Only a bucket name has been provided - no prefix or trailing slash
output_url_prefix += '/' + timestamp
else:
output_url_prefix += timestamp
entity_filter = {
'kinds': self.request.get_all('kind'),
'namespace_ids': self.request.get_all('namespace_id')
}
request = {
'project_id': app_id,
'output_url_prefix': output_url_prefix,
'entity_filter': entity_filter
}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + access_token
}
url = 'https://datastore.googleapis.com/v1/projects/%s:export' % app_id
try:
result = urlfetch.fetch(
url=url,
payload=json.dumps(request),
method=urlfetch.POST,
deadline=60,
headers=headers)
if result.status_code == httplib.OK:
logging.info(result.content)
elif result.status_code >= 500:
logging.error(result.content)
else:
logging.warning(result.content)
self.response.status_int = result.status_code
except urlfetch.Error:
logging.exception('Failed to initiate export.')
self.response.status_int = httplib.INTERNAL_SERVER_ERROR
app = webapp2.WSGIApplication(
[
('/cloud-datastore-export', Export),
], debug=True)
このように入力ができたならデプロイを行いましょう
1.gcloudが適正なプロジェクトに対して構成されるように[config set]を使います
gcloud config set project [プロジェクト名]
2.[app.yaml]をプロジェクトにデプロイ ※[app.yaml]が置かれているディレクトリを間違えないように!!
gcloud app deploy
上手くデプロイできたら自動バックアップの下準備が完了です。
次で自動化させていきます。
##3,cronジョブで自動的に実行するように設定する
ここもhttps://cloud.google.com/datastore/docs/schedule-export?hl=jaを参考に進めていきます
まずGCPのschedule-datastore-exportsを呼び出すcronジョブを設定するために
**[cron.yaml]**を作成します。
cron:
- description: "説明文"
url: /cloud-datastore-export?output_url_prefix=gs://[バケット名]
target: cloud-datastore-admin
timezone: Asia/Tokyo
schedule: every 12 hours
これで問題なければデプロイを行いましょう
gcloud app deploy cron.yaml
####詳しく設定する場合 ~選択範囲~
バックアップする際、特定の種類のエンティティのみをエクスポートする場合はkindを使いましょう
url: /cloud-datastore-export?output_url_prefix=gs://[バケット名]&kind=[エンティティの種類の名前]
特定のものを複数指定することも可能です
url: /cloud-datastore-export?output_url_prefix=gs://[バケット名]&kind=[エンティティの種類の名前]&kind=[エンティティの種類の名前]
特定のエンティティに名前空間が存在する場合にエクスポートする場合は
url: /cloud-datastore-export?output_url_prefix=gs://[バケット名]&kind=[エンティティの種類の名前]&kind=[エンティティの種類の名前]
と入力してあげると細かく設定をしてあげることもできます
####詳しく設定する場合 ~時間設定~
バックアップが実行する時間は**[schedule]**に時間を指定してあげましょう
現在は12時間毎に1回バックアップを実行する設定にしてありますが、1日に1回なら
schedule: every 24 hours
毎日00:00にバックアップを実行する場合は
schedule: every day 00:00
など幅広く設定することができます
詳しくはhttps://cloud.google.com/appengine/docs/flexible/java/scheduling-jobs-with-cron-yaml?hl=ja#defining_the_cron_job_scheduleに詳細が載っております
ちなみにバックアップを実行する基準時間を日本時間に設定する場合は
timezone: Asia/Tokyo
とすれば日本時間で行われます。
##4,cronジョブの実装
####実際に動くかテストしてみよう
AppEngineのcronジョブがこのように表示していればcronが上手くできています
さてさて[今すぐ実行]で動かしてみましょう
いざ!
ワーオ、エラッター(´゚д゚`)
そんなときはログの[表示]でエラーを見ましょう
####ログでエラーを見る
ログを表示してみたところ、403と出ていますね
開くと"The caller does not have permission"と書かれてますね…
つまりは「インポート、エクスポートにおける権限持ってねーです」ってことですね
じゃあ権限を与えにいきましょう
####権限を与える
IANと管理でIAMを開きます
その中で[プロジェクトID]@appspot.gserviceaccount.comを編集しましょう
[別の役割を追加]を押して
Datastoreの[CloudDatastoreインポート/エクスポート管理者]を選択して保存!
ということでもう一度実行しに戻りましょう
もう一度[今すぐ実行]を押すと…
できました!!
これで12時間毎にデータを取ってくれるようになりました!
##最後に
皆様いかがでしたでしょうか、上手くいきましたか?
私はこの解説が上手くいったかがヒヤヒヤしてます(´゚д゚`)
でもこのようにDatastoreのデータをバックアップしておくと
人為的なミスで消したり、何かしらのトラブルにも対応できますので
やってて損はないと思います
では長くなりましたがありがとうございました!!
##参考URL
https://cloud.google.com/storage/docs/locations?_ga=2.5981299.-176719181.1568084299
https://cloud.google.com/datastore/docs/schedule-export?hl=ja