DataStoreのデータをBigQueryにインポートする

GAE/goでサービス運用中
DataStoreをメインで使ってる
redash用のgceサーバーがあり


やるとこ

1. DataStoreのバックアップをGCS(Google Cloud Storage)に保存する
2. GCSのバックアップをBigQueryにロードする
3. gceのサーバーにcron登録する


やったこと


環境が整って入れば以下のスクリプトをcron登録すればOK


#!/usr/bin/env bash

set -e

PROJECT="[プロジェクトID]"
BUCKET="[バケット]"
KINDS=("KIND1" "KIND2")

# kindsをカンマ区切りにする
kinds_str="$(IFS=,; echo "${KINDS[*]}")"

gcloud config set project ${PROJECT}

# 前回のファイルが残っている場合、削除する
gsutil -m rm -rf gs://${BUCKET}

# バックアップ作成
gcloud beta datastore export --kinds="$kinds_str" --format=json gs://${BUCKET}


# インポートする
for x in ${KINDS[@]}
do
    echo import ${x}
    bq load --project_id=${PROJECT} --headless --source_format=DATASTORE_BACKUP --replace datastore.${x} ${BUCKET}/all_namespaces/kind_${x}/all_namespaces_kind_${x}.export_metadata
done

1つずつ説明


1. DataStoreのバックアップを作成




gcloud beta datastore export --kinds="KIND1, KIND2" --format=json gs://${BUCKET}


--kindを指定しなければ全てのkindを作成する

またすでにexport先にbacketが存在する場合、エラーになるので、実行する前にファイルを削除する


gsutil -m rm -rf gs://${BUCKET}


2. GCSのバックアップをBigQueryにロードする

    bq load --project_id=${PROJECT} --headless --source_format=DATASTORE_BACKUP --replace datastore.[table name] ${BUCKET}/all_namespaces/kind_[KIND1]/all_namespaces_kind_[KIND1].export_metadata

--replaceを指定しないと追加される


3. gceのサーバーにcron登録する


デフォルトの権限設定ではdatastoreやBigQueryのアクセス時に権限エラーとなる

Computer Engineではデフォルトでサービスアカウントが追加されている

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

このアカウントに対して、IAMで権限を付与しても権限エラーは直らない

一度vmを停止してから設定を変更する





















$ crontab -e
0 15 * * * /home/username/load_datastore.sh


0 件のコメント:

コメントを投稿

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...