GAE/go Standard環境でのチュートリアル

GAE/go Standardの立ち上げまでの記録

Posted by roadman on Saturday, December 29, 2018

TOC

  • GAE/Go(1.9) Standardのtutorialです。

公式のチュートリアルをやってみる

ローカルでの起動

  • まずローカル起動してみよう。gcloudのsdkに同梱されているローカル開発用サーバを起動するdev_appserver.pyを使う。

    $ dev_appserver.py app.yaml
    ERROR: Python 3 and later is not compatible with the Google Cloud SDK. Please use Python version 2.7.x.
    
    If you have a compatible Python interpreter installed, you can use it by setting
    the CLOUDSDK_PYTHON environment variable to point to it.
    
  • そういえばローカル環境のpythonを3にしていたが、python2.7系でしか使えないようだ。今時ぃ…。

  • COUDSDK_PYTHONという環境変数を指定すればいいらしいはpyenvを使っていたので、pyenv localで2.7系のversionを指定してしまう。

    pyenv local 2.7.15 
    
  • もう一度起動。

    $ dev_appserver.py app.yaml 
    
  • http://localhost:8080にアクセスすると、hello worldと表示される。

gcpへのdeploy

  • 続けて実際にgae/standard上にデプロイしてみよう。
  • まずgcloundのアカウントを認証する。

    gcloud auth login 
    
  • ブラウザが開くので普通にgoogleアカウントでログインする。

  • ログインが終わったらプロジェクトを作成し、そのプロジェクトを使うようにgcloud config setする。

    gcloud projects create sandbox-gaego 
    gcloud config set project sandbox-gaego
    
  • ちなみにプロジェクトIDは 一意なものでなくてはいけない。 これはアカウント内の一意ではなくGoogle 全体の一意な ID になるようにする。

  • 完了したらdeployしてみよう。

    $ gcloud app deploy
    
  • もうgaeにdeployされて起動している。サイトを見てみよう。

    gcloud app browse 
    
  • ブラウザが開いてhello,worldと表示されるだろう。

packageの分割

  • さて、ここまではgoogleのサンプル通りなのでうまくいくのは当然だ。 少し修正してみる。

    $ tree
    $GOPATH/src/github.com/roadman/sandbox-gaego/
    ├── app.yaml
    ├── main.go
    └── handle
         └── hello.go
    
  • hello.goに含まれていたhandlerだけhandlerパッケージに分けて、main.goでimportしている。普通のgolangプロジェクトでは1ファイルに全部書くなどということはないので、まあよくある形の簡略化版だ。

  • またローカル起動してみると、エラーになる。

    2018/12/29 16:40:12 go-app-builder: Failed parsing input: app file hello.go conflicts with same file imported from GOPATH
    
  • これについてはこちらの記事でも解説されているのだが、gae/goではプロジェクトルート(app.yamlのあるディレクトリ)配下の全てのgoファイルを、import対象の別packageであってもbuildしようとするため、conflictが起こるらしい。

  • まあ、わざわざ別packageをfullpath指定でimportしているのだから、そういう考え方もあるか、という気もするが、既存のgolangでは普通にある構成なので違和感はある。

  • なので、とりあえず以下のような構成にする。

    $ tree
    $GOPATH/src/github.com/roadman/sandbox-gaego/
    ├── appengine
    │   ├── app.yaml
    │   └── main.go
    └── handle
         └── hello.go
    
  • 再度起動するとうまく起動した。

  • プロジェクトルートをGOPATHに指定する方法もあるが、そうなると他のgolang環境と違うし、ソースコード内で指定するimportのpathがこのプロジェクト専用のものになるのはちょっと気持ち悪い。