index.yamlが自動生成されて動かなくなったdev_appserver.pyを元通りにする

kindやAncestorを試しているうちに動かなくなった

開発途中でいきなりdev_appserver.pyが正常に動作しなくなり以下のログを出力しました。状況としては、

  • dev_appserver.pyは起動問題なし
  • localhost:8000で、datastoreをブラウザから見ようとすると、以下と同様なエラーがブラウザーに表示
  • アプリの登録処理ができない

原因は、index.yamlの自動生成

自動でindex.yamlが生成されていた事でした。このファイルは、独自にインデックスを用意する場合に使うのと、開発サーバーが自動生成したインデックスをここに書き込んでくれるようです。

https://cloud.google.com/appengine/docs/standard/go/config/indexconfig

DatastoreのkindやAncestorを試しているうちにこのindex.yamlが作られたようです。

対応方法は、不要なインデックスをindex.yamlから削除

j上記のコメントの後に、自動生成されたインデックスが書かれていますがコメントアウト、または削除しdev_appserve.pyを起動し直せばよいです。inde.yamlファイル自体を削除すると、インデックスが必要というエラーが別に発生しました。

 

その他

この問題を調べているうちに、datastoreの保存先やクリアの仕方が分かりましたのでメモを残しておきます。

clear_datastore=yesでdatastore削除

clear_datastore=yesとclear_search_indexes起動オプションでデータ削除できることが分かりましたが解決できませんでした。

物理的に削除

上記オプションでdev_appserver.pyを起動すると、以下のようappengine.Noneがあり、これを削除すればよいと分かりました。

https://stackoverflow.com/questions/25831141/google-app-engine-datastore-storage-default-path

削除したけれど解決できませんでした。

Ctrl+Cで終了してみると以下のようにpending transactionsと読み取れるのでこの失敗したデータ登録がどこかで保持されているので、データベースを削除しても実行されているようです。

 

 

 

GAE/Go開発メモ

GOOGLE_APPLICATION_CREDENTIALS

AppEngineで各種クライアントライブラリーを使う場合はこれを求められる。日本語情報も豊富にあるので、設定方法は簡単で、ファイルをダウンロードしてpowershellで設定。これで、ローカル開発環境で各種ライブラリーが使えます。

本番環境は自動化されている

本番環境にこのファイルを持っていけばいいのかというと、その必要はなくて サーバー間での本番環境アプリケーションの認証の設定 で、この指定がなければ自動で、デフォルトのサービスアカウント情報を使います。

そのため、ソースコード内には、クライアントライブラリーを使うための認証ソースコードなどがなく(もちろんその方法もあります。)github.comなどでも管理しやすいです。

pyコマンドで、dev_appserver.pyを動かす方法

Windowsでは、Python2と3をインストールしている場合、py -2コマンドでPython2.7を実行します。またSDKのインストール先が、sdk.staging/binになる場合があるので、エクスプローラーで確認する必要あります。(現状再インストールしたら、sdk.stagingはなくなり、sdk/binになりました。)

dev_appserver.pyでサーバーを実行した場合、ファイル監視されているので、Goファイルを修正したら、ブラウザーリロードで変更が確認できます。

本番環境デプロイはgcloudコマンド

少し前までは、Google Cloud SDKではなく、AppEngine SDKのためgoappコマンドがありましたが、今は存在しないので、glcoud app deployで本番環境にデプロイします。

Windows環境でGAE/GoとPythonについて

Google Cloud SDKがPython2.7に依存しているためPythonが必要になります。Windowsの場合は、Python2.7とPython3系を両方インストールすればよいです。現在のPythonはpy.exeで”py -2″でPython2を実行し、”py -3″でPython3を実行できます。

Google Cloud SDKの場所

コマンドプロンプトの場合は、%localappdata%でアクセスします。

“%localappdata%\Google\Cloud SDK\google-cloud-sdk”

PowerShellの場合は、$env:localappdataでアクセスします。

“$env:localappdata\Google\Cloud SDK\google-cloud-sdk”

ちなみにLocalAppDAtaは、C:\Users\<username>\AppData\Local

dev_appserver.pyの場所

Google Cloud SDKの場合は、”$env:localappdata\Google\Cloud SDK\google-cloud-sdk\bin\dev_appserver.py”フルパスで指定するとよいです。

ひとまずフルパスで指定するとよい

