2016年12月9日金曜日

Google Cloud SDK への移行

Google App Engine(GAE)を利用していますが、いつの間にかSDKやツール・コマンドなどが変更になりました。従来の APPCFGとは全く違うので、最低限の使い方をメモ書きレベルで記事にします。
GCLOUD
結構前から、Google Cloud Platform の管理コマンドをまとめたツールが GCLOUD として配布されいます。最近まで、GUIツールも含んだ従来のGAEの管理ツール(APPCFG)も配布されていましたが、現在従来型ツールは非公開になっています。

参考: CLOUD SDK

GCLOUD は、GUIツールは無く、全てコマンドラインから操作します。その代わり従来ツールでは不可能だった、Google Cloud Platform に関する細かな管理が可能です。

Google Cloud SDK インストール
まず上記のリンクから、Google Cloud SDK をダウンロード・インストールします。ちなみに私の場合、Windwos10ではインストールが成功しましたが、MacOSでは何度試行してもインストールできませんでした。OSが二世代前の Yosemite、というのも理由かもしれません。

開発環境は MacOS の方が良いと最近言われていますが、今回、Windows10の良さを再認識できました。MacOSよりキビキビ動くし、遅ればせながら PowerShell を利用したところ、コマンドライン環境で特に不便なことは無かったです

※ 今回の記事中のコマンド例は、PowerShellの環境です。

※ MacOSでもインストールできました、手順としては以下の通りです。(追記 1/18)

  1. コンソールから次のコマンドでインストール
    curl https://sdk.cloud.google.com | bash
    
  2. インストールが成功したら、次のコマンドで初期設定を行う。
    gcloud init
    
    gcloudコマンドでのデフォルト・ユーザとデフォルト・アプリの設定を行います。
  3. この他に、
    gcloud components list
    
    コマンドでコンポーネントのリストを確認しようとすると、次のようなエラーが表示されることがあります。
    ERROR: (gcloud.components.list) Failed to fetch component listing from server.
    
    この場合は、次のコマンドで修復ができるようです。
    brew update
    brew uninstall python
    brew upgrade openssl
    brew install python --with-brewed-openssl
    
参考:
Google Compute Engine を使うための準備(Google Cloud SDK インストール - Linux & OS X 編)
Failed to fetch component listing from server
APPCFGからの移行

従来のAPPCFGからGCLOUDに移行する場合に、まずアプリの幾つかの yaml ファイルを書き換える必要があります。

  • アプリ定義(デフォルト・モジュール) - app.yaml
    プロジェクト名(application)とバージョン(version)の指定は、コメントにします。この記述があるとエラーで、アプリのデプロイができません。
    #application: myapp
    #version: 1
    

  • モジュール定義 - (例)back_job.yaml
    プロジェクト名・バージョンをコメントアウトにするのに加えて、モジュール名の項目名を、module から service に変更します。
    #application: myapp
    #module: back-job
    service: back-job
    #version: 1
    

プロジェクト名は、SDKインストール時に指定したデフォルトのプロジェクト名を使用します(変更方法は後述)。バージョンは、GCLOUD コマンドのデプロイ時に指定します。

デプロイ

GCLOUDでのアプリケーションのデプロイは、コマンド環境から次のように指定します。

gcloud app deploy app.yaml --version 1 --no-promote

アプリのフォルダ上で実行しています。ここでは、二つオープションを指定します。

--version(-v でも)
デプロイするバージョンを指定します。例では、1を指定しています。
--no-promote
このオプションを付けないと、デプロイ後直ぐにトラフィックが100%移行してしまいます。テスト&確認後バージョンを移行する場合は、Cloud Platformのバージョン管理画面から、トラフィックを移行させます。

