ちょろっと書いたGAE/Goアプリで、チェック等のために本番環境のDatastoreをローカルにコピって来たい時がある。探すとbulkloaderなどの情報がちらほらと手に入るのだが、どうも古いし断片的。ということで、2016年版をまとめてみた。
前提
- GAE/Go環境でアプリが動かせていること
準備
準備はここに書いてある:https://cloud.google.com/appengine/docs/go/tools/remoteapi/
app.yamlでremote_apiを有効にする
- url: /_ah/remote_api
script: _go_app
アプリケーション側でremote_apiをハンドリングする
と言ってもパッケージをインポートするだけ
import _ "google.golang.org/appengine/remote_api"
デプロイする
goapp deploy
データのダウンロード
appcfg.pyでdownload_dataを使う。
appcfg.py download_data --application="app-id" --url="https://app-id.appspot.com/_ah/remote_api" --filename=dump.datastore
ローカル環境へのアップロード
ローカル環境を起動しておく
goapp serve
ちなみに今のローカルdatastoreの中を消すには-clear_datastoreオプションをつけよう。
INFO 2016-08-28 08:56:42,616 devappserver2.py:769] Skipping SDK update check.
INFO 2016-08-28 08:56:42,661 api_server.py:205] Starting API server at: http://localhost:64056
INFO 2016-08-28 08:56:42,665 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO 2016-08-28 08:56:42,669 admin_server.py:116] Starting admin server at: http://localhost:8000
別ターミナルでupload_dataする
ローカルサーバ起動時のログで、APIサーバが何かしらのポート番号で起動しているはず(Starting API server at: http://localhost:64056
)。これを使うと良いらしい。また、指定するアプリケーション名が "dev~*" になっていることにも注意する。
appcfg.py upload_data --application="dev~app-id" --url="http://localhost:64056" --filename=dump.datastore
無事アップロードできました!
access_token is expired. と言われはじめたら
これはローカル環境に持ってくる時だけの話ではないのだけれど、アクセストークンの期限切れを指摘される時がある。再取得したいのだが、いまいち正式なやり方がわからない。トークンはホームディレクトリ下に隠しファイルで存在しているので、 rm ~/.appcfg_oauth2_tokens
してから実行するとトークンが新しくなる。