数年前はAppEngine SDKがあったので、それを環境変数Pathに設定して、dev_appserver.pyなどを実行していましたが、今は、Google Cloud SDK付属のdev_appserver.pyを使います。

2018年06時点では、Google Cloud SDKで本番にデプロイできますが、単体テストをするためには、AppEngine SDKを使う必要があります。

両方のSDKを環境変数Pathに通すと、「ある日突然、コマンドが動かないトラブルが発生しコードを長時間調べても問題なし、結局Pathの順番が落ちだった。」みたいになりかねないので、理解が深まるまでは、フルパスで実行するのもよさそうです。

Google Cloud SDKインストーラーが正常に動作しない

Google Cloud SDKは、Python依存のためインストーラーが正常に動作しない場合があるようです。エンコードエラーが発生したと表示される場合があります。このような場合は、バージョニングされたアーカイブ で少し前のバージョンをインストールするとうまくいくかもしれません。

私の場合は、更新後問題が発生したため、すべて削除して解決しました。

Google Cloud SDKと App Engine SDKの違い

現在はGoogle Cloud SDKをインストールして、gcloudコマンドで本番環境にデプロイしますが、以前はApp Engine SDKがありappcfgやgoappコマンドがありました。

Unitテストを実行する場合はgoapp testコマンドを実行するので、Google Cloud SDKとApp Engine SDKが必要になります。Google Cloud SDKに統合されていないので、非常に面倒です。

Local Unit Testing for Go

goappコマンドを使えるように一時的にPowershellで環境変数を設定する

Unitテストをするために、App Engine SDKのzipファイルをc:\devに展開しました。powershellでは、環境変数のダイアログではなく、起動しているPowershellのコンソールのみに以下のように適用できます。

 

GAE/Goの単体テストが重すぎる

Corei5 3GhzのPCで以下のdatastoreにデータを1つ登録、取得し確認するのに、30秒ぐらいかかります。

goapp testコマンドを実行すると以下のようにログが出力されて、go-app 11.997sと最終行に出ていますが、ログが表示されるまでに10秒以上かかる場合があります。

 

Cloud Datastoreの親子関係

以下のデータ構造はよくあります。

  • ユーザー毎のブログデータを作る
  • カテゴリ分けした記事を作る
  • ディレクトリーに分けて、ファイルを保存する

このような親子関係で分類したデータをCloud Datastoreで作る場合は、Cloud Database – データの整合性 を読むと解決できそうです。祖先クエリーや、エンティティグループという概念があるので、これで作れます。またカテゴリー分けしたTodoListのサンプルコードもあるので、これをベースにするとすぐに実装できそうです。

チュートリアル

Windows10でdev_appserver.pyを実行する時は、pyコマンドとフルパスで指定するとうまくいく

AppEngineのGoのチュートリアルをWindows10で試したら以前は動いていたのにバージョンが上がって動かなくなりました。いろいろ調べたらWindowsの場合はいくつか注意点がありました。結果的には以下のコマンドでdev_appserver.pyを動かせました。

Windowsで使うときの注意点

  • Python2、Python3はpyコマンドで使い分ける
  • Google Cloud SDKのインストール先を再確認。(アップデートなどでディレクトリーが変わるようです。)

また、先ほどのように、フルパスでdev_appserver.pyスクリプトを指定するのが無難なようです。

 

Python2とPython3をインストールしてpyコマンドを使えるようにしておく

Google AppEngineはPython2に依存するので、Windows10では、Python2とPython3をインストールしてpyコマンドでPython2を起動するようにします。また、

Cloud SDKのパスを理解しておく

Cloud SDKは以下のどちらかにインストールされています。私の場合は以前はgoogle-cloud-sdkにdev_appserver.pyなどがインストールされていましたが、アップデートのタイミングなどで、google-cloud-sdk.stagingにスクリプトなどが移動されてました。

C:\Users\<USERNAME>\AppData\Local\Google\Cloud SDK\google-cloud-sdk\

C:\Users\<USERNAME>\AppData\Local\Google\Cloud SDK\google-cloud-sdk.staging\

環境変数のおさらい

Windowsのコマンドプロンプトでは、以下の環境変数で、ユーザー毎の情報が取得できます。

  • %homepath%で、c:\User\<USERNAME>
  • %appdata%で、C:\Users\<USERNAME>\AppData\Roaming
  • %localappdata%で、C:\Users\<USERNAME>\AppData\Local

Powershellの場合は$env:で取得できます。

  • $env:homepath
  • $env:appdata
  • $env:localappdata