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

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

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

# 問題点
[StackOverflow の質問](https://stackoverflow.com/a/42312241/2500650) によると、

```bash
$ 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](http://dackdive.hateblo.jp/entry/2014/11/22/155020 "zsh + virtualenv環境でGoogle Cloud SDKをインストール - dackdive's blog") を参考に、直接 Python の実行環境を指定してインストールスクリプト類を叩きに行くことにする。
以下では、公式からダウンロードして解凍した `google-cloud-sdk/` を、仮に `/Users/keisuke.nakata/bin/google-cloud-sdk/` に置いたものとして話をすすめる。

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

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

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

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

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

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

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

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

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

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

```bash
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 が欲しかった)

```bash
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 の開発サーバが立ち上がっている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62450/ce3cb5b2-9f69-2bd7-b6ce-b7d6bed43ceb.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62450/094c0191-9e44-fead-9afa-14f36d728fcd.png)


# 副作用

補完が効かない。

# 参考資料
- [zsh + virtualenv環境でGoogle Cloud SDKをインストール - dackdive's blog](http://dackdive.hateblo.jp/entry/2014/11/22/155020 "zsh + virtualenv環境でGoogle Cloud SDKをインストール - dackdive's blog")
- [python - Is there any way to use gcloud with python3? - Stack Overflow](https://stackoverflow.com/questions/38113281/is-there-any-way-to-use-gcloud-with-python3/42312241#42312241 "python - Is there any way to use gcloud with python3? - Stack Overflow")
- [Using the Local Development Server  |  App Engine standard environment for Python  |  Google Cloud Platform](https://cloud.google.com/appengine/docs/standard/python/tools/using-local-server#Python_Running_the_development_web_server "Using the Local Development Server  |  App Engine standard environment for Python  |  Google Cloud Platform")
- [Download the SDK for App Engine  |  App Engine standard environment for Python  |  Google Cloud Platform](https://cloud.google.com/appengine/docs/standard/python/download "Download the SDK for App Engine  |  App Engine standard environment for Python  |  Google Cloud Platform")