実行例
PS C:\myapp\web2py> gcloud app deploy app.yaml --version 1 --no-promote
You are about to deploy the following services:
 - myapp/default/1 (from [C:\myapp\web2py\app.yaml])
     Deploying to URL: [https://1-dot-myapp.appspot.com]
     (add --promote if you also want to make this service available from
     [https://myapp.appspot.com])

Do you want to continue (Y/n)?  y

Beginning deployment of service [default]...
Some files were skipped. Pass `--verbosity=info` to see which ones.
You may also view the gcloud log file, found at
[C:\Users\xxx\AppData\Roaming\gcloud\logs\2016.12.08\12.03.23.383000.log].
File upload done.
Updating service [default]...done.
Deployed service [default] to [https://1-dot-myapp.appspot.com]

You can read logs from the command line by running:
  $ gcloud app logs read -s default

To view your application in the web browser run:
  $ gcloud app browse

モジュールをデプロイする場合は、下のようにモジュールの yaml ファイルを指定します。下のコマンドでは、デフォルトモジュールと back-job モジュールの、二つがデプロイされます。

gcloud app deploy app.yaml back_job.yaml --version 1 --no-promote

cron.yaml や queue.yaml 、index.yaml などを変更した場合は、次のようにデプロイを指定します。

gcloud app deploy cron.yaml queue.yaml

実行例
PS C:\myapp\web2py> gcloud app deploy cron.yaml queue.yaml
You are about to deploy the following configurations:
 - myapp/cron  (from [C:\myapp\web2py\cron.yaml])
 - myapp/queue  (from [C:\myapp\web2py\queue.yaml])
Do you want to continue (Y/n)?  y

Updating config [cron]...done.
Updating config [queue]...done.

Cron jobs have been updated.

Task queues have been updated.

The Cloud Platform Console Task Queues page has a tab that shows the tasks that are running cron jobs.

初めてデプロイするプロジェクトでは、ファイルロックのワーニングが表示される時があります。しかし何度がデプロイを実行すると、ワーニングが表示されなくなります。

ローカルのテスト環境

従来、GUIツールから起動できたローカルのテスト環境は、GCLOUDコマンドからは起動できないようです。代わりに、dev_appserver.py を利用します。

PS C:\myapp\web2py> dev_appserver.py .
パラメータとして、app.yaml があるフォルダーを指定します。現在そのフォルダーで作業している場合は、ピリオド(.)を指定します。

すると、Pythonコンソールが起動します。

INFO     2016-12-08 12:02:58,164 api_server.py:205] Starting API server at: http://localhost:53109
INFO     2016-12-08 12:02:58,187 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2016-12-08 12:02:58,204 admin_server.py:116] Starting admin server at: http://localhost:8000

アプリテストは、http://localhost:8080 で、Adminコンソールは、http://localhost:8000 でアクセスできます。

追記 2017/06/10
dev_appserver.py を終了させるには Ctrl+c を押しますが、再度起動しようとすると次のようなエラーが出る場合があります。
google.appengine.tools.devappserver2.wsgi_server.BindError: Unable to bind localhost:8080

この場合、次のコマンドを実行してみてください(macOSやLinuxなど)。
lsof -P | grep ':8080' | awk '{print $2}' | xargs kill -9

参考: Apps won't run on GAE - 'unable to bind to localhost:0'
プロジェクトの切り替え
デフォルト以外の複数のプロジェクトを利用している場合、プロジェクト毎に環境を作成し、切り替える必要があります。

新しいプロジェクトの環境は、gcloud config configurations create コマンドで作成します。

PS C:\myapp2\web2py> gcloud config configurations create myapp2
Created [myapp2].
Activated [myapp2].
「myapp2」という環境を作成すると共に、myapp2 に環境が切り替わりました。

プロジェクト名の登録は、gcloud config set project コマンドです。

PS C:\myapp2\web2py> gcloud config set project myapp2
Updated property [core/project].

アカウント情報の登録は、gcloud auth login コマンドです。

PS C:\myapp2\web2py> gcloud auth login
ブラウザ画面が開き、Googleアカントを認証します。

現在登録しているアカントと違なるアカウントを使用する場合は、次のコマンドを使用します。

gcloud config set account ACCOUNT

プロジェクトを切り替える時は、gcloud config configurations activate コマンドを使用します。

PS C:\myapp\web2py> gcloud config configurations activate default
Activated [default].
デフォルト・プロジェクトに切り替えます。

現在の環境情報を参照する場合は、gcloud config list を使用します。

PS C:\myapp\web2py> gcloud config list
Your active configuration is: [default]

[compute]
region = us-central1
zone = us-central1-f
[core]
account = xxxx@gmail.com
disable_usage_reporting = False
project = myapp

環境の一覧は、gcloud config configurations list を使用します。

PS C:\myapp\web2py> gcloud config configurations list
NAME         IS_ACTIVE  ACCOUNT              PROJECT      DEFAULT_ZONE   DEFAULT_REGION
default      True       xxxx@gmail.com       myapp        us-central1-f  us-central1
myapp2       False      xxxx@gmail.com       myapp2
その他

他にも様々なコマンドが用意されています。例えば、次のようなコマンドがあります。

  • インスタンスの一覧を表示
    gcloud app instances list
    

  • モジュール一覧を表示
    gcloud app services list
    

  • アプリをブラウザで表示
    gcloud app browse
    
    次のようにオプションも指定できます。
    --service(-s)
    サービス(モジュール)名を指定
    --version(-v)
    バージョンを指定
  • SDKコンポーネントのアップデート
    gcloud components update
    
    アップデートは指示が表示されますので、そのタイミングで実行すれば良いです。

などなどです。


参考:
Google Cloud SDK ドキュメント
Google App Engine Python Standard Environment ドキュメント
ハンズオン : Google Cloud SDK 基本と認証
gcloud confing configurations コマンドでconfig設定を切り替える