pyenv 環境で Google Cloud SDK をインストールする


Google Cloud SDK は Python2 系しか対応しておらず、しかもだいぶ古いまま放置されているようで、pyenv (+virtualenv) 環境下でインストールを試みると色んな所がぶっ壊れる。

やりたいこと

pyenv virtualenv 2.7.12 gcloudsdk で作成した Python2 の環境の下に Google Cloud SDK をインストールしたい。システム環境を汚染してほしくない。

問題点

StackOverflow の質問 によると、

$ export CLOUDSDK_PYTHON=$(which python2)
$ ./install.sh

とすれば動くらしいが、勿論 pyenv 環境だとうまくいかない。
$(which python2) を、作成した環境に合わせて /Users/keisuke.nakata/.pyenv/versions/gcloudsdk/bin/python2 などとして直接 pyenv の Python 実行環境を読みに行かせてもダメ。
(ImportError: No module named platform で怒られる。Python のライブラリをうまく読みにいけていないっぽい)

解決への道のり

そこで、zsh + virtualenv環境でGoogle Cloud SDKをインストール - dackdive's blog を参考に、直接 Python の実行環境を指定してインストールスクリプト類を叩きに行くことにする。
以下では、公式からダウンロードして解凍した google-cloud-sdk/ を、仮に /Users/keisuke.nakata/bin/google-cloud-sdk/ に置いたものとして話をすすめる。

まず、Google Cloud SDK を実行したい Python 実行環境のパスを設定する:

export CLOUDSDK_PYTHON=/Users/keisuke.nakata/.pyenv/versions/gcloudsdk/bin/python2

上記は ~/.bash_profile あたりにでも書いておけばよい。

そして、 install.sh を叩きたい。こいつを叩こうとするとハマったので、内部で実行しているスクリプトを直接叩きに行く:

$CLOUDSDK_PYTHON /Users/keisuke.nakata/bin/google-cloud-sdk/bin/bootstrapping/install.py

エラーが出ずに、色々聞かれ始めれば OK (統計情報送っていい?とか、デフォルトアカウントは?とか、そういうやつ)
終わったら、一旦シェルを再起動。

次に、 gcloud init 的なものを実行したい。しかし、ここでもまたハマるので、こいつも直接叩きに行く:

$CLOUDSDK_PYTHON /Users/keisuke.nakata/bin/google-cloud-sdk/lib/gcloud.py init

ブラウザが立ち上がって認証を求められるはず。

ここまでくれば、後は gcloud コマンドにエイリアスをかければよい。~/.bash_profile あたりに、

alias gcloud="$CLOUDSDK_PYTHON /Users/keisuke.nakata/bin/google-cloud-sdk/lib/gcloud.py"
alias dev_appserver="$CLOUDSDK_PYTHON /Users/keisuke.nakata/bin/google-cloud-sdk/bin/dev_appserver.py"

を追記 (して source)。もしも dev_appserver 以外のコマンドも実行したい場合は、同じようにエイリアスを張ればOKだと思う。

ローカルに AppEngine の開発サーバを立ち上げてみる

(もともとこれをやりたいために Google Cloud SDK が欲しかった)

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cd python-docs-samples/appengine/standard/flask/hello_world
pip install -t lib -r requirements.txt  # flask は AppEngine に含まれていないので、lib/ 以下に配置しておく必要がある
dev_appserver $PWD

で、

INFO     2017-11-06 12:53:51,688 devappserver2.py:116] Skipping SDK update check.
INFO     2017-11-06 12:53:51,841 api_server.py:313] Starting API server at: http://localhost:62371
INFO     2017-11-06 12:53:51,844 dispatcher.py:226] Starting module "default" running at: http://localhost:8080
INFO     2017-11-06 12:53:51,849 admin_server.py:116] Starting admin server at: http://localhost:8000

みたいなログが表示されたらブラウザで localhost:8000 に飛べばローカルで AppEngine の開発サーバが立ち上がっている。

なんか色々古いが、たぶん問題なく動いている。

副作用

補完が効かない。

参考資料