emahiro/b.log

Drastically Repeat Yourself !!!!

CLOUD SDK で python2 系が切られて aetest が落ちるようになった問題

Overview

Update to Pyhon3 にて Goole Cloud SDKを同梱した Docker Image 本体にて Python2 のサポートが切られたために、Python2 系でのみ動作する App Engine を起動するコマンドの dev_appserver.py が動作せず、本家の Google Cloud SDK - Dockerfile を使用して aetest を走らせてる場合(CI上などで)は、App Engine のインスタンスの起動に失敗して CI が落ちる、という挙動を確認しました。

対応方法

  1. 上記の変更が入る前の dockerfile image を使って自前でビルドしたイメージを使う。
  2. dev_appserver.py を起動するときに CLOUDSDK_PYTHON=pyhon2.7 を指定する。

調査方法

調査した方法をログでまとめました。

エラーを観測する

Traceback (most recent call last):
     File "/usr/lib/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 95, in <module>
       assert sys.version_info[0] == 2
   ... unable to find admin server URL

どうやら dev_appserver.py の実行に失敗し、App Engine のインスタンスが起動せず、App Engine の内部で実行するべきテストが落ちている。

なぜ起動に失敗するようになったのか調べる

本家の golang/appengine を見に行くが、何かめぼしい変更が入った様子はない。
そもそも dev_appserver.py の実行に失敗してるので dev_appserver.py を確認する。
sys.version_info[0] == 2 を見る限りどうやら python2 系が docker コンテナの中で使われなくなった模様?という仮説を立てる。

本当か?と思って本家の Docker Image で動作検証する

$ docker pull gcr.io/google.com/cloudsdktool/cloud-sdk:latest
# 古いバージョンを入れるには以下
$ docker run gcr.io/google.com/cloudsdktool/cloud-sdk:260.0.0

# docker のコンテナ内に入る
$ docker run --rm -it -v $PWD gcr.io/google.com/cloudsdktool/cloud-sdk:latest

$  python --version
Python 2.7.16    # 2.7 じゃん...
    
$ which python2.7
/usr/bin/python2.7 # 2.7 も入ってるじゃん....
   
$ which dev_appserver.py
/usr/bin/dev_appserver.py
   
$ python /usr/bin/dev_appserver.py
Traceback (most recent call last):
     File "/usr/lib/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 95, in <module>
       assert sys.version_info[0] == 2

# python 2系で dev_appserver.py が起動できなくなっている。
# エラーが発生している箇所でバージョンを出力してみる
   
$ vi /usr/lib/google-cloud-sdk/platform/google_appengine/dev_appserver.py 
# sys.version_info[0] を print(sys.version_info[0]) に書き換える
   
$ dev_appserver.py 
3 
# 3 ?! 3?!....さん?????

どうやらコンテナ内部には python2 入っているが、dev_appserver.py を起動するときには python3 系が使われるようである。(なぜ....?)

Overview で記載した差分 (https://github.com/GoogleCloudPlatform/cloud-sdk-docker/pull/188/files) において CLOUDSDK_PYTHON=python3 という環境変数が指定されている。

そのため、 dev_appserver.py では書かれていないが、コマンド実行時には環境変数で指定された python のバージョンを使うのでは?という仮説を立て、環境変数を指定してみて上記の書き換えた dev_appserver.py を再度実行する。

$ CLOUDSDK_PYTHON=python2.7 dev_appserver.py
2  
# なるほど....

うまくいった。
つまり、公式の Docker Image を使って aetest を起動するときには CLOUDSDK_PYTHON=python2.7 を指定するか、Docker のコンテナで環境変数を指定する、もしくは独自イメージを作成するなどして python2 系をコンテナ内で参照するようにする必要がある、ということがわかった。

refs

GCPUG での議論はこの辺

alias で指定して無理やり pyhon2 系を使う方法もあるっぽいけど、個人的には好きではない...